zabbix agent cpu占用100%排查.md
发现问题
运维同学发现某几台机器zabbix agent占用了cpu达到了100%,如下图。
初步分析和猜测
因该服务器TCP连接数过多,超过10万,高峰期可达20万。ss统计数据如下
[root@ipcpu~]# ss -s
Total: 102655 (kernel 102753)
TCP: 104428 (estab 102588, closed 30, orphaned 1797, synrecv 0, timewait 30/0), ports 45
Transport Total IP IPv6
* 102753 - -
RAW 0 0 0
UDP 3 3 0
TCP 104398 104398 0
INET 104401 104401 0
FRAG 0 0 0
因此首先怀疑使用了netstat来统计TCP连接信息,ps aux 查不到netstat,经排查配置文件,netstat都已经换成了ss,问题不是netstat引起的。(之前出过问题,换过一次)
starce分析、初步定位
[root@ipcpu~]# strace -c -p 20415
Process 20415 attached - interrupt to quit
^CProcess 20415 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 19.096967 5257 3633 read
0.00 0.000067 67 1 open
0.00 0.000000 0 3 write
0.00 0.000000 0 2 close
0.00 0.000000 0 2 alarm
0.00 0.000000 0 1 socket
0.00 0.000000 0 1 connect
0.00 0.000000 0 1 fcntl
0.00 0.000000 0 2 gettimeofday
0.00 0.000000 0 2 clock_gettime
------ ----------- ----------- --------- --------- ----------------
100.00 19.097034 3648 total
#@由此看出,这个进程主要消耗在read文件上了,所以我们看看他到底在读哪个文件
[root@ipcpu~]# strace -T -e trace=file -p 20415
Process 20415 attached - interrupt to quit
open("/proc/net/tcp", O_RDONLY) = 5 <0.000069>
--- SIGCHLD (Child exited) @ 0 (0) ---
--- SIGCHLD (Child exited) @ 0 (0) ---
--- SIGCHLD (Child exited) @ 0 (0) ---
--- SIGCHLD (Child exited) @ 0 (0) ---
open"/proc/meminfo", O_RDONLY) = 5 <0.000030>open("/proc/meminfo", O_RDONLY) = 5 <0.000041>
--- SIGCHLD (Child exited) @ 0 (0) ---
open("/proc/net/dev", O_RDONLY) = 5 <0.000049>
open("/proc/net/dev", O_RDONLY) = 5 <0.000036>
open("/proc/net/tcp", O_RDONLY) = 5 <0.000038>
open("/proc/net/tcp", O_RDONLY) = 5 <0.000075>
经过strace分析,我们发现zabbix agent会读取/proc/net/tcp,这里面可是有十几万的连接信息呢。
最终定位
到底是zabbix的哪一个item因起的读取/proc/net/tcp文件呢?
这个还真不好找,好在服务器上和网络相关的item选项不多,TCP连接数监控(ss实现)、TCP端口监控(net.tcp.listen)。
我们分别停止这两组监控,重启zabbix,最后发现,只要开启TCP端口监控(net.tcp.listen)就会出现cpu 100%的情况。终于找到了。
终于定位到问题,和发现问题的同事说明下,他又反馈了另一个情况:同一个集群,都是10W以上的ESTAB,有的有问题,有的没问题。
赶快看一下zabbix版本,发现有问题的都是2.x版本,3.x的都没问题。
[root@ipcpu~]# /data/apps/zabbix/sbin/zabbix_agentd -V
Zabbix Agent (daemon) v2.4.8 (revision 59539) (20 April 2016)
Compilation time: Feb 13 2017 13:40:44
通过官网查看net.tcp.listen的说明,果然从3.0起,优先使用内核netlink获取数据。
查了一大通还是没搞清楚netlink是什么,但是这么做效率肯定是有提升的,至少cpu不再100%了。
最终解决
zabbix升级到3.x
参考资料
https://www.zabbix.com/documentation/3.0/manual/config/items/itemtypes/zabbix_agent
http://xiaobaoqiu.github.io/blog/2016/02/03/strace/
转载请注明:IPCPU-网络之路 » zabbix agent cpu占用100%排查