公众号旧文
我用2元/月的服务器,写了一个 QoS 监控
很多人都有这样的经历:
晚上打游戏突然卡了一下, 远程服务器偶尔抽风, 或者网页加载忽快忽慢。
但你很难判断:
- 是你本地网络的问题?
- 是服务器的问题?
- 还是中间链路在抽风?
大多数时候,我们只能靠感觉。
于是我用一台2元/月、256MB 内存的服务器,自己做了一个网络监控。
一、核心思路非常简单
这个系统的原理,可以用一句话讲清楚:
每隔一分钟,从服务器 ping 一下我的家宽出口 IP,把延迟记录下来,然后画成图。
就这么简单。
没有数据库,没有复杂架构,也没有用任何现成的监控系统。
二、后端:只有几十行 Python
我用了一段非常朴素的 Python 脚本:
import
subprocess
import
time
import
csv
from
datetime
import
datetime
TARGET =
"111.164.192.1"
INTERVAL =
60
with
open
(
"ping_log.csv"
,
"a"
, newline=
""
)
as
f:
writer = csv.writer(f)
while
True
:
now = datetime.now().strftime(
"%H:%M:%S"
)
try
:
result = subprocess.run(
[
"ping"
,
"-c"
,
"1"
,
"-W"
,
"1"
, TARGET],
stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL,
timeout=
2
)
output = result.stdout.decode()
latency =
None
for
line
in
output.split(
"\n"
):
if
"time="
in
line:
latency =
float
(line.split(
"time="
)[
1
].split()[
0
])
except
:
latency =
None
writer.writerow([now, latency])
f.flush()
time.sleep(INTERVAL)
这段代码做的事情非常直接:
- 每分钟执行一次
ping - 提取延迟(time=xx ms)
- 写入 CSV 文件
最终数据长这样:
04
:
01
:
00
,
23
.
5
04
:
02
:
00
,
21
.
8
04
:
03
:
00
,
04
:
04
:
00
,
25
.
1
其中:
- 有数值 → 正常延迟
- 空值 → 丢包
三、为什么我没有用数据库?
因为完全没必要。
一分钟一条数据,一天也就 1440 条, 用 CSV 足够了,而且有几个好处:
- 几乎不占资源
- 不需要额外服务
- 前端可以直接读取
对于一台 256MB 内存 / 1GB 硬盘 的机器来说,这种方案非常友好。
四、前端:才是这个项目最有意思的地方
我用的是 Chart.js 来画图。
但这里有两个比较好玩的设计。
1️⃣ 没有日期,怎么处理时间?
后端只记录了:
04:01:00
04:02:00
没有日期。
那前端怎么办?
我的做法是:如果时间“变小了”,就认为跨天了。
例如:
23
:
59
:
00
00
:
00
:
00
← 时间突然变小 → 新的一天
通过这个规则,前端可以自动补全日期。
2️⃣ 丢包怎么可视化?
在图表里:
- 正常延迟 → 蓝色线
- 丢包 → 红点
- 丢包区间 → 红色连接线
实现方式其实很巧妙:
- 把丢包数据设为
null - 再根据前后点是否为
null,动态改变线段颜色
于是你能看到这样的效果:
一旦出现丢包,整段线路会变红
这比单纯画一个点直观得多。
五、实际效果
最终页面是一个实时刷新的折线图:

- 横轴:时间(自动转为北京时间)
- 纵轴:延迟(ms)
- 蓝线:正常延迟
- 红点 / 红线:丢包
你可以一眼看出:
- 延迟是否稳定
- 有没有抖动
- 哪些时间段出现了丢包
六、这台服务器到底有多弱?
配置是这样的:
- 1 核 CPU
- 256MB 内存
- 1GB 硬盘
- 3Mbps 带宽
但即便如此,这套系统:
- CPU 占用接近 0
- 内存占用几乎忽略
- 磁盘写入也非常轻量
可以说是毫无压力。
七、一些有意思的观察
有了这个图之后,你会发现很多以前“模糊的感觉”,突然变得很具体:
- 有些卡顿,其实是短暂丢包
- 有些“慢”,其实是延迟抖动
- 有些时间段网络明显更差
这些现象,以前你只能猜,现在可以直接看到。
你可能感兴趣的其他文章: