#!/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 {} /;