近几天现场报故障过来,说A系统(java b/s应用,有较多后台线程处理任务)在现网占用系统资源非常严重,而服务器相对也比较强劲,8核CPU,16G内存,相对于我们的应用从硬件来说远远足够。
首先,top命令看一下情况,果然名为java的进程,时不时占到500%甚至700%的cpu,mpstat -P ALL 1 ,看了一会cpu情况,8个cpu(核)也基本都没闲的时候,看来问题比较严重了。我ssh到服务器敲些命令反应也不如之前快。
排查步骤:
一、使用之前的top或者jdk自带的jps,找到这个java进程的PID,假设为 2370.
二、继续使用top命令,但这次是看这个进程包含的线程cpu使用情况,命令:top -H -P 2370 -d 1 -n3>javaTop.log,这样就把这个java进程包含的线程资源使用情况重定向到文件了,-d 1表示1秒刷新一次,且加上它才能重定向到文件 。-n 3 表示采样3次。
结果大概是这样:
其中可以看到这些线程的cpu占用都不太正常,当然这里要注意前面的PID,这个有用。
三、使用kill -3 2370 赶紧做次threadDump,看java线程栈情况,当然也可以自己写个脚本连续间隔着做几次,这样更好排除问题。做完threadDump后,把它们复制出来,可以直接用文本工具分析,大概像这样:
图中与公司信息相关的包名已经抹掉了。图中的nid,是根据第二步的top中的PID转换为16进制后,查到的。
四、其实就是第3图中定位方法。在第二步获取的结果中,找几个PID,都转换为16进制,然后到第三步的threadDump中查找,它对应的是threadDump中的nid,多查几个更能准确说明问题。像我这定位下来,就是第三步图中的结果,即我们去获取某个目录下的文件目录个数消耗了较多的CPU。
五、这里就是根据第四步分析的threadDump,看那个类的哪行代码是在做什么事。我们这就是IO操作,去计算某个目录下文件个数。我叫现场人员看了下那个目录,有几万个文件,而我们的代码又是个递归的判断,在这里性能非常低下,并导致CPU占用奇高无比。
六、其实没什么好说的,定位了问题,就分析下如何解决了。
相关推荐
java cpu 内存占用高 问题 模拟并排查 https://blog.csdn.net/jiankunking/article/details/79749836 https://blog.csdn.net/jiankunking/article/details/79749483
Linux系统中java进程占用cpu资源过高,分析(自用,需要私聊)
Java线程CPU占用高原因排查方法,Java线程CPU占用高原因排查方法
当用户量过大,或服务器性能不足以支持大用户量,但同时又得不到扩容的情况下,进行性能分析,并对系统、应用、程序进行优化显得尤为重要,也是节省资源的一种必不可少的手段。目前大多数运维产品都基于JAVA语言开发...
java进程占用CPU和内存太高问题排查相关测试文件
一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。下面这篇文章主要给大家介绍了一次因Java应用造成CPU过高的排查实践过程,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
java进程高CPU占用故障排查
给大家分享了java实战CPU占用过高问题的排查及解决方法,有需要的朋友们可以学习下。
Java程序 CPU占用100%问题排查通过top确认问题进程,获得pid。根据pid查出问题线程,获得线程id,tid。通过jstack把pid的信息导出文件
java进程占用CPU过高常见的两种情况: 代码中有死循环或者接近死循环的操作 快速创建大量临时变量,导致频繁触发gc回收 问题解决: 1、用top命令找到cpu占用率最高的进程号是8958 top 2、top -Hp pid 命令找到该...
3.top -H -p PID 查看对应进程的哪个线程占用CPU过高。 4.echo “obase=16; PID” | bc 将线程的PID转换为16进制。 5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。 6.分析...
Java服务器问题排查思路及工具集.zip linux工具集 java工具集 cpu占用率高如何解决 内存占用率高如何解决 OOM(out of memory)如何解决
教你找出 运行java项目,使cpu 100%,如何排查出是哪个jar包的哪个线程导致的
jmap 排查 java 进程内存使用率高步骤glances 找出服务器中 CPU 占用率高的进程临时修改程序用户的 shell 为可登录用户并切换到该用户注意
windows排查Java代码占用CPU过高的工具,很实用
藏在正则表达式里的陷阱,一个正则表达式导致CPU 利用率居高不下 我们可以看到所有的堆栈都指向了一个名为 validateUrl 的方法,这样的报错信息在堆栈中一共超过 100 处。通过排查代码,我们知道这个方法的主要功能...
线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名。 一、首先获得jvm的进程...
上传到 linux线上服务器,执行 chmod -R 777 show-busy-java-threads 执行权限。 ./show-busy-java-threads 查看执行占用cpu偏高的 线程,方便我们排查定位。
说明:用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用。
CPU占用过高问题排查,java应用某台机器cpu比较高的情况,而且重启后基本上都会恢复正常。