过程
今天发现一个集群里的某一台机器CPU涨了很多。如图:
爬到容器里,top -Hp 对应的PID
看了一下,里面是很多个线程都CPU很高:
跑到宿主机里一看,整个宿主机cpu和load都有上涨:
从宿主机的监控看,这个容器的cpi也上涨:
同时发现这个容器的younggc频率没变化,但是gc耗时比以前明显多了很多:
由于频率没变化,但是耗时上涨,我怀疑可能是内存出了问题,导致现在每一次gc的时候更加消耗cpu了,于是sudo dmesg -T |grep -i "Hardware Error"
,果然容器在对应的时刻附近有内存硬件的报警:
于是将这个容器进行了置换,置换后的ip再看CPU和load都恢复了正常。
心得
其实一个集群里某一个机器出了问题,是比较难查的。因为那么多机器没问题,唯独你有问题,那么就要想哪些地方是这个机器跟其他同集群里机器不同。可以从以下几个方面排查解决:
- 这个机器遇到了一个很特殊的参数,比如我们曾经见过一个很奇葩的商品,里面好几万的sku和子品。唯独流量走到了这个机器上,当这个应用的逻辑处理的时候,暴露了逻辑上问题,所以要结合时间去业务的日志里查。
- 容器的底层出了问题,看看网络重传率,对比宿主机其他的容器系统情况,使用dmesg定位,然后需要宿主机的同学进一步配合排查。如果容器进行置换之后,问题解决更可以说明是宿主机的问题。
- 可以跟其他的机器进行对比:对比线程使用cpu的细节,对比内存里都存了啥,对比流量是不是跟其他容器的流量有不同,但是这种有点大海捞针,比较费时间。