前言
经常做后端服务开发的同学,或多或少都遇到过 CPU 负载特别高的问题。尤其是在周末或大半夜,突然群里有人反馈线上机器负载特别高,不熟悉定位流程和思路的同学可能登上服务器一通手忙脚乱,定位过程百转千回。
对此,也有不少同学曾经整理过相关流程或方法论,类似把大象放进冰箱要几步,传统的方案一般是4步:
1、 top
查看占用CPU资源最高的进程
top
2、 查看进程中,占用CPU资源最高的线程PID
top -Hp 进程PID
3、 十进制线程ID转十六进制线程ID
printf "0x%x\n" 线程PID
4、查看Java进程内的占用CPU资源最高的线程堆栈信息
jstack 进程PID | vim +/十六进制线程PID -
注意结尾的
-
不要漏!
top
top 程序提供运行系统的动态实时视图。它可以显示系统摘要信息以及当前由Linux内核管理的 进程 或 线程 的列表。
因此,个人理解
top
可以帮助我们观察 进程 或者 线程 占用的 CPU,内存资源的情况。通过man top
指令可以查看更多关于 top 的简介。
-H 参数: 指示top
程序显示各个线程。如果没有此命令行选项,则显示每个进程中所有线程的总和。
-p 参数: 仅监视具有指定进程ID的进程。
top -p 进程PID
或者top -p进程PID
都是合法的。-p
可以和进程PID之间空一个空格,也可以不加空格。top -p进程PID -H
和top -H -p进程PID
与top -Hp 进程PID
是等效的。区别就是将 top 命令的参数合并在一起还是将参数分开。
printf
printf 是C语言中常用的输出函数。
%x
以十六进制的形式输出。
命令 | 输出 | 备注 |
---|---|---|
printf "%x" 31 | 1f | 字母小写 |
printf "%X" 31 | 1F | 字母大写 |
printf "%#x" 31 | 0x1f | 字母小写,并以0x为前缀 |
printf "%#X" 31 | 0X1F | 字母大写,并以0X为前缀 |
jstack
通过
jstack -help
可以查看 jstack 的用法和参数。
jstack
主要用来查看某个Java进程内的线程堆栈信息。
最常用的语法格式:
jstack [option] <pid>
如果会打印出额外的锁信息,在发生死锁时可以用 jstack -l
jstack -l <pid>
管道符 |
利用管道符|
:可将一个命令的 stdout 重定向成为另外一个命令的 stdin。
vim
通过
vim -help
可以查看更多关于 vim 参数的介绍。
上面这张图解释了为什么在 jstack 进程PID | vim +/十六进制线程PID -
组合命令中一定要在结尾加上 -
!!
因为 jstack 命令的内容本来是 stdout,现在通过管道符
|
重定向作为 vim 命令的 stdin。如果不加-
,那就没有输入了。
vim +/string -
: 从标准输入(stdin)读取文本,并将光标停留在第一个找到的string上。
参考文档
老公,人家线上服务CPU 100%了,肿么办嘛 跳转 click here
printf
用法大全,C语言printf格式控制符一览表 跳转 click here
linux 管道符输入,linux/unix管道符和stdout、stdin 跳转 click here
vim 操作命令大全 跳转 click here