当前位置: > Linux服务器 > 监控工具 >

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)
------分隔线----------------------------