当前位置 博文首页 > 程序员石磊:用python提前预测jvm cpu100%自动dump thread升级版

    程序员石磊:用python提前预测jvm cpu100%自动dump thread升级版

    作者:[db:作者] 时间:2021-08-08 10:11

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

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

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

    生命苦短我用python

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

    实现思路

    yuque_diagram.jpg

    核心代码

    包含空格才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()
    
    
    

    效果图

    运行脚本
    image.png
    dump的线程部分截图
    image.png

    打包EXE

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

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

    cs