weblogic8/redhat linux上weblogic进程占用CPU高实例
注:部分内容由tdy218提供$ ps -ef|grep java
bea 313531150 16:33 pts/0 00:00:05 /home/bea/bea8/jdk142_05/bin/java -server -Xms256M -Xmx256M -Dweblogic.Name=myserver -Dweblogic.ProductionModeEnabled=true -Djava.security.policy=/home/bea/bea8/weblogic81/server/lib/weblogic.policy weblogic.Server
然后进行如下的操作:
$ ps -Lp 3135 cu
USER PID LWP %CPU NLWP %MEM VSZRSS TTY STAT START TIME COMMAND
bea 313531350.1 63 23.5 514408 121584 pts/0 Sl 16:33 0:05 java
bea 313531360.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531370.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531380.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531390.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531400.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531410.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531420.1 63 23.5 514408 121584 pts/0 Sl 16:33 0:05 java
bea 313531430.1 63 23.5 514408 121584 pts/0 Sl 16:33 0:05 java
bea 313531440.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531450.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531460.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531470.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531480.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531490.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531500.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531510.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531520.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531530.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531540.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531550.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531560.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531570.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531580.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531590.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531600.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531610.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531620.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531630.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531640.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531650.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531660.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531679.8 63 23.5 514408 121584 pts/0 Rl 16:33 5:46 java
bea 31353168 11.2 63 23.5 514408 121584 pts/0 Rl 16:33 6:35 java
bea 31353169 24.7 63 23.5 514408 121584 pts/0 Rl 16:3314:30 java
bea 31353170 25.0 63 23.5 514408 121584 pts/0 Rl 16:3314:42 java
bea 313531710.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531720.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531730.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531740.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531750.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531760.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531770.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531780.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531790.1 63 23.5 514408 121584 pts/0 Sl 16:33 0:04 java
bea 313531800.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531810.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531820.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531830.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531850.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531860.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531870.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531880.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531890.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531900.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531910.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531920.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531930.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531940.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531950.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531960.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531970.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
bea 313531980.0 63 23.5 514408 121584 pts/0 Sl 16:33 0:00 java
$
本文档的目的是为了诊断java进程占用CPU异常过高故障的,使用ps命令看到的CPU%并非当前的CPU占用值,是个历史值,要想获得当前的、准确的CPU占用率,需用top命令
然后运行一个可以造成CPU占用很高(死循环等)的java web程序:
关键代码(好久没写代码了,很A级的一段代码):
package tdy218.alg;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
publicclass DeadLoop extends HttpServlet{
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
public void service(HttpServletRequest request,HttpServletResponse response) throws IOException
{
try{
while(true){
Math.exp(Math.PI);//求欧拉数e的π次幂.
}
}
catch(Exception e){
while(true){
Math.exp(Math.PI);
}
}
}
}
部署并运行.
接着执行下面的命令:
# top -Hp 2577 -d 1 -n 1
Tasks:53 total, 2 running,51 sleeping, 0 stopped, 0 zombie
Cpu(s): 39.5%us, 15.6%sy,0.0%ni, 30.4%id, 14.2%wa,0.1%hi,0.3%si,0.0%st
……………………
PID USER PRNIVIRTRESSHR S %CPU %MEM TIME+ UID COMMAND
2577 root 15 0612m 587m 1512 S0.0 61.5 0:28.62 0 java
2580 root 22 0612m 587m 1512 S0.0 61.5 0:00.00 0 java
2581 root 18 0612m 587m 1512 S0.0 61.5 0:00.00 0 java
2582 root 18 0612m 587m 1512 S0.0 61.5 0:00.00 0 java
……………………
2602 root 19 0612m 587m 1512 S0.0 61.5 0:00.00 0 java
2603 root 25 0612m 587m 1512 R 95.6 61.5 4:02.32 0 java
……………………
可以多执行几次(更准确),并将结果输出到一个文件中,可加"-b”参数.
如果还想对CPU占用进行排序,可结合sort等排序命令(看sort命令的帮助).
然后记下这个PID为2603的线程,并对该java进程做kill -3操作:
kill -3 2577
做完上面的操作,你将得到两个重要的信息:一个是占用CPU最高的1个或多个pthread id(即上面的PID列,其实就是LWP对应的内核线程号)和Thread Dump信息(对于WebLogic Server来说,默认在标准输出中,如果在启动时指定了标准输出重定向到一个文件中,那么请找从该文件中找到本次kill -3操作生成的Thread Dump的完整信息,另存到一个文本文件中,文件名自定)。
从上一步拿到的占用CPU很高的1个或多个内核线程号(pid)和Thread Dump信息,根据WebLogic Server使用的JVM的供应商不同,分下面2个分析方法:
1.使用的是Sun HotSpot JVM
需将那个(些)内核线程号(pid)转换成16进制的值,在Thread Dump信息信息中搜索nid等于该值的线程即可,如下:
"ExecuteThread: '14' for queue: 'weblogic.kernel.Default'" daemon prio=1 tid=0x09d11df0 nid=0xa2b runnable
at java.lang.StrictMath.exp(Native Method)
at java.lang.Math.exp(Math.java:234)
at tdy218.alg.DeadLoop.service(DeadLoop.java:17)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
…………………
由于JVM使用的glibc版本等原因,Sun HotSpot JVM 1.4.2 update 11(包含该版本)的threaddump信息中不包含nid,这时需要升级Sun HotSpot JVM 1.4.2 update 11的小版本即可,如: update 12,在1.4.2这个大版中,也是从这个版本开始支持发生OutOfMemoryError故障时生成HeadDump文件的。
2.使用的是Oracle JRockit JVM
只接拿那个(些)内核线程号(pid) 的值,在Thread Dump信息信息中搜索tid等于该值的线程即可(从 JRockit 的 70SP4RP2 和 81SP2RP1 以后的版本起,就可实现此映射,Linux下WebLogic Server自带的JRockit R26.3就是在他们之后的版本),因为JRockit JVM的Thread Dump信息中不包含nid的值,不过JRockit JVM提供一个更简单的tid,等于那个(些)内核线程号(pid)的值,而且是十进制的,无需进行进制转换。如下:
"ExecuteThread: '14' for queue: 'weblogic.kernel.Default'" id=25 idx=0x32 tid=2603 prio=5 alive, in native, daemon
at <unknown>(???.c)@0xb7fc4402
at ptWaitForEvent+45(:0)@0xb7e92b31
at vmtWaitUntilNotSoftSuspended+70(:0)@0xb7e9e436
at tsCheckTransitToJava+26(:0)@0xb7e9e50a
at java/lang/StrictMath.exp(D)D(Native Method)
at java/lang/Math.exp(D)D(Math.java:234)
at tdy218/alg/DeadLoop.service(Ljavax/servlet
/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V
(DeadLoop.java:17)
………………………
页:
[1]