zabbix的net.tcp.listen不准确问题
时间:2014-12-03 18:04 来源:linux.it.net.cn 作者:IT
在zabbix生产中会发现net.tcp.listen这个指标偶尔会报错,
但观察服务器后发现,实际有进程监听在端口上,这些都是误报
观察源代码,发现zabbix是如何实现监控端口的呢?
代码在
zabbix-2.0.5/src/libs/zbxsysinfo/linux/net.c
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (NULL != (f = fopen("/proc/net/tcp", "r")))
{
zbx_snprintf(pattern, sizeof(pattern), "%04X 00000000:0000 0A", (unsigned int)port);
while (NULL != fgets(tmp, sizeof(tmp), f))
{
if (NULL != strstr(tmp, pattern))
{
listen = 1;
break;
}
}
zbx_fclose(f);
ret = SYSINFO_RET_OK;
}
也就是说,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写的很漂亮。
(责任编辑:IT)
在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写的很漂亮。 |