最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java根據(jù)負(fù)載自動(dòng)抓取jstack?dump詳情

 更新時(shí)間:2022年09月27日 15:03:59   作者:sdmei  
這篇文章主要介紹了java根據(jù)負(fù)載自動(dòng)抓取jstack?dump詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

java應(yīng)用CPU有波動(dòng),事后怎么分析?

目前我采用的方案是根據(jù)CPU負(fù)載自動(dòng)執(zhí)行jstack,并將文件上傳到OSS。

 環(huán)境:阿里云 + k8s + springcloud + prometheus + oss

容器鏡像安裝python 2.7

涉及以下幾個(gè)文件:

oss相關(guān)的文件包括:oss客戶端和配置文件;

邏輯主要在腳本:mon_cpu_jstack.py 

  • 兩個(gè)參數(shù):CPU閾值,profile環(huán)境(prod \ test等)
  • 每10s 執(zhí)行一次腳本(跳過起初的3分鐘,因?yàn)閼?yīng)用啟動(dòng)時(shí)CPU負(fù)載高是正常的);
  • 通過top獲取CPU,超過閾值則執(zhí)行jstack;
  • 如果CPU消耗最大進(jìn)程是GC,拉取jmap信息;
  • 每小時(shí)最大執(zhí)行3次jstack(太多無意義);
  • 生成文件后通過oss客戶端上傳OSS;
# more mon_cpu_jstack.py 
# -*- coding: utf-8 -*-
import time
import commands as cm
import os,sys
from signal import signal, SIGPIPE, SIG_DFL
 
signal(SIGPIPE,SIG_DFL)
if len(sys.argv) != 3:
    print 'Usage: ' + sys.argv[0] + ' [cpu_threshold] [profiles]'
    sys.exit(1)
 
cpu_th = float(sys.argv[1])
profiles = sys.argv[2]
 
base_dir = '/opt/perf'
 
time_list = []
 
def oss_upload(app_name,logfile):
    comm_upload = base_dir + '/ossutil64 -c ' + base_dir + '/ossutilconfig cp ' + logfile + ' oss://k8s-jstack-log/' + profiles + '/' + app_name + '/'
    comm_delete = 'rm -f ' + logfile
    os.system(comm_upload)
    time.sleep(1)
    os.system(comm_delete)
    
def mon_and_catch():
    global time_list
    # up to 3 times hourly
    if len(time_list) == 3:
        if time.time() - time_list[-1] <= 3600:
            return
    
    host_name = cm.getoutput('hostname')
    java_pid = cm.getoutput('top -b -n1 | grep java|awk \'{printf $1}\'')
    if (java_pid == ''):
        print 'no java_pid'
        return

    cpu_pct_str = cm.getoutput('top -b -p ' + java_pid + ' -n1 | tail -1 |awk \'{printf $9}\'')
    cpu_pct = float(cpu_pct_str)
    time_str = time.strftime("%Y-%m-%d_%H-%M-%S", time.localtime())
    log_name = base_dir + '/' + host_name + '_' + time_str + '_cpu_' + cpu_pct_str.split('.')[0] + '.log'
 
    if(cpu_pct > cpu_th):
        time_list.insert(0, time.time())
        time_list = time_list[:3]
          
        os.system('top -Hbp' + java_pid + ' -n1 >> ' + log_name)
        os.system('echo >> ' + log_name)
        os.system('jstack -l ' + java_pid + ' >> '+log_name)
        
        # if cpu is used by gc, exec jmap
        top_thread_id = cm.getoutput('cat ' + log_name + ' | grep java | head -1 | awk \'{print $1}\'')
        top_thread_id_hex = "0x" + cm.getoutput('printf \'%x\n\' ' + top_thread_id) + " "
        top_thread_gc = cm.getoutput('cat ' + log_name + ' | grep "' + top_thread_id_hex + '" | grep "GC" | wc -l')
        if top_thread_gc == '1':
            os.system('echo >> ' + log_name)
            os.system('jmap -histo:live ' + java_pid + ' | head -100 >> ' + log_name)
        
        # get app_name from hostname
        hostname_list = host_name.split('-')
        app_name_list = hostname_list[:len(hostname_list)-2]
        app_name='-'.join(app_name_list)
        if app_name[-1] in ['1','2']:
            app_name = app_name[:len(app_name)-1]
        
        oss_upload(app_name, log_name)
 
if __name__ == '__main__':
    i = 0
    while (True):
        # skip at startup
        if i > 18:
            mon_and_catch()
        time.sleep(10)
        i = i + 1

poststart.sh調(diào)用上述python腳本(profile直接從環(huán)境變量中獲?。?/p>

# more poststart.sh 
cpu_th=$1
nohup python -u /opt/perf/mon_cpu_jstack.py ${cpu_th} ${spring_profiles_active} > /opt/perf/poststart.log 2>&1 &
exit 0

通過postStart調(diào)用腳本自動(dòng)執(zhí)行:

 最終生成的oss文件:

第一層目錄:profiles

第二層目錄:應(yīng)用名稱

第三層目錄:具體jstack文件

文件名最后的數(shù)字是當(dāng)時(shí)的CPU使用量,如166指1.66C

到此這篇關(guān)于java根據(jù)負(fù)載自動(dòng)抓取jstack dump詳情的文章就介紹到這了,更多相關(guān)java抓取jstack dump內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

岗巴县| 寻甸| 石城县| 吉木萨尔县| 上杭县| 南涧| 郯城县| 沐川县| 霞浦县| 韶山市| 德钦县| 西安市| 繁昌县| 冷水江市| 茂名市| 武鸣县| 鄄城县| 盐津县| 兰考县| 元江| 梓潼县| 长春市| 临夏县| 峡江县| 阜康市| 三河市| 咸丰县| 焦作市| 稷山县| 方正县| 安吉县| 宁安市| 封开县| 多伦县| 英吉沙县| 丰镇市| 高台县| 英吉沙县| 南澳县| 西乌| 淅川县|