做后端开发同学,或多或少都遇到过CPU负载高的问题

如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载?

找到最耗CPU的进程

top

方法:

  • 执行top -c,显示进程运行信息列表
  • 键入P(大写p),进程按照CPU使用率排序

找到最耗CPU的线程

top

方法:

  • top -Hp 10681,显示一个进程的线程运行信息列表
  • 键入P(大写p),线程按照CPU使用率排序

将线程PID转化为16进制

printf

方法:printf “0x%x\n” 10681

10681对应的16进制是0x29b9n,当然,这一步可以用计算器。

之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。

查看堆栈,找到线程在干嘛

pstack/jstack/grep

方法:jstack 10681 | grep ‘0x29b9n’ -C5 --color

  • 打印进程堆栈
  • 通过线程id,过滤得到线程堆栈

工具推荐

useful-scripts