总流程
1、查看docker的cpu占用率:docker stats
2、进入cpu占用高的docker容器:docker exec -it 容器编号 /bin/bash
3、查看容器中具体进程cpu占用率,执行top,(如top命令无法使用,执行:export TERM=dumb ,然后在执行:top)
4、查看进程中线程cpu占用率:top -H -p 进程号
5、将异常线程号转化为16进制: printf “%x\n” 线程号
6、查看线程异常的日志信息:jstack 进程号|grep 16进制异常线程号 -A90
分解:
步骤123跳过,看步骤4的执行结果
29,30,31三个线程是疯狂回收内存,导致持续高占用CPU。
现在要想知道具体哪个线程导致了内存的爆满,按上面网友提供的思路,已经断了,所以步骤5,6直接跳过,如果是非内存回收导致的CPU飙高可以继续走步骤5,6来排查。
继续观察线程变动,注意到有一个idle_connection的command也在不间断占用40-50%的CPU(截图省略),判断是数据库连接超时导致进入死循环,我这线上环境使用阿里云ecs+阿里云rds数据库,重启容器后恢复正常,idle_connection的线程也消失了,到目前为止粗略判断是超时问题导致,目前下的结论还需要持续观察判断,有结论及时更新