使用 ping 命令带时间戳并记录日志:排查监控难以发现的网络抖动

发布于 •阅读 27 次•系统•

最近经常有人反馈业务时不时抽风,但监控大盘一片绿灯——CPU、内存、接口成功率都正常,就是偶尔抽一下,找不到原因.

最怕的不是一直坏,是它"抽一下就好了",你永远抓不到现场.

为什么监控没报警

我们排查了一圈代码、数据库、上游接口都没问题,最后怀疑是网络偶尔抖了一下.可这正是监控的传统难题:平台看的是聚合指标,延迟阈值设到 1 秒,偶发的几百毫秒抖动、持续不到半分钟的瞬断,被平均值和阈值一起吞掉,根本不会报警.

平均延迟 50ms,可你卡的那一下是 3000ms——平均值根本不会替你喊疼.

我试过的、跑不通的"正经"方案

在动手写土脚本之前,正经路子我一条没少走:

  1. 指望监控大盘. 阈值 1 秒,抖动没到 1 秒不报警.等它真报警,那是彻底挂了,不是抖动了.
  2. 在业务代码里埋点记网络耗时. 改了,上线了,结果抖动发生在业务调用之前——连接都没建起来,埋点根本没触发.
  3. 上专业 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 的手.一行搞定:

Bash
ping 172.xx.xx.9 -i 30 | awk '{ print $0"\t" strftime("%H:%M:%S",systime()) }'

这下每行末尾都钉了个时间戳.-i 30 是每 30 秒 ping 一次,别 ping 太猛,不然自己先把自己打成 DoS 了.

步骤 3:落盘,别让控制台一关就没

控制台输出一关终端就丢,得写进文件:

Bash
ping 172.xx.xx.9 -i 30 | awk '{ print $0"\t" strftime("%H:%M:%S",systime()) }' > ping.log

想累加上去不清空,把 > 换成 >> ping.log.

步骤 4:平时干净,只捞异常

抖动不可怕,可怕的是淹没在正常输出里.先让 awk 加时间戳,再用 grep 把延迟偏高的行挑出来:

Bash
ping 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:

Bash
systemd-run --unit ping-probe --slice ping /usr/bin/ping 172.xx.xx.9
journalctl -u ping-probe > ping.log

也有人用 cron 每 5 分钟跑一批 ping -c 10 写进日志,都行,看你怎么省事.

第二天,它真的抓到了

上线这个土脚本的第二天,日志里清清楚楚一行:

txt
64 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 加时间戳的老土办法,才逮住那个躲猫猫的抖动.

监控看的是"平均的健康",而问题永远藏在"某一秒的异常"里.工具再花哨,抓不到那一秒,就等于没抓.

评论 (0)
0 / 500
暂无评论,快来抢沙发~