最近经常有人反馈业务时不时抽风,但监控大盘一片绿灯——CPU、内存、接口成功率都正常,就是偶尔抽一下,找不到原因.
最怕的不是一直坏,是它"抽一下就好了",你永远抓不到现场.
为什么监控没报警
我们排查了一圈代码、数据库、上游接口都没问题,最后怀疑是网络偶尔抖了一下.可这正是监控的传统难题:平台看的是聚合指标,延迟阈值设到 1 秒,偶发的几百毫秒抖动、持续不到半分钟的瞬断,被平均值和阈值一起吞掉,根本不会报警.
平均延迟 50ms,可你卡的那一下是 3000ms——平均值根本不会替你喊疼.
我试过的、跑不通的"正经"方案
在动手写土脚本之前,正经路子我一条没少走:
- 指望监控大盘. 阈值 1 秒,抖动没到 1 秒不报警.等它真报警,那是彻底挂了,不是抖动了.
- 在业务代码里埋点记网络耗时. 改了,上线了,结果抖动发生在业务调用之前——连接都没建起来,埋点根本没触发.
- 上专业 APM / 网络探测工具. 运维同学拍板说好,但要走采购、申请机器、过审批.等流程跑完,这周又抽了两次.
正经方案都在路上,抖动不会等.于是土办法上场.
我的土办法:让业务机一直 ping 着,并钉上时间戳
目标简单粗暴:让业务主机一直 ping 着它要连的那台机器,把每次的延迟和丢包,连同精确到秒的时间,一五一十写进本地日志. 抖动发生的那一秒,日志里必须有,而且我能反查出"几点几分".
为什么是 ping 而不是别的?它不依赖业务代码,不依赖对方主机配合,只要网络通就能跑.业务连接挂没挂,ping 先知道.
步骤 1:最原始的一版
我直接 SSH 上去敲了 ping 172.xx.xx.9.屏幕哗哗滚,time=0.4ms,time=0.4ms,看着挺健康.可一关终端,全没了.而且它不带时间——半夜两点那一抽,我怎么知道是 2:03 还是 2:15?
步骤 2:给每行钉上时间戳
ping 自己不带时间,得借 awk 的手.一行搞定:
Bashping 172.xx.xx.9 -i 30 | awk '{ print $0"\t" strftime("%H:%M:%S",systime()) }'
这下每行末尾都钉了个时间戳.-i 30 是每 30 秒 ping 一次,别 ping 太猛,不然自己先把自己打成 DoS 了.
步骤 3:落盘,别让控制台一关就没
控制台输出一关终端就丢,得写进文件:
Bashping 172.xx.xx.9 -i 30 | awk '{ print $0"\t" strftime("%H:%M:%S",systime()) }' > ping.log
想累加上去不清空,把 > 换成 >> ping.log.
步骤 4:平时干净,只捞异常
抖动不可怕,可怕的是淹没在正常输出里.先让 awk 加时间戳,再用 grep 把延迟偏高的行挑出来:
Bashping 172.xx.xx.9 | awk '{ print $0"\t" strftime("%H:%M:%S",systime()) }' | grep -e 'time=[1-9].*'
平时日志很干净,只有延迟上去了才冒出来.
老实说,这个正则
time=[1-9].*筛的是"延迟 ≥ 1ms"的行.在局域网里正常 ping 普遍是 0.x ms,所以它恰好能把 spike 留下来;但如果是跨公网、正常就有 20ms,那这正则等于没筛.真要盯高延迟,得按你自己的阈值改,或者换成awk解析数字判断——别照抄.
步骤 5:让它在那自己跑
末尾加个 & 丢后台,或者更靠谱地,用 systemd-run 起个临时 unit,日志交给 journald:
Bashsystemd-run --unit ping-probe --slice ping /usr/bin/ping 172.xx.xx.9 journalctl -u ping-probe > ping.log
也有人用 cron 每 5 分钟跑一批 ping -c 10 写进日志,都行,看你怎么省事.
第二天,它真的抓到了
上线这个土脚本的第二天,日志里清清楚楚一行:
txt64 bytes from 172.xx.xx.9: icmp_seq=110 ttl=62 time=3469 ms 18:23:59
平时都是 0.4ms,那一瞬间飙到 3.4 秒,还连续丢了 4 个包.
根因不是代码,是那条链路在抽风.可如果没这个时间戳,我连"该去查哪个时间点"都不知道.
泼个冷水:这也不是万能的
说清楚局限:
- 它只测到 ICMP 这一层. 有些机房对 ICMP 限速或禁 ping,你看到的延迟不是 TCP 业务的真实延迟.我有次就遇到目标机禁 ping,日志全是 100% packet loss,吓一跳,结果是防火墙.
- 时间戳是业务机本地时间. 那台机器时钟没校准(NTP 没跑),你记的时间和网络同事那边的日志对不上。
- 它发现不了"应用层慢". 数据库查询卡了 2 秒,ping 照样 0.4ms 绿油油.这脚本只管网络这一亩三分地.
- 别把这个 ping 的进程给忘了. 它一直悄无声息在后台跑,一天
-i 30才几 MB 看着不多,可日积月累下来也相当可观。
写在最后
回过头看这事荒唐又好笑——我们有一堆高大上的监控平台,却靠一行 awk 加时间戳的老土办法,才逮住那个躲猫猫的抖动.
监控看的是"平均的健康",而问题永远藏在"某一秒的异常"里.工具再花哨,抓不到那一秒,就等于没抓.
