【转】生产环境下JAVA进程高CPU占用故障排查

在生产环境中,一台使用Tomcat7的服务器在发布后一段时间内出现了CPU占用率逐渐升高的问题。通过使用top命令定位到PID为2633的Java进程,并进一步分析线程堆栈信息来找出导致高CPU占用的原因。最终,通过分析线程堆栈,确认了问题所在并解决了CPU占用过高的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自: http://blog.chinaunix.net/uid-10449864-id-3463151.html

 

生产环境下JAVA进程高CPU占用故障排查 

问题描述:
生产环境下的某台tomcat7服务器,在刚发布时的时候一切都很正常,在运行一段时间后就出现CPU占用很高的问题,基本上是负载一天比一天高。

问题分析:
1,程序属于CPU密集型,和开发沟通过,排除此类情况。
2,程序代码有问题,出现死循环,可能性极大。

问题解决:
1,开发那边无法排查代码某个模块有问题,从日志上也无法分析得出。
2,记得原来通过strace跟踪的方法解决了一台PHP服务器CPU占用高的问题,但是通过这种方法无效,经过google搜索,发现可以通过下面的方法进行解决,那就尝试下吧。

解决过程:
1,根据top命令,发现PID为2633的Java进程占用CPU高达300%,出现故障。

2,找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:
[root@localhost logs]# ps -mp 2633 -o THREAD,tid,time | sort -rn

显示结果如下:
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root     10.5  19    - -         -      -  3626 00:12:48
root     10.1  19    - -         -      -  3593 00:12:16

找到了耗时最高的线程3626,占用CPU时间有12分钟了!

将需要的线程ID转换为16进制格式:
[root@localhost logs]# printf "%x\n" 3626
e18

最后打印线程的堆栈信息:
[root@localhost logs]# jstack 2633 |grep e18 -A 30

将输出的信息发给开发部进行确认,这样就能找出有问题的代码。
通过最近几天的监控,CPU已经安静下来了。

### 生产环境CPU占用排查工具及性能分析 在生产环境中,当遇到CPU占用的问题时,可以使用多种工具进行排查和性能分析。以下是一些常用的工具及其功能: 1. **top** `top` 是一个实时显示系统中各个进程资源占用情况的工具,可以快速查看哪些进程占用了较CPU资源。通过该工具,可以初步定位到CPU占用进程PID。[^2] ```bash top ``` 2. **ps** `ps` 命令可以结合其他参数查看具体线程的CPU占用情况,并按CPU占用排序。例如,可以通过以下命令找到CPU占用的线程ID。 ```bash ps -mp <PID> -o THREAD,tid,time | sort -rn ``` 3. **jstack** `jstack` 是JDK自带的工具,用于生成Java进程的线程储信息。通过线程储,可以分析出哪个线程导致了CPU占用。将线程ID换为十六进制后,可以在线程储中查找对应的信息。 ```bash jstack <PID> | grep <TID_in_hex> -A 30 ``` 4. **jconsole** 和 **jvisualvm** 这两个工具是JDK自带的图形化监控工具,可以实时监控Java应用的性能指标,包括CPU、内存、线程等。它们适合用于开发环境或测试环境中的详细性能分析。[^1] 5. **Arthas** Arthas 是阿里巴巴开源的一款Java诊断工具,支持在线诊断运行中的Java应用。通过`dashboard`命令可以查看当前系统的资源使用情况,而`thread`命令可以查看线程的CPU占用情况并定位具体的业务代码。[^4] ```bash java -jar arthas-boot.jar dashboard thread -n 3 ``` 6. **strace** `strace` 是一个用于跟踪进程系统调用和信号的工具。虽然它主要用于非Java程序的调试,但在某些情况下也可以帮助分析Java程序的行为。[^2] ```bash strace -p <PID> ``` 7. **perf** `perf` 是Linux内核自带的一个性能分析工具,可以用来分析CPU热点函数。通过与`perf report`结合使用,可以找到消耗CPU最多的函数。 ```bash perf record -g -p <PID> perf report ``` 8. **sysdig** `sysdig` 是一个强大的系统级监控和故障排除工具,可以捕获和分析系统调用。它提供了更丰富的功能,适用于复杂的性能分析场景。 ```bash sysdig -p "%proc.name %cpu" evt.type=cpu ``` 9. **htop** `htop` 是`top`的增强版,提供了更友好的界面和更多的功能,如交互式进程管理、树状视图等。[^3] ```bash htop ``` ### 示例代码:模拟CPUJava程序 以下是一个简单的Java程序,用于模拟CPU占用的情况。可以通过上述工具对其进行分析。 ```java public class CpuHighDemo { public static void main(String[] args) { while (true) { // 空循环导致CPU占用 } } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值