Windows下对WebSphere运行时内存溢出.CPU占用率高和自动停止的问题的监控
1. 出现内存溢出的时候.
在WebSphere运行的时候,如果出现了内存溢出,那么原因是多样的.可能是因为程序中有不良的代码,引致申请了的内存不能在使用后被释放. 可能因为程序结构不善,引致websphere容器花费大量开销用于优化造成.
无论哪种原因. 内存溢出的问题可以分成两类.
l NATIVE 这一类内存溢出,是整个Websphere进程在操作系统中的内存溢出,Websphere自身已经不能控制
l HEAP 这一类内存溢出是在容器管理下的程序运行出现了内存溢出.这一类的溢出能够在websphere的javacore中找到信息(下面我们会再次提到.)
先说一下,出现NATIVE类内存溢出的时候要如何处理.
l 要对Websphere进行设置.开放详细垃圾收集选项.
步骤如下.(Webshpere版本 6.0.2.7)
在浏览器中输入http://服务器ip:9060/ibm/console 进入Websphere 管理控制台-> 登录->服务器->应用程序服务器->在服务器列表中选择需要调试的服务器->java和进程管理->进程定义->java虚拟机->将详细垃圾回收选项选上.
l 使用userdump工具生成系统的内存境像,然后通过对境像的分析定位出现内存溢出的进程(userdump工具的下载路径: http://download.microsoft.com/download/win2000srv/Utility/3.0/NT45/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方法失效的情况下才合适使用.)
2. 出现CPU占用率高的时候
如果在WebShpere运行的过程中出现了高CPU占用率的引起的原因是多样的.但这里要分清楚瞬时高CPU占用率和占用率居高不下两种情况. 前者是正常的,因为有很多不同的程序在系统中运行,因为进程间的优先级,和CPU的能力所致,很多时候会出现一小段时间内CPU占用率的大幅提高.我们这里要描述的问题,是指CPU占用率高上去之后下不来的情况.
l 先要在Windows系统中设置CPU占用率的监控.步骤如下.
在Windows的管理工具中选择 性能 打开性能监控器
点击工具栏上的”添加”增加监控内容,将右边方框中所有的java线程都进行选择.左边则选择Processor Time , ID Process ,ID Thead,如图
同样的操作,在计数器日志中要设置.
选择性能监控器中的计数器日志,点击右键->新建日志设置->输入名称->确定->添加计数器->然后仍是将所有的java线程选中,也选上Processor Time , ID Process ,ID Thead
如是图
这样做的目的,是让性能监控中内容,能在固定的log文件中记录下来.
l 当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
l 生成了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的线程自动停止了.那以首先要需要两个方面的数据.
l 程序中止时的自动NATIVE 的内存镜像.
这个工作需要借助Dr.Watson,
点击开始菜单->运行….->运行
drwtsn32
打开dr.Watson程序的窗口
对Dr.Watson的设置如图中所视,特别注意的内容是设置故障转储目录.当程序中止,我们在所设置的目录中找到需要的userdump文件.
设置好后
点击开始菜单->运行….->运行
drwtsn32 –i
这样,dr.Watson被设置为系统默认的调试器,会在程序中止时生成内存映像
至于Heap类型的内存映象,因为在Webshpere在中止时,会自动生成javacore文件,因为在程序中止后,直接到
%Websphere%/AppServer/profiles/服务器名/ 这个目录下找到自动生成的最新javacore就可以了
以上三个问题中所收集的数据,可以进行自己分析,对于javacore文件,分析工具是mddfj.IBM的网站上有相关文章介绍,在这里不再赘述.
也可以将这些文档发给IBM的客户服务中心,让他们的技术人员帮助分析.
希望这个文档,能帮助大家初步认识当Websphere出问题后,应该如何反应.欢迎批评指导…
这里有一点要特别注意,内存溢出的时候,通常的表现是Websphere的服务没有了响应,所以当服务没有响应的时候,我们可以假设其为内存溢出,然后按步骤做相应的信息收集. |