用python提前预测jvm cpu100%自动dump thread升级版

Posted 程序员石磊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用python提前预测jvm cpu100%自动dump thread升级版相关的知识,希望对你有一定的参考价值。

本文来自工作实战,xx地方线上系统今年jvm cpu100%好几次,给了运维同学一个bat脚本需要在cpu100%的时候,手动执行去dump thread提取线索,每次cpu100%的时候影响范围很大,运维同学很紧张赶快重启服务,导致提取不到线索。这种方式很原始与倡导自动化运维的今天格格不入。

方法总是有的,并且很简单,动动脑筋点子就有了:程序自动检测当cpu超过90%自动dump thread

该解决方案采用的核心技术

生命苦短我用python

  • python
  • psutil
  • subprocess
  • 设置windows计划任务来执行python脚本,执行频率设置几分钟一次。

实现思路

核心代码

包含空格才27行

# psutil 模块 用于监控:
# 安装 pip install psutil
# 打包 pyinstaller -F threaddumptool.py
import psutil
import time
import subprocess


# 监控cpu信息:
def cpu():
    cpu = psutil.cpu_count(False)  # cpu核数 默认逻辑cpu核数,False查看真实cpu核数;
    cpu_per = int(psutil.cpu_percent(2))  # 每秒cpu使用率,(1,True) 每一核cpu的每秒使用率;
    #	print(cpu_per)
    return cpu_per


def dump(count):
    for proc in psutil.process_iter(['pid', 'name']):
        if 'java' in proc.info['name']:
            print(proc.info)
            psexecPath = 'D:\\PSTools\\psexec'
            jdkPath = 'D:/work/software/Java/jdk1.8.0_25/bin/jstack.exe'
            print(psexecPath+' -s '+jdkPath+' -l %s > d:/threaddump%s_%d.txt'% (proc.info['pid'], proc.info['pid'],count))
          
            subprocess.Popen(psexecPath+' -s '+jdkPath+' -l %s > d:/threaddump%s_%d.txt' % (proc.info['pid'], proc.info['pid'],count), shell=True)
            # subprocess.Popen('jstack  %s  > d:/threaddump%s_%d.txt' % (proc.info['pid'], proc.info['pid'],count), shell=True)
            # subprocess.Popen('jrcmd   %s  print_threads > d:/threaddump%s.txt' % (proc.info['pid'], proc.info['pid']), shell=True)
            # psexec -s D:\\work\\software\\Java\\jdk1.8.0_25\\bin\\jstack.exe -l %s > d:/threaddump%s.txt

def main():
    timer(1)    

def timer(n):
    fileCount = 0
    while True:
        cpu_info = cpu()
        print("cpu占用%s"% (cpu_info))
        if cpu_info > 60:
            fileCount = fileCount + 1
            dump(fileCount)
            time.sleep(60)
            if fileCount > 10:
                break
        time.sleep(n)
main()


效果图

运行脚本

dump的线程部分截图

打包EXE

在项目根目录输入 pyinstaller -F threaddumptool.py

python真的很香,如果您觉得不错请帮忙再看或转发!

以上是关于用python提前预测jvm cpu100%自动dump thread升级版的主要内容,如果未能解决你的问题,请参考以下文章

Python 中的 multiprocessing.dummy 未使用 100% cpu

Python 中的 multiprocessing.dummy 未使用 100% cpu

三步排查JVM cpu 100%问题

CentOS 6 中的 JVM 总是超过 100% CPU 使用率

Java内存异常触发FGC无效导致CPU持续100%原因(线上JVM排查之三)

Java内存异常触发FGC无效导致CPU持续100%原因(线上JVM排查之三)