[原创]WEBLOGIC Server 的异常高 CPU 占用率_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2508 | 回复: 0   主题: [原创]WEBLOGIC Server 的异常高 CPU 占用率        下一篇 
panpan.nie
注册用户
等级:大校
经验:4754
发帖:217
精华:2
注册:1970-1-1
状态:离线
发送短消息息给panpan.nie 加好友    发送短消息息给panpan.nie 发消息
发表于: IP:您无权察看 2015-8-5 15:04:50 | [全部帖] [楼主帖] 楼主

WEBLOGIC Server 的异常高 CPU 占用率

问题描述
系统管理员或用户注意到 WebLogic Server 进程消耗大量的 CPU 资源,并想要了解是哪个方面消耗了大量 CPU 资源,以及导致出现这种现象的原因。

故障排除
请注意,并非下面所有任务都需要完成。有些问题仅通过执行几项任务就可以解决。

为什么发生此问题?
发生此问题有许多原因:WebLogic Server 本身、用户创建的线程、不良编码习惯或第三方软件。遗憾的是,证明在什么地方发生此问题有时候非常困难。本模式尝试通过利用特定操作命令和收集数据来帮助排除此问题。

收集高 CPU 占用率的数据
对于有关收集高 CPU 占用率的数据的特定操作信息,请根据您的操作系统执行以下步骤。

重要说明:
这些操作系统的所有信息都基于 Sun JVM目前在 JRockit 中还没有办法将 PID 从说明 CPU 占用率的操作系统命令(prstattoppslist 等等)映射到 Thread Dump 中的正确线程。从 Jrockit 的 70SP4RP2 和 81SP2RP1 以后的版本起,就可实现此映射。例如,在 Linux 中,Thread Dump 在以后的版本中将采用如下形式(PID 显示在 Thread Dump 中):

北京联动北方科技有限公司

在上例中,PID 是 23166,您可以通过 Linux 或任何所在系统上的 top(或任何您需要在操作系统上使用的特定命令)输出直接关联该 PID

转换为十六进制号码

备注:为协助您计算在本模式中讨论的十六进制值,您可以在 Shell 脚本中使用下列行将十进制号码转换为十六进制号码。如果您使用 Unix 操作系统,那么转换会很方便。

dec2hex.sh:
printf "dec -> hex: %d = %x \n" ${1} ${1}


用法:

$ sh dec2hex.sh 755
dec -> hex:  755 = 2f3


Windows环境
使用 pslist
您可以在 Windows 中使用pslist并获取 java 进程的线程详细信息。pslist可从以下网址得到:http://www.sysinternals.com/ntw2k/freeware/pslist.shtml

1.运行pslist -d 并将输出结果重定向到一个文件。

2.重复几次这个操作,以便您能够看到一种模式。

您将看到“用户时间”和“内核时间”不断增加。

3.在若干次迭代后对 WLS 服务器进行 Thread Dump

4.记下步骤 中看起来正在增加的线程 ID 号,将十进制值改为十六进制值(您可以使用 Windows 中的计算功能)。

5.根据“nid=0x<步骤 的十六进制值>”检查 Thread Dump,直到您找到出现问题的线程。

6.确定为什么在您的代码中会发生这个问题,或者,如果堆栈的最顶端输出来自 WebLogic,请与 BEA 客户支持部门联系。

使用 Process Explorer
您还可以使用 Systinternals 提供的 Process Explorer http://www.sysinternals.com/ntw2k/freeware/procexp.shtml该工具直观动态显示 CPU 占用率。由于 Process Explorer 没有记录功能或历史记录,您必须监视该程序并记录占用几乎全部 CPU 资源的 Java 进程的线程 ID若要通过 Process Explorer 达到上述目的:

1. 查找 java 进程,然后右键单击并选择属性。

2. 单击“Threads”选项卡以显示与此 java 进程关联的所有线程。

3. 您可以单击以“MSVCRT.dll+<一些十六进制偏移量>”形式列出的其中一个线程。

您可以看到在下面窗格中列出的“Thread ID”。

4. 观察哪一个线程占用最多 CPU 资源。

5. 进行 WLS 服务器的 Thread Dump

6. 记下步骤 中看起来正在占用 CPU 的线程 ID 号,将十进制值改为十六进制值(您可以使用 Windows 中的计算功能)。

7. 根据“nid=0x<十六进制值>”检查 Thread Dump,直到您找到出现问题的线程。

8. 确定为什么在您的代码中会发生这个问题,或者,如果堆栈的最顶端输出来自 WebLogic,请与 BEA 客户支持部门联系。

下面是仅使用 pslist 和 Thread Dump 的步骤示例:

1. 运行pslist -d 172

北京联动北方科技有限公司

2. 一段时间后再次进行相同的输出,以获得线程的另一个快照,查明哪一个线程已经显著增大。

3. 确定要进一步检查的线程 ID (TID)

4. 再次运行pslistpslist -d 1720

北京联动北方科技有限公司

注意,线程 ID 588 正在使用最多的用户/内核时间,因此占用最多的 CPU 资源。显然,该线程有问题。

5. 记录线程 ID 号 588,并将其转换为十六进制值 (0x24)

6. 查看您在出现问题时所记下的 Thread Dump,并查找“nid=0x24”。

从以下输出中可以看出,它对应于 Thread Dump 中的 ExecuteThread 10

北京联动北方科技有限公司

显然,问题出现在socketWrite本地方法上,但表面看起来是HelloWorld2.service()出错。

7. 检查行号(HelloWorld2.java的第 94 行)以确定发生的情况。

service()方法的HelloWorld2.java代码片断:

北京联动北方科技有限公司

可以看出,由于某种原因,输出流是用一个非常长的“for loop”语句编写的。这是错误所在,也是此示例中造成高 CPU 占用率的原因。

如果改正此代码,则 CPU 就不会被完全占用。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论