大家好,今天来为大家解答线上Java程序引发服务器CPU占用过高问题排查全记录这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
2、CPU占用过高问题定位
2.1、定位问题进程
使用top命令查看资源占用情况。发现pid 14063的进程占用大量CPU资源。 CPU占用率高达776.1%,内存占用率也达到29.8%。
[ylp@ylp-web-01 ~]$ 顶部
顶部- 14:51:10 已添加233 天, 11:40, 7 位用户, 平均负载: 6.85, 5.62, 3.97
任务: 总共192 个,2 个正在运行,190 个正在睡眠,0 个停止,0 个僵尸
%Cpu(s): 97.3 us、0.3 sy、0.0 ni、2.5 id、0.0 wa、0.0 hi、0.0 si、0.0 st
KiB Mem : 16268652 总计,5114392 可用,6907028 使用,4247232 buff/缓存
KiB Swap: 总计4063228,免费3989708,已使用73520。 8751512可用内存
PID 用户PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令
14063 ylp 20 0 9260488 4.627g 11976 S 776.1 29.8 117:41.66 java
2.2、定位问题线程
使用ps -mp pid -o THREAD,tid,time 命令查看进程的线程状态,发现进程中多个线程的占用率非常高
[ylp@ylp-web-01 ~]$ ps -mp 14063 -o 线程,tid,时间
用户%CPU PRI SCNT WCHAN 用户系统TID 时间
ylp 361 - - - - - - 02:05:58
ylp 0.0 19 - futex_ - - 14063 00:00:00
ylp 0.0 19 - poll_s - - 14064 00:00:00
ylp 44.5 19 - - - - 14065 00:15:30
ylp 44.5 19 - - - - 14066 00:15:30
ylp 44.4 19 - - - - 14067 00:15:29
ylp 44.5 19 - - - - 14068 00:15:30
ylp 44.5 19 - - - - 14069 00:15:30
ylp 44.5 19 - - - - 14070 00:15:30
ylp 44.5 19 - - - - 14071 00:15:30
ylp 44.6 19 - - - - 14072 00:15:32
ylp 2.2 19 - futex_ - - 14073 00:00:46
ylp 0.0 19 - futex_ - - 14074 00:00:00
ylp 0.0 19 - futex_ - - 14075 00:00:00
ylp 0.0 19 - futex_ - - 14076 00:00:00
ylp 0.7 19 - futex_ - - 14077 00:00:15 从输出信息可以看出,14065~14072之间的线程的CPU占用率非常高。
2.3、查看问题线程堆栈
选择TID为14065的线程,查看该线程的堆栈状态,首先将线程ID转换为十六进制,使用printf "%xn" tid命令进行转换
[ylp@ylp-web-01 ~]$ printf "%xn" 14065
36f1然后使用jstack命令打印线程堆栈信息。命令格式为:jstack pid | grep tid -A 30
[ylp@ylp-web-01 ~]$ jstack 14063 |grep 36f1 -A 30
"GC 任务线程#0 (ParallelGC)" prio=10 tid=0x00007fa35001e800 nid=0x36f1 可运行
"GC 任务线程#1 (ParallelGC)" prio=10 tid=0x00007fa350020800 nid=0x36f2 可运行
"GC 任务线程#2 (ParallelGC)" prio=10 tid=0x00007fa350022800 nid=0x36f3 可运行
"GC 任务线程#3 (ParallelGC)" prio=10 tid=0x00007fa350024000 nid=0x36f4 可运行
"GC 任务线程#4 (ParallelGC)" prio=10 tid=0x00007fa350026000 nid=0x36f5 可运行
"GC 任务线程#5(并行GC)" prio=10 tid=0x00007fa350028000 nid=0x36f6 可运行
"GC 任务线程#6(并行GC)" prio=10 tid=0x00007fa350029800 nid=0x36f7 可运行
"GC 任务线程#7 (ParallelGC)" prio=10 tid=0x00007fa35002b800 nid=0x36f8 可运行
“VM 定期任务线程”prio=10 tid=0x00007fa3500a8800 nid=0x3700 等待条件
JNI全局引用: 392 从输出信息可以看出,该线程是JVM的gc线程。这时基本可以确定是内存不足或者内存泄漏导致gc线程继续运行,导致CPU使用率过高。
接下来我们要寻找内存问题
3、内存问题定位
3.1、使用jstat -gcutil命令查看进程的内存情况
[ylp@ylp-web-01 ~]$ jstat -gcutil 14063 2000 10
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 100.00 99.99 26.31 42 21.917 218 1484.830 1506.747
0.00 0.00 100.00 99.99 26.31 42 21.917 218 1484.830 1506.747
0.00 0.00 100.00 99.99 26.31 42 21.917 219 1496.567 1518.484
0.00 0.00 100.00 99.99 26.31 42 21.917 219 1496.567 1518.484
0.00 0.00 100.00 99.99 26.31 42 21.917 219 1496.567 1518.484
0.00 0.00 100.00 99.99 26.31 42 21.917 219 1496.567 1518.484
0.00 0.00 100.00 99.99 26.31 42 21.917 219 1496.567 1518.484
0.00 0.00 100.00 99.99 26.31 42 21.917 220 1505.439 1527.355
0.00 0.00 100.00 99.99 26.31 42 21.917 220 1505.439 1527.355
0.00 0.00 100.00 99.99 26.31 42 21.917 220 1505.439 1527.355 从输出信息可以看出,Eden区内存占用100%,Old区内存占用99.99%,Full GC次数高达220次,而Full GC频繁,而且Full GC的持续时间也极长,平均一次Full GC耗时6.8秒(1505.439/220)。根据这些信息,基本可以确定程序代码存在问题,可能存在创建对象不合理的地方。
3.2、分析堆栈
使用jstack命令查看进程的堆栈状态
[ylp@ylp-web-01 ~]$ jstack 14063 jstack.out 从服务器获取jstack.out文件到本地后,使用编辑器查找与项目目录相关的信息,线程状态为RUNABLE,为从图中可以看到ActivityUtil.java类的第447行使用了HashMap.put()方法
Paste_Image.png
3.3、代码定位
打开项目,找到ActivityUtil类的第477行。代码如下:
Paste_Image.png被相关同事找到后,这段代码会从数据库中获取配置,并根据数据库中剩余的值进行循环。在循环中,HashMap将会被投入运行。
【线上Java程序引发服务器CPU占用过高问题排查全记录】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
线上java程序总是让人提心吊胆啊,遇到问题得仔细调定位,真考验技术功底。
有14位网友表示赞同!
说起来吓人,服务器CPU占这么高,估计网站都慢悠悠的了,处理起来肯定很头疼吧。
有9位网友表示赞同!
Java程序跑线上压力很大,代码优化和部署都是关键环节啊。
有16位网友表示赞同!
文章写的详细?希望能看看具体排查步骤,我遇到类似问题不知道怎么下手。
有20位网友表示赞同!
CPU占用率过高,是不是内存不够用呢?
有20位网友表示赞同!
线上的Java程序真是复杂,需要各种监控工具来辅助排查问题啊!
有14位网友表示赞同!
好想了解一下这次的线上程序是什么做的,具体代码逻辑可能更容易理解问题的根源。
有16位网友表示赞同!
服务器资源管理也是很重要的,及时发现问题能够避免更大的损失吧。
有13位网友表示赞同!
线上问题的排除过程确实不容易,需要团队协作和精密的排查步骤
有19位网友表示赞同!
遇到这种情况,是不是要考虑扩容呢?
有14位网友表示赞同!
分享这种经验非常值钱啊!特别是对于刚学习Java程序开发的小白来说。
有19位网友表示赞同!
线上部署之后需要注意的地方还挺多呀。需要积累不少经验才能驾驭住。
有10位网友表示赞同!
有没有什么专门的工具或者技术可以用来预防类似问题的发生呢?
有5位网友表示赞同!
遇到这种情况,是不是要考虑写日志进行记录?
有17位网友表示赞同!
分析代码和监控指标应该是一个很有效的排查方法吧?
有17位网友表示赞同!
线上部署一定要做好测试和预热呀,避免出现问题的时候无法及时解决。
有13位网友表示赞同!
学习学习线上Java程序的知识,希望以后也能顺利应对类似的问题!
有7位网友表示赞同!
文章里提到的问题排除步骤很详细吗?能不能再来点具体的操作细节?
有20位网友表示赞同!
服务器性能监控工具真的很重要啊!可以及时发现问题苗头。
有6位网友表示赞同!