一、示例:
发现页面打开太慢,就去服务器上看了看,没有报错,却发现cpu占用满了。
1、top查找出那个进程消耗的cpu高
直接top,发现max_pid (假设6415最高)
2、top占用cpu最高的进程后,在:top -p 6415
3、然后shift + h;查找出那个线程消耗的cpu高。
4、然后随便找一个线程用jstack分析(比如用:7065)
5、将需要的线程ID转化为16进制格式:
printf "%x\n" 7065
转化出来是1b99
6、jstack查找这个线程的信息
jstack [进程]| grep -A 10 [线程的16进制],即:
jstack 6415 | grep -A 10 1b99
-A 10表示查找到所在行的后10行。7069用计算器转换为16进制1b99,注意字母是小写。
二、top(整机),vmstat(CPU),free(内存),df(硬盘),iostat (磁盘IO),ifstat(网咯IO)等...
linux百度脑图:https://link.zhihu.com/?target=http%3A//naotu.baidu.com/file/a728c9843ffc717b91bc8e5883586d5d%3Ftoken%3D07193d87b188531f
例2;我们写一个java程序放到linux下这是我的java程序,显然这行代码是个死循环当在我们的程序中发生的时候我们该如何定位呢
ps -ef 或者jps进一步定位,得知是那个程序出的问题
使用ps -mp 进程 -o THREAD,tid,time 定位到具体的线程或代码
旧方法:jstack 进程ID | grep tid(16进制线程ID小写英文) -A60(老方法)
但对我现在的服务器好像不太使用所以我使用了个新方法
新方法:jstack 进程ID(新方法)(注意是进程)
会打印出一大串信息我们翻到最底下就可以找到如下报错
2、定位具体的异常业务
这里咱们可以使用 pwdx 命令根据 pid 找到业务进程路径,进而定位到负责人和项目:
可得出结论:该进程对应的就是数据平台的web服务。
3、定位异常线程及具体代码行
传统的方案一般是4步:
1、top oder by with P:1040 // 首先按进程负载排序找到 maxLoad(pid)
2、top -Hp 进程PID:1073 // 找到相关负载 线程PID
3、printf “0x%x ”线程PID: 0x431 // 将线程PID转换为 16进制,为后面查找 jstack 日志做准备
4、jstack 进程PID | vim +/十六进制线程PID - // 例如:jstack 1040|vim +/0x431 -
但是对于线上问题定位来说,分秒必争,上面的 4 步还是太繁琐耗时了,之前介绍过淘宝的oldratlee 同学就将上面的流程封装为了一个工具:show-busy-java-threads.sh,可以很方便的定位线上的这类问题:
可得出结论:是系统中一个时间工具类方法的执行cpu占比较高,定位到具体方法后,查看代码逻辑是否存在性能问题。
4、根因分析
经过前面的分析与排查,最终定位到一个时间工具类的问题,造成了服务器负载以及cpu使用率的过高。
那么可以得到结论,如果现在时间是当天上午10点,一次查询的计算次数就是 10*60*60*n次=36,000*n次计算,而且随着时间增长,越接近午夜单次查询次数会线性增加。由于实时查询、实时报警等模块大量的查询请求都需要多次调用该方法,导致了大量CPU资源的占用与浪费。
5、解决方案
定位到问题之后,首先考虑是要减少计算次数,优化异常方法。排查后发现,在逻辑层使用时,并没有使用该方法返回的set集合中的内容,而是简单的用set的size数值。确认逻辑后,通过新方法简化计算(当前秒数-当天凌晨的秒数),替换调用的方法,解决计算过多的问题。上线后观察服务器负载和cpu使用率,对比异常时间段下降了30倍,恢复至正常状态,至此该问题得已解决。
线上cpu服务100%,so easy:
https://link.zhihu.com/?target=https%3A//my.oschina.net/leejun2005/blog/1524687
linux系统监控、诊断工具之详解:
https://link.zhihu.com/?target=https%3A//my.oschina.net/leejun2005/blog/157910
cpu异常 排查与诊断之总结:
https://my.oschina.net/leejun2005/blog/1602482
要查询是哪块儿代码的问题,Linux系统层面的几个追踪命令,strace,ltrace,都可以,另外你可以借助PHP性能追踪及分析工具xhprof,另外几个建议,1、开启fpm慢日志查看2、开启MySQL慢日志,查看系统io情况3、优化,增加opcache缓存,memcache缓存