某通信自助终端系统196服务器出现了CPU异常高的情况,其中有一个WAS服务器进程占用CPU高达51%,严重影响服务器性能,我司工程师到达现场通过分析与讨论确定是由于业务代码“com/known/util/sendAlertMesage.setAlertInfo”占用CPU较多导致,后续需要开发商分析与优化该业务逻辑,减少对主机CPU的损耗。
工作内容:现场对自助终端系统196服务器CPU异常高原因进行故障排查
工作过程:
1. 现场与用户了解异常情况;
2. 收集相关服务器信息;
3. 分析服务器信息;
4. 分析当前进程正在占用CPU和TID线程信息;
5. 多次输出threaddump线程执行堆栈快照信息;
6. 将占用CPU较高的线程号转换为16进制数据,对照threaddump文件进行分析;
7. 根据多次输出的threaddump文件找到相关的业务逻辑代码。
Ø 收集196服务器信息:
v 自助终端系统196服务器出现CPU异常高的情况
执行topas命令行,输出信息如下:
从服务器输出信息可以看出,主机CPU占用率超过52%,CPU异常高。而占用CPU较高的进程是was用户的java进程,PID为:254040。
Ø 分析确认占用服务器CPU高的was用户进程信息:
执行ps –ef|grep 254040得知该进程为WebSphere服务器server1
Ø 分析当前进程正在占用CPU和TID线程信息:
执行ps -mp 254040 -o THREAD命令行,找到当前进程正在占用CPU和TID的线程信息,发现有一列CP占用率较高,该值为:1597475。
Ø 多次输出threaddump线程执行堆栈快照信息:
执行kill -3 254040输出ThreadDump线程执行堆栈快照信息,该命令会生成一个javacore文件,该文件的
具体位置在/usr/IBM/WebSphere/AppServer/profiles/AppSrv01/目录下。每隔15秒执行一次,一共执行3次,避免误差。
Ø 将占用CPU较高的线程号转换为16进制数据,对照threaddump文件进行分析:
将1597475转换为16进制数字为:186023。对照3次输出的threaddump文件,均找到如下相同的日志信息:
从日志信息可以看出,业务逻辑“com/known/util/sendAlertMesage.setAlertInfo”导致CPU占用异常高。
4、解决方案
通过上节分析可知,导致196服务器异常高的原因是由于业务逻辑代码“”引起,因此为了彻底解决该问题,需要由开发商分析优化该业务逻辑代码,减少对主机CPU的消耗。
问题解决方案:
由开发商分析优化业务逻辑代码“com/known/util/sendAlertMesage.setAlertInfo”,以彻底解决CPU占用率异常高。
5、处理结果
最后把该文档移交给开发人员检查,发现该业务逻辑的确有bug,经过开发人员的修复后,问题不在出现。
总结
自助终端系统出现主机CPU占用率超过51%,通过执行命令行找到占用率较高的线程号,然后再对照threaddump信息找到相应的业务逻辑代码,交由开发商分析优化以彻底解决该问题。