cpu飚高分析

发布时间 2023-11-09 09:43:42作者: 做时间的好朋友

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()