公众号旧文

我用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
  • 内存占用几乎忽略
  • 磁盘写入也非常轻量

可以说是毫无压力。

七、一些有意思的观察

有了这个图之后,你会发现很多以前“模糊的感觉”,突然变得很具体:

  • 有些卡顿,其实是短暂丢包
  • 有些“慢”,其实是延迟抖动
  • 有些时间段网络明显更差

这些现象,以前你只能猜,现在可以直接看到。


你可能感兴趣的其他文章:

为什么 SecureCRT 和服务器的连接总是断开?

为什么我敢随便Kill进程?

如果你也想有一台自己的服务器,请看过来。

为什么 Linux 里很多程序后面都带一个 d?