首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

Windows上对WebSphere运行时内存溢出.CPU占用率高和自动停止的有关问题的监控

2012-12-21 
Windows下对WebSphere运行时内存溢出.CPU占用率高和自动停止的问题的监控Windows下对WebSphere运行时内存

Windows下对WebSphere运行时内存溢出.CPU占用率高和自动停止的问题的监控

Windows下对WebSphere运行时内存溢出.CPU占用率高和自动停止的问题的监控

1.? ?? ? 出现内存溢出的时候.

在WebSphere运行的时候,如果出现了内存溢出,那么原因是多样的.可能是因为程序中有不良的代码,引致申请了的内存不能在使用后被释放. 可能因为程序结构不善,引致websphere容器花费大量开销用于优化造成.

这里有一点要特别注意,内存溢出的时候,通常的表现是Websphere的服务没有了响应,所以当服务没有响应的时候,我们可以假设其为内存溢出,然后按步骤做相应的信息收集.

无论哪种原因. 内存溢出的问题可以分成两类.

??NATIVE 这一类内存溢出,是整个Websphere进程在操作系统中的内存溢出,Websphere自身已经不能控制

? ? HEAP 这一类内存溢出是在容器管理下的程序运行出现了内存溢出.这一类的溢出能够在websphere的javacore中找到信息(下面我们会再次提到.)



先说一下,出现NATIVE类内存溢出的时候要如何处理.

? ? 要对Websphere进行设置.开放详细垃圾收集选项.
步骤如下.(Webshpere版本 6.0.2.7)

在浏览器中输入http://服务器ip:9060/ibm/console 进入Websphere 管理控制台-> 登录->服务器->应用程序服务器->在服务器列表中选择需要调试的服务器->java和进程管理->进程定义->java虚拟机->将详细垃圾回收选项选上.

? ???使用userdump工具生成系统的内存境像,然后通过对境像的分析定位出现内存溢出的进程(userdump工具的下载路径: http://download.microsoft.com/do ... 5/EN-US/Oem3sr2.zip)
首先运行netstat -an > netstat_before.out 将收集数据时的网络状态记录下来.

打开Websphere的SystemOut.log文件,将文件最近的一次服务器启动记录找到.在这个记录中会找到现在正在运行并发生内存溢出的java进程的进程号.(如果最近一次启动服务器是失败的,那么在服务器对应的log目录中能找到一个server_name.pid文件记录中找到对应的进程号.)

然后在windows的命令行模式下,运行

userdump PID

这个PID就是先前的步骤中找到的websphere进程号

这样会生成一个叫java.dmp的文件. 将其改名成java1.dmp.

两分钟后再运行多一次userdump.生成的文件改名为java2.dmp.

两分钟后再运行多一次userdump.生成的文件改名为java3.dmp.

这样就能生成用于分析的系统内存映像文件.



(如果上面的步骤出现了问题,例如生成java.dmp的过程不能完成.还可以使用dr. watson强制生成userdump文件.方法如下:

在命令行中运行:

drwtsn32 -p pid

生成的userdump文件会放在

operating_system_root\Documents and Settings\
All Users\Application Data\Microsoft\Dr Watson

但这种做法的会同时停止java.exe进程.因此只有其它的生成userdump方法失效的情况下才合适使用.)



??使用wsadmin生成javacore,从javacore看出内存问题. (具体步骤请参阅2出现CPU占用率高的时候)


2.? ?? ? 出现CPU占用率高的时候

如果在WebShpere运行的过程中出现了高CPU占用率的引起的原因是多样的.但这里要分清楚瞬时高CPU占用率和占用率居高不下两种情况. 前者是正常的,因为有很多不同的程序在系统中运行,因为进程间的优先级,和CPU的能力所致,很多时候会出现一小段时间内CPU占用率的大幅提高.我们这里要描述的问题,是指CPU占用率高上去之后下不来的情况.

? ???先要在Windows系统中设置CPU占用率的监控.步骤如下.

在Windows的管理工具中选择 性能??打开性能监控器

?
点击工具栏上的”添加”增加监控内容,将右边方框中所有的java线程都进行选择.左边则选择Processor Time , ID Process ,ID Thead,如图

?
同样的操作,在计数器日志中要设置.

选择性能监控器中的计数器日志,点击右键->新建日志设置->输入名称->确定->添加计数器->然后仍是将所有的java线程选中,也选上Processor Time , ID Process ,ID Thead

如是图
?
这样做的目的,是让性能监控中内容,能在固定的log文件中记录下来.

? ?? ? 当cpu出现高占用率的时候,要在windows命令行方式中手动生成websphere的javacore,步骤如下.

netstat -an > netstat_before.out

这个命令用于记录生成javacore时的网络状况.



在没有开启websphere soap安全方式情况下,使用

wsadmin.bat

打开websphere管理台.

如果在SOAP方式下,就要加入参数,命令行格式如下:

wsadmin.bat [-host host_name] [-port port_number] [-user userid[-password password]

在启动了wsadmin的状态后,运行以下命令设置好环境

wsadmin>set jvm [$AdminControl completeObjectName type=JVM,process=server1,*]

上面的server1就是要生成javacore的服务器的名称



环境设置好后,在wsadmin状态下运行

wsadmin>$AdminControl invoke $jvm dumpThreads

这样会生成一个javacore.

然后2分钟后再次运行



然后2分钟后再次运行



这样,就能在%Websphere%/AppServer/profiles/服务器名/ 这个目录下找到手动生成的三个javacore

? ?? ???生成了javacore后,就通过性能监控器中,找到CPU占用率高的线程,然后我们可以看到下图

?
ID Thread中就是占用率高的线程号. 这个号是十进制的,将其转换成16进制的数字.例如图中的数字的十六进制形式是0xD98

这样我们能在刚才生成的javacore中找到这样的句子

"SoapConnectorThreadPool : 0" (TID:0x10A25A98, sys_thread_t:0x24A31B30, state:R, native ID:0xD98) prio=5

这个十六进制的进程号就是对应javacore中native id = 0xD98的内容,这样我们就能大致知道这个引起cpu占用率高的线程在做什么,然后进行排错调试.





3.? ?? ? 出现自动停止的问题的时候.

当出现了更严重的情况,websphere的线程自动停止了.那以首先要需要两个方面的数据.

? ?? ???程序中止时的自动NATIVE 的内存镜像.

这个工作需要借助Dr.Watson,

点击开始菜单->运行….->运行

drwtsn32

打开dr.Watson程序的窗口

?
对Dr.Watson的设置如图中所视,特别注意的内容是设置故障转储目录.当程序中止,我们在所设置的目录中找到需要的userdump文件.

设置好后

点击开始菜单->运行….->运行

drwtsn32 –i

这样,dr.Watson被设置为系统默认的调试器,会在程序中止时生成内存映像

至于Heap类型的内存映象,因为在Webshpere在中止时,会自动生成javacore文件,因为在程序中止后,直接到

%Websphere%/AppServer/profiles/服务器名/ 这个目录下找到自动生成的最新javacore就可以了





以上三个问题中所收集的数据,可以进行自己分析,对于javacore文件,分析工具是mddfj.IBM的网站上有相关文章介绍,在这里不再赘述.

也可以将这些文档发给IBM的客户服务中心,让他们的技术人员帮助分析.

热点排行