线上问题归纳
总的来说基本线上问题分为五类:
处理慢导致的问题
线程过多导致的问题
个别线程占用资源过多
活锁
死锁
线上问题定位基本流程
- 看日志log。
- 若日志中没有发现异常。
top
看CPU、内存情况。jcmd
查看运行的java程序。jstack pid > a.log
把线程情况存入a.log文件中。vi a.log
进入文件shift + :
搜索自己类的路径,查看是哪个类出现问题,寻找多个请求都卡在的地方。- 找到该类的代码所在寻找问题 再继续排查问题。
在自己模拟时可以使用Jmeter
来模拟多个用户访问.
线上问题分类具体处理
首先我们要明白很重要的一点:无监控,不调优
当线上发生问题最要紧的事,恢复可用性
,在立马找不到问题所在可以选择保存快照后重启
。
处理慢导致的问题
使用多次jstack
定位,进行比对
递归或死循环计算导致的CPU占用率过高(jstack定位)
线程过多导致的问题(jstack定位)
代码没有任何问题,但请求太多了导致CPU爆满
- 资源:每一个请求,业务执行需要占用多少资源,CPU * 1–> 增加资源。
- 线程池,控制线程数量,升级更高的配置
个别线程占用资源过多
当CPU超过了100%,不用太着急,因为我们的CPU都是多核的,最高为100% * CPU核数。
如何在多个线程中确认到出问题的线程之处。
我们则需要更多的监控 。
在TOP页面中输入h 进入帮助页面查看更多的功能,其中的输入h,输出线程占用CPU排序,再jstack
打印线程信息,线程PID的十六进制就是java中该线程的nid(可以使用printf "%x\n" PID
来查看十六进制的PID) ,在线程信息文件中找到该占有率最高的线程.
也可以选择top -H -p javapid
直接打出该Java程序线程的信息。
死锁活锁问题
基本流程上多判断几次 记录可能是有问题的代码,过一段时间多次进行查验观察这段代码是否还有问题点。
同时保存多份不同时间的线程情况文件 利用文本处理工具grep -rn "怀疑的代码关键片段 a1.log"
(查看a1.log文件中包含" "中字段的代码) 。
也可以按照大型项目或框架中的线程会进行统一命名的规则来进行查找。