版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 积极情绪课程设计
- 2024年松香项目规划申请报告模范
- 有线电视接收器市场环境与对策分析
- 毛皮相关项目建议书
- 2024年含高功能组分的低聚糖项目提案报告模范
- 2024年磷项目规划申请报告模范
- 发送arp课程设计步骤图解
- 油炉家用取暖器项目可行性实施报告
- 简历课程设计幼儿园老师
- 6大核心素养课程设计
- 口腔颌面部肿瘤概论(口腔颌面外科课件)
- 统编版四年级上册语文第二单元 习作:我的家人 课件
- 统编版(2024新版)道德与法治七年级上册6.2《交友的智慧》教案
- 安全隐患排查月度分析
- 户口未婚改已婚委托书
- 中华民族共同体概论课件专家版2第二讲 树立正确的中华民族历史观
- 政府采购代理机构内部监督管理制度
- 运维质量管理体系及保障措施方案
- 【自考复习资料】00288社会调查方法(按章节整理)
- 特种设备使用单位日管控、周排查、月调度示范表
- 新人教版初中物理实验一览表
评论
0/150
提交评论