cpuhighanalysis.py
#!/usr/bin/env python
# -*- coding=utf-8 -*-
############################
import os
import sys
import commands
import time
status,output = commands.getstatusoutput('''ps -ef | grep java | grep -v jcollector | grep -v grep | head -1 | awk "{print \$8}" 2>/dev/null''')
if status ==0 and output:
try:
java_home = os.path.dirname(output)
except Exception,e:
java_home = os.environ.get('JAVA_BIN',None)
else:
java_home = os.environ.get('JAVA_BIN',None)
if java_home:
jstack_command = "%s/jstack"%java_home
jmap_command = "%s/jmap"%java_home
jstat_command = "%s/jstat"%java_home
else:
java_home = "/export/servers/jdk1.6.0_25/bin"
jstack_command = "%s/jstack"%java_home
jmap_command = "%s/jmap"%java_home
jstat_command = "%s/jstat"%java_home
print '使用分析工具版本:%s'%java_home
print '当前top信息如下:'
top_command = '/usr/bin/top -b -n 1'
status,output = commands.getstatusoutput(top_command)
print output
print '#'*100
javas_pid_command = 'ps -ef | grep java | grep -v jcollector | grep -v grep | awk "{print \$2}"'
status,output = commands.getstatusoutput(javas_pid_command)
if status == 0:
javas = output.split('\n')
if javas:
for pid in javas:
status,output = commands.getstatusoutput('ps -ef | grep %s | grep -v grep | awk "{print \$(NF-1)}"'%pid)
if output:
app_name = output
print '应用名:%s'%(app_name)
print 'pid:%s'%(pid)
print '#'*100
print 'java,线程情况统计如下'
status,output = commands.getstatusoutput('ps p %s -L -o pcpu,pid,tid,time,tname,stat,psr | /bin/sort -n -k1 -r | wc -l 2>/dev/null'%(pid))
print '线程数%s'%output
status,output = commands.getstatusoutput('ps p %s -L -o pcpu,pid,tid,time,tname,stat,psr | /bin/sort -n -k1 -r 2>/dev/null'%(pid))
print '线程情况如下,按照占用cpu由大到小排列'
print output
print '占用最高的cpu线程数为:'
#status,output = commands.getstatusoutput('ps p %s -L -o pcpu,pid,tid,time,tname,stat,psr | /bin/sort -n -k1 -r | head -1 | awk "{print \$3}" 2>/dev/null'%(pid))
status,output = commands.getstatusoutput('ps p %s -L -o pcpu,pid,tid,time,tname,stat,psr | /bin/sort -n -k1 -r 2>/dev/null'%(pid))
#print output
most_thread = output.split('\n')[0]
output = most_thread.split()[2]
print output
print '转为16进制如下:'
status,output = commands.getstatusoutput(r'printf "%x\n" {output}'.format(output=output))
print output
print '线程最高的栈信息如下:'
#status,output = commands.getstatusoutput('%s %s|grep -A 50 %s'%(jstack_command,pid,output))
#if status != 0:
#status,output = commands.getstatusoutput('%s -F %s|grep -A 50 %s'%(jstack_command,pid,output))
status,output = commands.getstatusoutput('%s -F %s'%(jstack_command,pid))
print output
else:
print u'javas 进程查找错误'
#removeSelf()