websphere cpu性能问题.docx
《websphere cpu性能问题.docx》由会员分享,可在线阅读,更多相关《websphere cpu性能问题.docx(11页珍藏版)》请在冰点文库上搜索。
webspherecpu性能问题
WAS的异常高CPU占用率
问题描述
系统管理员或用户注意到WebSphereApplicationServer进程消耗大量的CPU资源,并想要了解是哪个方面消耗了大量CPU资源,以及导致出现这种现象的原因。
故障排除
请注意,并非下面所有任务都需要完成。
有些问题仅通过执行几项任务就可以解决。
为什么发生此问题?
发生此问题有许多原因:
WebSphereApplicationServer本身、用户创建的线程、不良编码习惯或第三方软件。
遗憾的是,证明在什么地方发生此问题有时候非常困难。
本模式尝试通过利用特定操作命令和收集数据来帮助排除此问题。
收集高CPU占用率的数据
对于有关收集高CPU占用率的数据的特定操作信息,请根据您的操作系统执行以下步骤。
转换为十六进制号码
备注:
为协助您计算在本模式中讨论的十六进制值,您可以在Shell脚本中使用下列行将十进制号码转换为十六进制号码。
如果您使用Unix操作系统,那么转换会很方便。
dec2hex.sh:
printf"dec->hex:
%d=%x\n"${1}${1}
用法:
$shdec2hex.sh755
dec->hex:
755=2f3
AIX
1.执行:
ps-mp-oTHREAD以查找正在占用CPU的tid。
您应当查看“CP”列(表示CPU占用率),看其中哪些线程的此项值比较高并从中挑选一个线程。
2.通过执行以下命令对服务器进行ThreadDump:
kill-3
3.运行:
dbx-a
4.在dbx中时,运行dbxthread命令(以列出所有线程)。
5.查找与您通过ps-mp-oTHREAD命令获取的TID匹配的行。
该行中的号码应当采用“$t”格式,其中“NUM”是一个号码。
6.在dbx中时,运行dbx命令thinfo(此TID来自上一步骤,该步骤在$t后面列出号码)以获取关于该线程的信息。
7.从第3步骤的输出中,在“general”下查找“pthread_t”,并记录该十六进制号码。
8.非常重要说明:
在dbx提示符下,您需要在完成操作时在dbx命令行键入“detach”,否则,如果您在连接到进程时只要一退出,dbx将终止该进程!
9.记下“p_thread_t”输出中的十六进制值,并在ThreadDump中搜索其中哪个线程的“nativeID”等于该值。
这将为您揭示造成高CPU占用率问题的线程。
下面是AIX系统中上述进程的一个示例:
1、ps-mp250076-oTHREAD将显示以下内容:
USER PID PPID TIDST CPPRISC WCHAN F TTBNDCOMMAND
usera250076217266 -A 38 6072 * 242011 pts/0 -/WebSphere/jdk130/...
- - - 315593Z 0 97 1 - c00007 - --
- - - 344305S 0 60 1f1000089c020e200 400400 - --
- - - 499769S 0 60 1f1000089c0213a00 400400 - --
- - - 540699S 0 60 1f100008790008440 8410400 - --
- - - 544789S 0 60 1f100008790008540 8410400 - --
- - - 548883S 0 60 1f100008790008640 8410400 - --
- - - 552979S 0 60 1f100008790008740 8410400 - --
- - - 565283Z 0 60 1 - c00007 - --
- - - 585783S 0 60 1f100008790008f40 8410400 - --
- - - 589865Z 0 80 1 - c00007 - --
- - - 593959S 1 60 1f100008790009140 8410400 - --
- - - 610365S 0 60 1f100008790009540 8410400 - --
- - - 614453S 0 60 1f100008790009640 8410400 - --
- - - 618547S 0 60 1f100008790009740 8410400 - --
- - - 622645S 0 60 1f100008790009840 8410400 - --
- - - 626743S 0 60 1f100008790009940 8410400 - --
- - - 630841S 0 60 1f100008790009a40 8410400 - --
- - - 634941S 0 60 1f100008790009b40 8410400 - --
- - - 639037S 0 60 1f100008790009c40 8410400 - --
- - - 643135S 0 60 1f100008790009d40 8410400 - --
- - - 647233S 0 60 1f100008790009e40 8410400 - --
- - - 651331S 0 60 1f100008790009f40 8410400 - --
- - - 655429S 0 60 1f10000879000a040 8410400 - --
- - - 659527S 0 60 1f10000879000a140 8410400 - --
- - - 663625S 0 60 1f10000879000a240 8410400 - --
- - - 667723S 37 78 1f1000089c020f150 400400 - --
- - - 671821S 0 60 1f10000879000a440 8410400 - --
- - - 675919S 0 60 1 - 418400 - --
- - - 680017S 0 60 1f10000879000a640 8410400 - --
- - - 684115S 0 60 1f10000879000a740 8410400 - --
- - - 688213S 0 60 1f10000879000a840 8410400 - --
- - - 692311S 0 60 1f10000879000a940 8410400 - --
- - - 696409S 0 60 1f10000879000aa40 8410400 - --
- - - 712801S 0 60 1f10000879000ae40 8410400 - --
- - - 716899S 0 60 1f10000879000af40 8410400 - --
……
2.通过kill-3产生该WAS_JAVA_PID的ThreadDump
3.检查ps-mp-oTHREAD命令所输出的信息。
注意,TID"667723"在CP列中有一个高值(它达到“37”,而其它TID几乎为0)。
4.运行dbx-a250076以连接到WebSphereApplicationServer进程。
5.运行thread命令以列出所有本地线程。
下面只显示相关线程的一个代码片断:
thread state-k wchan state-u k-tid modeheldscopefunction
.....
$t15 wait 0xf10000879000a140blocked 659527 k no sys _event_sleep
$t16 wait 0xf10000879000a240blocked 663625 k no sys _event_sleep
$t17 run running 667723 k no sys JVM_Send
$t18 wait 0xf10000879000a440blocked 671821 k no sys _event_sleep
$t19 wait running 675919 k no sys poll
$t20 wait 0xf10000879000a640blocked 680017 k no sys _event_sleep
.....
6.运行thinfo17命令以获取关于该本地线程的必要信息:
(dbx)thinfo17
thread state-k wchan state-u k-tid modeheldscopefunction
$t17 run running 667723 k no sys JVM_Send
general:
pthreadaddr=0x3ea55c68 size =0x244
vpaddr =0x3e69e5e0 size =0x2a8
threaderrno=2
startpc =0x300408b0
joinable =no
pthread_t =1011
scheduler:
kernel =
user =1(other)
event:
event =0x0
cancel =enabled,deferred,notpending
stackstorage:
base =0x3ea15000 size =0x40000
limit =0x3ea55c68
sp =0x3ea55054
7.非常重要说明:
在dbx提示符下运行“detach”以从WebSphereApplicationServerJava进程中分离。
警告:
☆☆☆☆☆!
8.记下上述“pthread_t”的数值,并用来查找WebSphereApplicationServer进程ThreadDump中的正确线程。
9.从早期进行的ThreadDump中,您可以将十六进制号码“1011”与ThreadDump中在“nativeID”之后的号码进行匹配。
下面是匹配此十六进制号码并造成高CPU占用率问题的线程示例:
3XMTHREADINFO"Servlet.Engine.Transports:
915"(TID:
0x34B82C78,sys_thread_t:
0x778F7670,state:
MW,nativeID:
0x1011)prio=5
4XESTACKTRACEatcom.henry.util.JSONWriter.putValue(JSONWriter.java(CompiledCode))
4XESTACKTRACEatcom.henry.util.JSONWriter.putNextValue(JSONWriter.java(InlinedCompiledCode))
4XESTACKTRACEatperson._FPT_5F_I_5F_0002_5F_1Pay_jsp_0.toAccountList2JsonArray(_FPT_5F_I_5F_0002_5F_1Pay_jsp_0.java(CompiledCode))
4XESTACKTRACEatperson._FPT_5F_I_5F_0002_5F_1Pay_jsp_0._jspService(_FPT_5F_I_5F_0002_5F_1Pay_jsp_0.java:
392)
4XESTACKTRACEatorg.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java(CompiledCode))
4XESTACKTRACEatjavax.servlet.http.HttpServlet.service(HttpServlet.java(CompiledCode))
4XESTACKTRACEatorg.apache.jasper.runtime.JspServlet$JspServletWrapper.service(JspServlet.java(CompiledCode))
4XESTACKTRACEatorg.apache.jasper.runtime.JspServlet.serviceJspFile(JspServlet.java(CompiledCode))
4XESTACKTRACEatorg.apache.jasper.runtime.JspServlet.service(JspServlet.java(CompiledCode))
4XESTACKTRACEatjavax.servlet.http.HttpServlet.service(HttpServlet.java(CompiledCode))
4XESTACKTRACEatcom.ibm.servlet.engine.webapp.StrictServletInstance.doService(ServletManager.java(CompiledCode))
4XESTACKTRACEatcom.ibm.servlet.engine.webapp.StrictLifecycleServlet._service(StrictLifecycleServlet.java(CompiledCode))
4XESTACKTRACEatcom.ibm.servlet.engine.webapp.ServicingServletState.service(StrictLifecycleServlet.java(CompiledCode))
4XESTACKTRACEatcom.ibm.servlet.engine.webapp.StrictLifecycleServlet.service(StrictLifecycleServlet.java(InlinedCompiledCode))
4XESTACKTRACEatcom.ibm.servlet.engine.webapp.ServletInstance.service(ServletManager.java(CompiledCode))
4XESTACKTRACEatcom.ibm.servlet.engine.webapp.ValidServletReferenceState.dispatch(ServletManager.java(CompiledCode))
Windows
使用pslist
您可以在Windows中使用pslist并获取java进程的线程详细信息。
pslist可从以下网址得到:
1.运行pslist-d并将输出结果重定向到一个文件。
2.重复几次这个操作,以便您能够看到一种模式。
您将看到“用户时间”和“内核时间”不断增加。
3.在若干次迭代后对WAS服务器进行ThreadDump。
4.记下步骤1中看起来正在增加的线程ID号,将十进制值改为十六进制值(您可以使用Windows中的计算功能)。
5.根据“nid=0x<步骤3的十六进制值>”检查ThreadDump,直到您找到出现问题的线程。
使用ProcessExplorer
您还可以使用Systinternals提供的ProcessExplorer
该工具直观动态显示CPU占用率。
由于ProcessExplorer没有记录功能或历史记录,您必须监视该程序并记录占用几乎全部CPU资源的Java进程的线程ID。
若要通过ProcessExplorer达到上述目的:
1.查找java进程,然后右键单击并选择属性。
2.单击“Threads”选项卡以显示与此java进程关联的所有线程。
3.您可以单击以“MSVCRT.dll+<一些十六进制偏移量>”形式列出的其中一个线程。
您可以看到在下面窗格中列出的“ThreadID”。
4.观察哪一个线程占用最多CPU资源。
5.进行WAS服务器的ThreadDump。
6.记下步骤4中看起来正在占用CPU的线程ID号,将十进制值改为十六进制值(您可以使用Windows中的计算功能)。
7.根据“nativeID=0x<十六进制值>”检查ThreadDump,直到您找到出现问题的线程。
下面是仅使用pslist和ThreadDump的步骤示例:
1.运行pslist-d172
java1720:
TidPri Cswtch State UserTime KernelTime ElapsedTime
1520 8 9705 Wait:
UserReq 0:
00:
23.734 0:
00:
01.772 0:
04:
55.264
1968 9 2233 Wait:
UserReq 0:
00:
04.606 0:
00:
00.040 0:
04:
54.874
1748 15 146 Wait:
UserReq 0:
00:
00.010 0:
00:
00.010 0:
04:
54.863
1744 11 62 Wait:
UserReq 0:
00:
00.010 0:
00:
00.000 0:
04:
54.853
1420 15 3 Wait:
UserReq 0:
00:
00.000 0:
00:
00.000 0:
04:
54.563
1856 15 7 Wait:
UserReq 0:
00:
00.000 0:
00:
00.000 0:
04:
54.563
1860 9