侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

cpu高消耗线程以及内存高消耗的具体情况

2023-12-21 星期四 / 0 评论 / 0 点赞 / 150 阅读 / 10947 字

#!/bin/bash #When the CPU is more than fifty percent,Record the highest occupancy resources class #M

#!/bin/bash
#When the CPU is more than fifty percent,Record the highest occupancy resources class
#More than sixty percent when memory, records the highest consumption parts
#date:2016-09-05
TERM=linux        ###top设定自动执行任务时得指定终端
export TERM
pre_dir="/data/scripts/mem_leakage"
Process=`ps aux |grep tomcat |grep -v grep | awk '{print $2}'`

#thread=`top -Hp 18641 |grep java |head -n 5 |awk '{print $1}'`

Date=`date +"%Y%m%d"`

detail_date=`date +"%Y%m%d%H%M"`

Date_detail=`date +"%Y-%m-%d %H%M%S"`

log_dir="/data/log/ques_class"

logdir=$log_dir          #日志路径
log=$logdir/log.log            #日志文件 
is_font=1                #终端是否打印日志: 1打印 0不打印 
is_log=1                 #是否记录日志: 1记录 0不记录


datef(){
date "+%Y-%m-%d %H:%M:%S"
}
   
print_log(){
if [[ $is_log -eq 1  ]];then
[[ -d $logdir ]] || mkdir -p $logdir
echo -e "[ $(datef) ] $1" >> $log
fi
if [[ $is_font -eq 1  ]];then
echo -e "[ $(datef) ] $1"
fi
}

[ -d $log_dir ]|| mkdir -p $log_dir

[ -d $pre_dir ]|| mkdir -p $pre_dir

source /etc/profile 
#判断单个进程cpu是否超过50%
process_get () {
   cpu_num=`cat /proc/cpuinfo  |grep cores|wc -l`
   for process_id in $Process
   do
       cpu_consume=`top -b -n 1 | grep $process_id | awk '{print $9}'|tail -1|cut -d"." -f1`
       print_log "cpu消耗语句 top -b -n 2 | grep $process_id | awk '{print /$9}'|tail -1|cut -d"." -f1   /n值: $cpu_consume"    
       if [[ $cpu_consume -gt ${cpu_num}*50 ]]
       then
          print_log "进程ID:$process_id 服务目前异常"
            need_id=$process_id
       else
            print_log "进程ID:$process_id 服务目前正常"
       fi
   done

}

#消耗CPU最高的类或者方法如下
ques_class () {
   #need_id='12502'
   if [[  -z  $need_id  ]]
   then
       return 0
   fi
   echo "need_id: $need_id"
   #thread_id=`top -Hp $need_id |grep java |head -n 5 |awk '{print $1}'`    ###取消耗cpu资源最高的前五线程
   top -Hp $need_id -bn 1 |grep java |head -n 5 |awk '{print $1}' > /tmp/java.txt    ###取消耗cpu资源最高的前五线程

   while read  ques_thread 
   do
       ques_thread=$(echo "$ques_thread" |awk -F'm' '{print $NF}')
       key=$(printf '%x/n' $ques_thread)   ###十六进制转换
       #key=`echo "ibase=10;obase=16;$ques_thread"|bc`   ###十六进制转换
       echo "线程ID:$ques_thread ,转换后的十六进制: $key"
       java_comm=`ps aux |grep $need_id|awk '{print $11}' |grep -v grep`
       #exit            
       java_path=${java_comm%/*}        ###获取进程JDK路径
       echo "$java_path" > ${pre_dir}/jre.txt
       jre_judge=$(grep 'jre/bin' ${pre_dir}/jre.txt |wc -l)
       echo "$jre_judge"
       if [[ $jre_judge == 1 ]];then
             java_path=$(sed 's/jre////' ${pre_dir}/jre.txt)
       else
             echo "$java_path 不变"
       fi
       ques_content=`$java_path/jstack $need_id |grep $key`
       echo "${Date_detail} 有问题消耗cpu高的类和方法如下 $ques_content" >> $log_dir/${detail_date}cpu.log
       print_log "${Date_detail} 有问题消耗cpu高的类和方法如下 $ques_content"

   done < /tmp/java.txt

}


###获取堆的使用分布以及超过百分之八十五时,获取内存消耗的详细分布
heap_analy () {
   max_dump_mem_set=46
   max_per_mem_set=40    
   mem_process=`top -b -n 1 |grep java |awk '{print $10,$1}' |sort -rn |head -n 1`    ###获取内存占比最高的进程内存比
   mem_value=`echo $mem_process|cut -d" " -f1|cut -d"." -f1`     ###获取内存比值
   process_id=`echo $mem_process|cut -d" " -f2`                  
   java_comm=`ps aux |grep $process_id|awk '{print $11}'|grep -v grep`        
   java_path=${java_comm%/*}        ###获取进程JDK路径
   echo "$java_path" > ${pre_dir}/jre.txt
   jre_judge=$(grep 'jre/bin' ${pre_dir}/jre.txt |wc -l)
   if [[ $jre_judge == 1 ]];then
        java_path=$(sed 's/jre////' ${pre_dir}/jre.txt)
   else
        echo "$java_path 不变"
   fi   
   timer=`cat $pre_dir/timer`                                    ###计时器,大于3时先停止,等待半个小时
   first_time=`cat $pre_dir/first_time`                          
   termination_time=`cat $pre_dir/termination_time`
   max_py_mem=$(cat /proc/meminfo  |grep MemTotal |awk '{print $2}')
   max_py_mem=$(expr $max_py_mem / 1024  )
   if [[ $mem_value -gt 85 ]] ;then
       print_log  "内存使用超过了$mem_value%,当前服务器最大内存:${max_py_mem}M"    
       $java_path/jmap -heap $process_id >> $log_dir/heap${Date}
       #timer=$(($timer+1))
       if [[ $timer -gt 3 ]]; then
           if [[ $termination_time -eq 0 ]];then
               pre_time=`date +"%s"`
               echo "$pre_time" > $pre_dir/termination_time
           else
               pre_time=`date +"%s"`
               interval_time=$(($pre_time-$termination_time))
               if [[ $interval_time -gt 1800 ]];then
                    echo "0" > $pre_dir/termination_time
               else
                    echo "停留时间没到半小时,继续等到" 
               fi
           fi
           
       else
           
           if [[ $first_time -eq 0 ]]; then
               first_time=`date +"%s"` 
               echo $first_time > $pre_dir/first_time
               timer=$(($timer+1))
               echo "$timer" > $pre_dir/timer
           print_log "开始捕获内存的线程状态: $java_path/jmap -dump:format=b,file=$log_dir/${detail_date}_mem.dump $need_id"    
               $java_path/jmap -dump:format=b,file=$log_dir/${detail_date}_mem.dump $need_id
               
           else
               pre_time=`date +"%s"`
               interval_time=`expr $pre_time - $first_time`
               if [[ $interval_time -gt 1800 ]];then
                   echo "0" > $pre_dir/timer
                   echo "0" > $pre_dir/first_time
              
               else
                   timer=$(($timer+1)) 
                   echo "$timer" > $pre_dir/timer
            print_log "开始捕获内存的线程状态: $java_path/jmap -dump:format=b,file=$log_dir/${detail_date}_mem.dump" $need_id
                   $java_path/jmap -dump:format=b,file=$log_dir/${detail_date}_mem.dump $need_id 
               fi
           fi
       fi
        
   elif [[ $mem_value -gt 60 ]];then
       mem_info=$($java_path/jmap -heap $process_id |tee  $log_dir/heap${Date}.log)
       print_log "输出内存概要分析:$mem_info"
        
       #$java_path/jmap -heap $process_id >> $log_dir/heap${Date}.log
      
   else
       print_log "目前系统内存正常"
   fi
   print_log "结束内存捕获."
}


process_get
ques_class

heap_analy

cd $log_dir
find ./ -mmin +120 -exec rm -f {} /;
 

广告 广告

评论区