通过topas或者top发现导致机器cpu高的进程为was的进程ID号。可以通过(ps -ef|grep java 去查询一下was的进程号)
1) 利用工具aixperf.sh (linux利用工具linperf.sh,was6.0利用aixperf60.sh)进行收集数据,ftp该工具至需要收集的系统中。修改执行权限,并注意上传文件所属用户和用户组,假如你的AppSrv01是was用户启动的,则
chmod 755 aixperf.sh 调整执行权限
chown was:was aixperf.sh 调整文件属组,
2) ps –ef|grep java 查看was进程ID号
3) 执行 ./aixperf.sh was进程ID号 (当前was启动用户执行)
4) 在/was/IBM/WebSphere/AppServer/profiles/AppSrv01中生产一个
aixperf_RESULTS.tar.gz及3个左右javacore文件。
下载这些文件至本地分析。信息收集后,可根据需要进行was重启操作。
分析过程:
1) 解压aixperf_RESULTS.tar.gz文件,找到sleep.prof文件,打开,找到如下:
Process PID TID Total Kernel User Shared Other
======= === === ===== ====== ==== ====== =====
java 1360096 2883655 14.93 0.04 0.00 4.42 10.47
java 1360096 3797117 14.89 0.03 0.00 4.14 10.72
java 1360096 4129121 14.60 0.05 0.00 4.17 10.38
java 1360096 979281 14.45 0.13 0.00 4.55 9.77
wait 8196 8197 4.28 4.28 0.00 0.00 0.00
PID为当前was的进程ID号,TID为was中线程ID号。Total表示线程占用CPU的比例。
上面的结论:CPU高的主要原因是线程2883655 3797117 4129121 979281 所占用的,因此要找到该线程所对应执行的具体类,方法。
2) 将上面的TID转成16进制。可以利用计算器。
2883655 转成 0x2C0047
3) 在生成的javacore中查找具有0x2C0047的信息。例如:
4) 找到对应的java代码,进行分析这个类的
com/huateng/ebank/business/common/operator/ExportQueryListOperation的genBuyBusinessResult方法是否存在问题。
如果定位在这个地方,通常一定会有问题,可能会有循环在这个地方,通常代码中会有while的循环,而且这个地方的循环是逻辑上是没有办法退出来的。
如果逻辑正确,可能是由于数据有问题,此时去查询一下数据库的对应用到的表,是否存在不正常的数据。
如果服务器是Windows的,稍微麻烦一些。如果需要,请留言博主,不过还是劝你放弃Windows上的WAS,