提示:面试问题:cpu飙升时的排查方式、生产问题排查方式
文章目录
- 前言
- 一、cpu飙升时的排查步骤
- 1、top
- 2、top -Hp pid
- 3、printf ‘0x%x’ tid
- 4、jstack pid | grep tid
- 二、总结
- 三、线上环境常规排查步骤
- 1、查看服务器中线程情况
- 2、查看系统异常进程的16进制
- 3、查看异常线程堆栈信息
- 4、查看占用最大内存对象前100
- 5、导出到文件
- 6、或dump信息使用工具Mat或者JProfiler查看
- 总结
前言
相对比而言,后端开发需要掌握的知识更多一些。毕竟我们要懂java、数据库、linux、各种中间件。。我们今天就说一说,当服务器中的cpu突然飙升时,怎么排查。本人水平有限,如有误导,欢迎斧正,一起学习,共同进步!
一、cpu飙升时的排查步骤
1、top
使用 top 命令,查看占用资源最多的进程(cpu的使用率、内存什么的)
top
效果图:
2、top -Hp pid
使用 top -Hp pid 定位这个进程内,占用cpu最高的线程。
top -Hp 182275
效果图:
3、printf ‘0x%x’ tid
使用 printf ‘0x%x’ tid 将进程id 转换为16进制 零x,中文下的单引号
printf ‘0x%x’ 182347
效果图:
4、jstack pid | grep tid
jstack pid | grep tid 找到线程堆栈 pid是进程id、tid是线程id
jstack 182275 | grep 0x2c84b -A 30
效果图:
二、总结
总结一下,其实就是4步:
- top oder by whit P :1040 // 首先按进程负载拍粗找到 axload(pid)
- top -Hp 进程PID : 1073 // 找到相关负载 线程PID
- printf “0x%x\n” 线程PID: 0X431 // 将线程PID转换为16进制,为后面查找jstack日志做准备
- jstack 进程PID | vim +/十六进制线程PID - // 例如: jstack 1040|vim +/0x431 -
三、线上环境常规排查步骤
1、查看服务器中线程情况
top -H -p pid
或
ps -mp pid -o THREAD,tid,time
2、查看系统异常进程的16进制
printf “%x\n” nid
3、查看异常线程堆栈信息
jstack pid | grep number
4、查看占用最大内存对象前100
jmap -histo pid|head -100
5、导出到文件
jstack -l PID >> a.log
6、或dump信息使用工具Mat或者JProfiler查看
jmap -dump:live,format=b,file=/dump.bin pid
总结
这里是比较传统的线上问题排查方案,后续有机会的话,会分享一些其他的方案,这样我们可以视情况而定,多一些手段,多一份保障。