记录一次排查cpu飙高的问题

过程

今天发现一个集群里的某一台机器CPU涨了很多。如图:
paradin

爬到容器里,top -Hp 对应的PID看了一下,里面是很多个线程都CPU很高:
paradin

跑到宿主机里一看,整个宿主机cpu和load都有上涨:
paradin

从宿主机的监控看,这个容器的cpi也上涨:
paradin

同时发现这个容器的younggc频率没变化,但是gc耗时比以前明显多了很多:
paradin

由于频率没变化,但是耗时上涨,我怀疑可能是内存出了问题,导致现在每一次gc的时候更加消耗cpu了,于是sudo dmesg -T |grep -i "Hardware Error",果然容器在对应的时刻附近有内存硬件的报警:
paradin

于是将这个容器进行了置换,置换后的ip再看CPU和load都恢复了正常。

心得

其实一个集群里某一个机器出了问题,是比较难查的。因为那么多机器没问题,唯独你有问题,那么就要想哪些地方是这个机器跟其他同集群里机器不同。可以从以下几个方面排查解决:

  1. 这个机器遇到了一个很特殊的参数,比如我们曾经见过一个很奇葩的商品,里面好几万的sku和子品。唯独流量走到了这个机器上,当这个应用的逻辑处理的时候,暴露了逻辑上问题,所以要结合时间去业务的日志里查。
  2. 容器的底层出了问题,看看网络重传率,对比宿主机其他的容器系统情况,使用dmesg定位,然后需要宿主机的同学进一步配合排查。如果容器进行置换之后,问题解决更可以说明是宿主机的问题。
  3. 可以跟其他的机器进行对比:对比线程使用cpu的细节,对比内存里都存了啥,对比流量是不是跟其他容器的流量有不同,但是这种有点大海捞针,比较费时间。
感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------