最新消息:

zabbix agent cpu占用100%排查

Linux ipcpu 1403浏览

zabbix agent cpu占用100%排查.md

发现问题

运维同学发现某几台机器zabbix agent占用了cpu达到了100%,如下图。

初步分析和猜测

因该服务器TCP连接数过多,超过10万,高峰期可达20万。ss统计数据如下

  1. [root@ipcpu~]# ss -s
  2. Total: 102655 (kernel 102753)
  3. TCP: 104428 (estab 102588, closed 30, orphaned 1797, synrecv 0, timewait 30/0), ports 45
  4. Transport Total IP IPv6
  5. * 102753 - -
  6. RAW 0 0 0
  7. UDP 3 3 0
  8. TCP 104398 104398 0
  9. INET 104401 104401 0
  10. FRAG 0 0 0

因此首先怀疑使用了netstat来统计TCP连接信息,ps aux 查不到netstat,经排查配置文件,netstat都已经换成了ss,问题不是netstat引起的。(之前出过问题,换过一次)

starce分析、初步定位

  1. [root@ipcpu~]# strace -c -p 20415
  2. Process 20415 attached - interrupt to quit
  3. ^CProcess 20415 detached
  4. % time seconds usecs/call calls errors syscall
  5. ------ ----------- ----------- --------- --------- ----------------
  6. 100.00 19.096967 5257 3633 read
  7. 0.00 0.000067 67 1 open
  8. 0.00 0.000000 0 3 write
  9. 0.00 0.000000 0 2 close
  10. 0.00 0.000000 0 2 alarm
  11. 0.00 0.000000 0 1 socket
  12. 0.00 0.000000 0 1 connect
  13. 0.00 0.000000 0 1 fcntl
  14. 0.00 0.000000 0 2 gettimeofday
  15. 0.00 0.000000 0 2 clock_gettime
  16. ------ ----------- ----------- --------- --------- ----------------
  17. 100.00 19.097034 3648 total
  18. #@由此看出,这个进程主要消耗在read文件上了,所以我们看看他到底在读哪个文件
  19. [root@ipcpu~]# strace -T -e trace=file -p 20415
  20. Process 20415 attached - interrupt to quit
  21. open("/proc/net/tcp", O_RDONLY) = 5 <0.000069>
  22. --- SIGCHLD (Child exited) @ 0 (0) ---
  23. --- SIGCHLD (Child exited) @ 0 (0) ---
  24. --- SIGCHLD (Child exited) @ 0 (0) ---
  25. --- SIGCHLD (Child exited) @ 0 (0) ---
  26. open("/proc/meminfo", O_RDONLY) = 5 <0.000030>
  27. open("/proc/meminfo", O_RDONLY) = 5 <0.000041>
  28. --- SIGCHLD (Child exited) @ 0 (0) ---
  29. open("/proc/net/dev", O_RDONLY) = 5 <0.000049>
  30. open("/proc/net/dev", O_RDONLY) = 5 <0.000036>
  31. open("/proc/net/tcp", O_RDONLY) = 5 <0.000038>
  32. 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的都没问题。

  1. [root@ipcpu~]# /data/apps/zabbix/sbin/zabbix_agentd -V
  2. Zabbix Agent (daemon) v2.4.8 (revision 59539) (20 April 2016)
  3. 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%排查