在zabbix生产中会发现net.tcp.listen这个指标偶尔会报错, 但观察服务器后发现,实际有进程监听在端口上,这些都是误报 观察源代码,发现zabbix是如何实现监控端口的呢? 代码在 zabbix-2.0.5/src/libs/zbxsysinfo/linux/net.c
?
也就是说,zabbix监控的原理是读取/proc/net/tcp这个文件,从中获取监听的那条记录。 但为什么读取这个文件会有时候找不到实际监听的端口呢? https://support.zabbix.com/browse/ZBX-6790 看了这篇文章后,发现是内核会频繁的写这个文件,导致读取不正常,同时还看到一篇文章, http://stackoverflow.com/questions/5713451/is-it-safe-to-parse-a-proc-file 讨论读取/proc下的内容是否安全。结论是不安全。 解决方案是在zabbix下配置一条自定义的监控项,取代默认的项: UserParameter=net.tcp.listen.grep[*],grep -q $$(printf '%04X.00000000:0000.0A' $1) /proc/net/tcp && echo 1 || echo 0 这个shell写的很漂亮。 |