webspherecpu性能问题_第1页
webspherecpu性能问题_第2页
webspherecpu性能问题_第3页
webspherecpu性能问题_第4页
webspherecpu性能问题_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、WAS 的异常高 CPU 占用率问题描述系统管理员或用户注意到 WebSphere Application Server 进程消耗大量的 CPU 资源,并想要了解是哪个方面消耗了大量 CPU 资源,以及导致出现这种现象的原因。故障排除请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。为什么发生此问题?发生此问题有许多原因:WebSphere Application Server 本身、用户创建的线程、不良编码习惯或第三方软件。遗憾的是,证明在什么地方发生此问题有时候非常困难。本模式尝试通过利用特定操作命令和收集数据来帮助排除此问题。收集高 CPU 占用率的数据对于有关收

2、集高 CPU 占用率的数据的特定操作信息,请根据您的操作系统执行以下步骤。转换为十六进制号码备注:为协助您计算在本模式中讨论的十六进制值,您可以在 Shell 脚本中使用下列行将十进制号码转换为十六进制号码。如果您使用 Unix 操作系统,那么转换会很方便。dec2hex.sh:    printf "dec -> hex:  %d = %x n" $1 $1用法:     $ sh dec2hex.sh 755    dec -> hex:  755

3、= 2f3 AIX1. 执行: ps -mp <WAS_JAVA_PID> -o THREAD 以查找正在占用 CPU 的 tid。  您应当查看“CP”列(表示 CPU 占用率),看其中哪些线程的此项值比较高并从中挑选一个线程。2. 通过执行以下命令对服务器进行 Thread Dump: kill -3 <WAS_JAVA_PID>3. 运行: dbx -a <WAS_JAVA_PID> 4. 在 dbx 中时,运行 dbx thread命令(以列出所有线程)。 5. 查找与您通过 ps -mp <PID> -o

4、THREAD 命令获取的 TID 匹配的行。  该行中的号码应当采用“$t<NUM>”格式,其中“NUM”是一个号码。6. 在 dbx 中时,运行 dbx 命令 th info <TID>(此 TID 来自上一步骤,该步骤在 $t<NUM>后面列出号码)以获取关于该线程的信息。 7. 从第 3 步骤的输出中,在“general”下查找“pthread_t”,并记录该十六进制号码。 8. 非常重要说明:在 dbx 提示符下,您需要在完成操作时在 dbx 命令行键入“detach”,否则,如果您在连接到进程时只要一退出,dbx 将终止该进程! 9. 记

5、下“p_thread_t”输出中的十六进制值,并在 Thread Dump 中搜索其中哪个线程的“native ID”等于该值。  这将为您揭示造成高 CPU 占用率问题的线程。下面是 AIX 系统中上述进程的一个示例:1、ps -mp 250076 -o THREAD 将显示以下内容:USER    PID   PPID     TID ST  CP PRI SC    WCHAN      &

6、#160; F     TT BND COMMAND    usera 250076 217266      - A   38  60 72        *   242011  pts/0   - /WebSphere/jdk130/.       -

7、60;     -      -  315593 Z    0  97  1        -   c00007      -   - -       -      - 

8、     -  344305 S    0  60  1 f1000089c020e200   400400      -   - -       -      -      -  499769 S    0&

9、#160; 60  1 f1000089c0213a00   400400      -   - -       -      -      -  540699 S    0  60  1 f1440  8410400    &#

10、160; -   - -       -      -      -  544789 S    0  60  1 f1540  8410400      -   - -       -   

11、   -      -  548883 S    0  60  1 f1640  8410400      -   - -       -      -      -  552979 S   

12、; 0  60  1 f1740  8410400      -   - -       -      -      -  565283 Z    0  60  1        -   c

13、00007      -   - -       -      -      -  585783 S    0  60  1 f1f40  8410400      -   - -    &

14、#160;  -      -      -  589865 Z    0  80  1        -   c00007      -   - -       -   

15、0;  -      -  593959 S    1  60  1 f1140  8410400      -   - -       -      -      -  610365 S    0&

16、#160; 60  1 f1540  8410400      -   - -       -      -      -  614453 S    0  60  1 f1640  8410400      - 

17、0; - -       -      -      -  618547 S    0  60  1 f1740  8410400      -   - -       -      -&#

18、160;     -  622645 S    0  60  1 f1840  8410400      -   - -       -      -      -  626743 S    0  60

19、0; 1 f1940  8410400      -   - -       -      -      -  630841 S    0  60  1 f1a40  8410400      -   - - 

20、      -      -      -  634941 S    0  60  1 f1b40  8410400      -   - -       -      -  &#

21、160;   -  639037 S    0  60  1 f1c40  8410400      -   - -       -      -      -  643135 S    0  60  1 f1d40&#

22、160; 8410400      -   - -       -      -      -  647233 S    0  60  1 f1e40  8410400      -   - -   

23、    -      -      -  651331 S    0  60  1 f1f40  8410400      -   - -       -      -    &#

24、160; -  655429 S    0  60  1 f10000879000a040  8410400      -   - -       -      -      -  659527 S    0  60  1 f1000087

25、9000a140  8410400      -   - -       -      -      -  663625 S    0  60  1 f10000879000a240  8410400      -  

26、- -       -      -      -  667723 S   37  78  1 f1000089c020f150   400400      -   - -       -    &#

27、160; -      -  671821 S    0  60  1 f10000879000a440  8410400      -   - -       -      -      -  675919 S  &#

28、160; 0  60  1        -   418400      -   - -       -      -      -  680017 S    0  60  1 f1000087900

29、0a640  8410400      -   - -       -      -      -  684115 S    0  60  1 f10000879000a740  8410400      -   - -

30、       -      -      -  688213 S    0  60  1 f10000879000a840  8410400      -   - -       -     

31、; -      -  692311 S    0  60  1 f10000879000a940  8410400      -   - -       -      -      -  696409 S   

32、; 0  60  1 f10000879000aa40  8410400      -   - -       -      -      -  712801 S    0  60  1 f10000879000ae40  8410400  

33、0;   -   - -       -      -      -  716899 S    0  60  1 f10000879000af40  8410400      -   - -    2. 通过 kill

34、-3 <WAS_JAVA_PID>产生该 WAS_JAVA_PID 的 Thread Dump 3. 检查 ps -mp <WAS_JAVA_PID> -o THREAD命令所输出的信息。 注意,TID "667723" 在 CP 列中有一个高值(它达到“37”,而其它 TID 几乎为 0)。4. 运行 dbx -a 250076以连接到 WebSphere Application Server 进程。 5. 运行 thread 命令以列出所有本地线程。 下面只显示相关线程的一个代码片断:thread  state-k  

35、;   wchan    state-u    k-tid   mode held scope function . $t15    wait      0xf10000879000a140 blocked   659527     k   no   sys  _event_sleep&#

36、160;$t16    wait      0xf10000879000a240 blocked   663625     k   no   sys  _event_sleep $t17    run              &

37、#160;   running  667723     k   no   sys  JVM_Send           $t18    wait      0xf10000879000a440 blocked   671821   

38、60; k   no   sys  _event_sleep $t19    wait                 running  675919     k   no   sys  poll   

39、0;           $t20    wait      0xf10000879000a640 blocked   680017     k   no   sys  _event_sleep .6. 运行 th info 17 命令以获取关于该本地线程的必要信息:(dbx) th info 17

40、     thread  state-k     wchan    state-u    k-tid   mode held scope function     $t17    run              

41、60;   running   667723     k   no   sys  JVM_Send          general:             pthread addr = 0x3ea55c68      

42、;   size         = 0x244             vp addr      = 0x3e69e5e0         size         = 0x2a

43、8             thread errno = 2             start pc     = 0x300408b0             joinable     =

44、 no             pthread_t    = 1011          scheduler:             kernel       =    

45、0;        user         = 1 (other)          event :             event        = 0x0  &

46、#160;          cancel       = enabled, deferred, not pending          stack storage:             base     

47、0;   = 0x3ea15000         size         = 0x40000             limit        = 0x3ea55c68      

48、60;      sp           = 0x3ea550547. 非常重要说明:在 dbx 提示符下运行“detach”以从 WebSphere Application Server Java 进程中分离。 警告:!8. 记下上述“pthread_t”的数值,并用来查找 WebSphere Application Server 进程Thread Dump 中的正确线程。 9. 从早期进行的 Thread Dump 中,您可以将十六进制号码

49、“1011”与 Thread Dump 中在“native ID”之后的号码进行匹配。 下面是匹配此十六进制号码并造成高 CPU 占用率问题的线程示例:3XMTHREADINFO "Servlet.Engine.Transports:915" (TID:0x34B82C78, sys_thread_t:0x778F7670, state:MW, native ID:0x1011) prio=54XESTACKTRACE at com.henry.util.JSONWriter.putValue(JSONWriter.java(Compiled Code)4XESTACKTR

50、ACE at com.henry.util.JSONWriter.putNextValue(JSONWriter.java(Inlined Compiled Code)4XESTACKTRACE at person._FPT_5F_I_5F_0002_5F_1Pay_jsp_0.toAccountList2JsonArray(_FPT_5F_I_5F_0002_5F_1Pay_jsp_0.java(Compiled Code)4XESTACKTRACE at person._FPT_5F_I_5F_0002_5F_1Pay_jsp_0._jspService(_FPT_5F_I_5F_0002

51、_5F_1Pay_jsp_0.java:392)4XESTACKTRACE at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java(Compiled Code)4XESTACKTRACE at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code)4XESTACKTRACE at org.apache.jasper.runtime.JspServlet$JspServletWrapper.service(JspServlet.java

52、(Compiled Code)4XESTACKTRACE at org.apache.jasper.runtime.JspServlet.serviceJsp(Compiled Code)4XESTACKTRACE at org.apache.jasper.runtime.JspServlet.service(JspServlet.java(Compiled Code)4XESTACKTRACE at javax.servlet.http.HttpServlet.service(HttpServlet.java(Compiled Code)4XESTACKTRACE at com.ibm.se

53、rvlet.engine.webapp.StrictServletInstance.doService(ServletManager.java(Compiled Code)4XESTACKTRACE at com.ibm.servlet.engine.webapp.StrictLifecycleServlet._service(StrictLifecycleServlet.java(Compiled Code)4XESTACKTRACE at com.ibm.servlet.engine.webapp.ServicingServletState.service(StrictLifecycleS

54、ervlet.java(Compiled Code)4XESTACKTRACE at com.ibm.servlet.engine.webapp.StrictLifecycleServlet.service(StrictLifecycleServlet.java(Inlined Compiled Code)4XESTACKTRACE at com.ibm.servlet.engine.webapp.ServletInstance.service(ServletManager.java(Compiled Code)4XESTACKTRACE at com.ibm.servlet.engine.w

55、ebapp.ValidServletReferenceState.dispatch(ServletManager.java(Compiled Code)Windows使用 pslist您可以在 Windows 中使用 pslist 并获取 java 进程的线程详细信息。  pslist可从以下网址得到:1. 运行 pslist -d <WAS Java PID> 并将输出结果重定向到一个文件。 2. 重复几次这个操作,以便您能够看到一种模式。 您将看到“用户时间”和“内核时间”不断增加。3. 在若干次迭代后对 WAS 服务器进行 Thread Dump。 4.

56、记下步骤 1 中看起来正在增加的线程 ID 号,将十进制值改为十六进制值(您可以使用 Windows 中的计算功能)。 5. 根据“nid=0x<步骤 3 的十六进制值>”检查 Thread Dump,直到您找到出现问题的线程。 使用 Process Explorer您还可以使用 Systinternals 提供的 Process Explorer 。 该工具直观动态显示 CPU 占用率。 由于 Process Explorer 没有记录功能或历史记录,您必须监视该程序并记录占用几乎全部 CPU 资源的 Java 进程的线程 ID。 若要通过

57、 Process Explorer 达到上述目的:1. 查找 java 进程,然后右键单击并选择属性。 2. 单击“Threads”选项卡以显示与此 java 进程关联的所有线程。 3. 您可以单击以“MSVCRT.dll+<一些十六进制偏移量>”形式列出的其中一个线程。 您可以看到在下面窗格中列出的“Thread ID”。4. 观察哪一个线程占用最多 CPU 资源。 5. 进行 WAS 服务器的 Thread Dump。 6. 记下步骤 4 中看起来正在占用 CPU 的线程 ID 号,将十进制值改为十六进制值(您可以使用 Windows 中的计算功能)。 7. 根据“native

58、 ID=0x<十六进制值>”检查 Thread Dump,直到您找到出现问题的线程。 下面是仅使用 pslist 和 Thread Dump 的步骤示例:1. 运行 pslist -d 172java 1720:Tid Pri    Cswtch            State     User Time   Kernel Time   Elapsed Time1

59、520   8      9705     Wait:UserReq  0:00:23.734   0:00:01.772    0:04:55.2641968   9      2233     Wait:UserReq  0:00:04.606   0:00:00.040 &

60、#160;  0:04:54.8741748  15       146     Wait:UserReq  0:00:00.010   0:00:00.010    0:04:54.8631744  11        62     Wait:UserReq  0:00:00.010&#

61、160;  0:00:00.000    0:04:54.8531420  15         3     Wait:UserReq  0:00:00.000   0:00:00.000    0:04:54.5631856  15         7  &

62、#160;  Wait:UserReq  0:00:00.000   0:00:00.000    0:04:54.5631860   9      3157     Wait:UserReq  0:00:03.314   0:00:00.160    0:04:54.563 412  15    

63、  5888   Wait:DelayExec  0:00:00.000   0:00:00.000    0:04:54.5531864   8         3     Wait:UserReq  0:00:00.000   0:00:00.000    0:04:50.5671660  15

64、        61     Wait:UserReq  0:00:00.000   0:00:00.000    0:04:42.1252020   8         2     Wait:UserReq  0:00:00.000   0:00:00.00

65、0    0:04:42.0251532   8         2     Wait:UserReq  0:00:00.000   0:00:00.000    0:04:42.0151332   8         2    

66、 Wait:UserReq  0:00:00.000   0:00:00.000    0:04:42.005.2. 一段时间后再次进行相同的输出,以获得线程的另一个快照,查明哪一个线程已经显著增大。 3. 确定要进一步检查的线程 ID (TID)。  4. 再次运行 pslist: pslist -d 1720java 1720:  Tid Pri    Cswtch         

67、   State     User Time   Kernel Time   Elapsed Time1520   8      9705     Wait:UserReq  0:00:23.734   0:00:01.772    0:08:14.5111968   8   &

68、#160;  6527     Wait:UserReq  0:00:06.309   0:00:00.070    0:08:14.1201748  15       157     Wait:UserReq  0:00:00.010   0:00:00.010    0:08:14.1102072 

69、60; 8        13     Wait:UserReq  0:00:00.000   0:00:00.000    0:08:01.2312068   8        20     Wait:UserReq  0:00:00.000   0:00:00.00

70、0    0:08:01.2212044   8        15     Wait:UserReq  0:00:00.000   0:00:00.000    0:08:01.2212000   8       657     Wait:UserReq&#

71、160; 0:00:00.090   0:00:00.010    0:08:01.211 588  10     59123     Wait:UserReq  0:00:48.830   0:00:02.633    0:08:01.2111784   8       150  

72、60;  Wait:UserReq  0:00:00.090   0:00:00.000    0:08:01.2011756   8       251     Wait:UserReq  0:00:00.941   0:00:00.000    0:08:01.2011716   8   

73、60;     6       Wait:Queue  0:00:00.000   0:00:00.000    0:08:01.1911800   8      1457       Wait:Queue  0:00:00.761   0:00:00.210 

74、0;  0:08:01.191注意,线程 ID 588 正在使用最多的用户/内核时间,因此占用最多的 CPU 资源。显然,该线程有问题。5. 记录线程 ID 号 588,并将其转换为十六进制值 (0x24c)。  6. 查看您在出现问题时所记下的 Thread Dump,并查找“native ID=0x24c”。 从以下输出中可以看出,它对应于 Thread Dump 中的线程:3XMTHREADINFO "Servlet.Engine.Transports:915" (TID:0x34B82C78, sys_thread_t:0x778F7670, s

75、tate:MW, native ID: 0x24c) prio=5         at .SocketOutputStream.socketWrite0(Native Method)         at .SocketOutputStream.socketWrite(SocketOutputStream.java:92)         at .Sock

76、etOutputStream.write(SocketOutputStream.java:136)            at java.io.PrintWriter.write(PrintWriter.java:247)         at java.io.PrintWriter.print(PrintWriter.java:378)      

77、;   at java.io.PrintWriter.println(PrintWriter.java:515)         at examples.servlets.HelloWorld2.service(HelloWorld2.java:94)         at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)  

78、 显然,问题出现在 socketWrite本地方法上,但表面看起来是 HelloWorld2.service()出错。7. 检查行号(HelloWorld2.java的第 94 行)以确定发生的情况。 从 service()方法的 HelloWorld2.java 代码片断:89      out.println(ExampleUtils.returnHtmlHeader("Hello World 2");     90    

79、0; out.println("<h4>");     91          for (int i=0;i<100000000;i+)      92                  int j = 0;     93                  j = j +i;     94      out.println(defaultGreeting + " " + defaultName + "!");

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论