线上服务CPU 100%了常用的Linux命令详解

前言

经常做后端服务开发的同学,或多或少都遇到过 CPU 负载特别高的问题。尤其是在周末或大半夜,突然群里有人反馈线上机器负载特别高,不熟悉定位流程和思路的同学可能登上服务器一通手忙脚乱,定位过程百转千回。
线上服务CPU 100%了常用的Linux命令详解

对此,也有不少同学曾经整理过相关流程或方法论,类似把大象放进冰箱要几步,传统的方案一般是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程序显示各个线程。如果没有此命令行选项,则显示每个进程中所有线程的总和。

线上服务CPU 100%了常用的Linux命令详解

-p 参数: 仅监视具有指定进程ID的进程。

线上服务CPU 100%了常用的Linux命令详解

top -p 进程PID 或者 top -p进程PID 都是合法的。-p 可以和进程PID之间空一个空格,也可以不加空格。
top -p进程PID -Htop -H -p进程PIDtop -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>

线上服务CPU 100%了常用的Linux命令详解

管道符 |

利用管道符|:可将一个命令的 stdout 重定向成为另外一个命令的 stdin

vim

通过 vim -help 可以查看更多关于 vim 参数的介绍。

线上服务CPU 100%了常用的Linux命令详解

上面这张图解释了为什么在 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

线上服务CPU 100%了常用的Linux命令详解

上一篇:FreeBSD 安装 Linux QQ 方法


下一篇:Mac新手必看:Mac电脑触控板与聚焦功能