网络延迟是衡量链路质量最直观的指标,无论是排查办公网出口抖动,还是评估跨机房专线质量,都离不开持续的延迟数据采集。Smokeping正是为这个场景而生的工具,它通过定期向目标发送探测包,把每次的往返延迟记录到RRD数据库中,再绘制成带丢包着色的时序图,让延迟波动和丢包趋势一目了然。这篇文章从原理讲到配置,再到常见问题排查,帮你完整地搭起一套延迟监控体系。

Smokeping的工作原理是什么
Smokeping的核心思路其实不复杂:由一个调度进程按照固定间隔向目标地址发送探测包,把每一轮探测的结果交给RRDtool存储,然后由CGI或者静态页面渲染成图表。它默认的探测工具是fping,一轮探测中会对同一个目标连续发送若干个包(默认20个),这样得到的不只是一个延迟值,而是一组延迟分布数据。
这个分布数据非常有价值。Smokeping的图表上每一个点都有颜色深浅不一的灰色阴影,阴影的厚度反映了这20个探测包延迟的抖动程度:如果阴影很薄,说明各包延迟接近,链路稳定;如果阴影拉得很开,说明延迟抖动剧烈,即使平均值看起来正常,用户体验也会很差。这种对抖动的可视化是普通ping加图形化工具很难做到的。
数据的另一部分是丢包。探测包没有收到回应时会被记录为丢包,图表上对应时间点的颜色会从灰色逐渐加深到红色,颜色越红代表丢包率越高。结合延迟和丢包两个维度,运维人员能快速判断链路是偶发抖动还是持续性劣化。
安装Smokeping的完整步骤
以CentOS 7为例,推荐使用epel源直接安装编译好的包,省去手动编译依赖的麻烦。先安装epel-release,再通过yum安装smokeping,系统会自动带上rrdtool和fping这两个关键依赖。
# 安装epel源 yum install -y epel-release # 安装smokeping及依赖 yum install -y smokeping fping rrdtool # 确认fping可用 fping -c 3 www.baidu.com
安装完成后,主配文件位于/etc/smokeping/config,网页文件默认由Apache承载,数据文件存放在/var/lib/smokeping目录下。如果用Nginx替代Apache,则需要自己配置FastCGI来运行smokeping.cgi脚本。
对于Debian或Ubuntu系统,直接执行apt install smokeping即可,注意安装完成后需要手动编辑/etc/smokeping/config.d/目录下的多个分散配置文件,它的配置结构与CentOS的单一config文件略有差别,但字段含义完全一致。
config文件怎么写才算规范
config文件由多个区块组成,顺序很重要,Smokeping要求General、Probe、Targets等区块按层级排列。先看一个最小可用的完整示例。
*** General *** owner = 运维监控组 contact = ops@ippipp.com改成你的邮箱 mailhost = 127.0.0.1 sendmail = /usr/sbin/sendmail imgcache = /var/lib/smokeping/images imgurl = ../../smokeping-images datadir = /var/lib/smokeping/rrd piddir = /var/run/smokeping cgiurl = http://192.168.0.1/smokeping/smokeping.cgi syslogfacility = local0 *** Database *** step = 300 pings = 20 *** Presentation *** template = /etc/smokeping/basepage.html *** Targets *** probe = FPing menu = Top title = 网络延迟监控 + 办公网 menu = 办公网出口 title = 办公网出口链路 ++ 网关 host = 192.168.1.1 ++ 公网DNS host = 223.5.5.5 + 机房间专线 menu = 专线监控 title = 机房互联专线 host = 10.0.0.2
几个字段需要特别理解。step = 300表示每300秒执行一轮探测,pings = 20表示每轮对每个目标发20个包。这两个值决定了数据粒度,step设得太小会增加服务器和链路负担,一般监控公网目标用300秒比较稳妥,监控核心内网链路可以缩到60秒。
Targets部分用加号数量表示层级,一个加号是一级菜单,两个加号是二级子菜单,host必须写在最末级的叶子节点上。如果一个节点下有多个host要批量监控,可以用host = 目标地址配合hostfile方式从文件读取,避免逐条手写。
告警配置与告警邮件怎么设置
光看图表是事后分析,要第一时间感知链路劣化还得配告警。告警在*** Alerts ***区块定义,语法是规则名 = 条件类型,判定表达式,说明。
*** Alerts *** to = ops@ipipp.com from = smokeping@ipipp.com +bigloss type = loss pattern = ==0%,==0%,>=25%,>=25% comment = 连续两轮丢包超过25%,疑似链路故障 +hostdown type = loss pattern = ==100% comment = 目标完全不可达 +latencyhigh type = rtt pattern = >=0,==U editin = 0 comment = 延迟异常升高
pattern中的每个逗号分隔项代表一轮探测的结果,从左到右按时间顺序排列。==0%,==0%,>=25%,>=25%的含义是前两轮丢包为零,随后两轮丢包都超过25%,也就是突然出现持续丢包才触发,避免偶发丢包引起误报。判定延迟用rt类型,表达式写延迟毫秒数,==U表示数据缺失即不可达。
发送邮件依赖sendmail或msmtp,如果本机没有邮件服务,最简单的办法是安装msmtp并伪装成sendmail路径,把sendmail参数指向msmtp的二进制,同时在msmtp配置里写清外部SMTP服务器的账号密码。发不出去时优先查看/var/log/messages中smokeping进程的输出。
常见问题与注意事项
第一个高频问题是图表报错ERROR: Could not parse line,多半是config文件里中英文标点混用,比如把英文等号写成了中文等号,或者Targets的层级符号使用了全角加号。建议写完配置后先执行smokeping --check --config=/etc/smokeping/config做语法校验,通过后再重启服务。
第二个是中文乱码。图表上的中文标题显示成方块,是因为RRDtool找不到中文字体。解决办法是在*** Presentation ***下指定中文字体文件的完整路径,例如font = /usr/share/fonts/chinese/simsun.ttc,CentOS上可以先安装wqy字体包再把路径指向文泉驿的ttc文件。
第三个是主从模式下数据不同步。Smokeping支持master/slave架构,slave从master拉取目标配置、本地探测后把结果回传。如果slave图表缺失,检查master配置中secrets密码文件权限必须为600,且slave节点需要写slave-name对应的目标区段,网络层面还要确保slave能访问master的CGI地址。
最后要提醒探测目标的选择原则:监控公网质量时尽量选稳定的服务地址,比如运营商DNS;不要把同时运行ICMP限速的设备作为目标,否则会误判为丢包。另外,若服务器上还有其他基于ICMP的监控工具,注意fping与它们并发时可能触发目标端限速,适当加大step间隔可以缓解。定期检查/var/lib/smokeping/rrd目录体积,RRD文件是固定大小的,一般不用担心膨胀,但目标数量上千时图表页面会变慢,建议按业务分多个实例部署。
Smokeping配置网络延迟监控Linux运维监控修改时间:2026-09-14 13:05:07