公司内部全部是java项目,有时项目所在机器负载过高,为了方便分析相关堆栈信息,编写脚本直接打印结果,定位到问题代码
#!/bin/bash
###Author:kane.zhu
###Time:2017-08-22
###Function:print java stack information for troubleshooting
TOMCAT_ID_1=`ps -ef |grep [t]omcat |awk '{print $2}'|head -n 1`
#TOMCAT_ID_2=`ps -ef |grep [t]omcat |awk '{print $2}'|head 2`
CPU_THREAD=`ps -mp $TOMCAT_ID_1 -o THREAD,tid,time |head -n 15|sort -hr |sed -n 1,7p|awk '{print $2,$8}'`
THREAD=`ps -mp $TOMCAT_ID_1 -o THREAD,tid,time |head -n 15|sort -hr |sed -n 3p|awk '{print $8}'`
THREAD_JINZHI=`printf "%x\n" $THREAD`
echo "线程ID为$THREAD十六进制的表示为`printf “%x\n” $THREAD`"
echo "next we will make choice if the question is memory ,u can continue, or not"
###使用jstat -gcutil命令查看进程的内存情况
jstat -gcutil $TOMCAT_ID_1 2000 10
function AVE() {
jstat -gcutil $TOMCAT_ID_1 2000 10 |sed -n 2,11p|awk '{sum+=$i} END {print sum/NR}'
}
###Eden
i=3
EDEN_PER=`AVE`
#echo $EDEN_PER
###OLD_PER
i=4
OLD_PER=`AVE`
####FGC-count
i=9
FULLGC_count=`AVE`
#####计算每次FULLGC所占用的时间
i=10
FGCT=`AVE`
####FULLGC_TIME shell本身不支持浮点数运算 需要借助bc来完成 这里注意
FULLGC_TIME=$(echo "scale=5; $FGCT / $FULLGC_count" |bc)
echo $FULLGC_TIME
echo -e "从输出信息可以看出: \n Eden区内存占用百分比:$EDEN_PER \n old区内存占用百分比:$OLD_PER \n FULL GC的次数 :$FULLGC_count \n 平均每次FULLGC耗时:$FULL_GC_TIME \n 根据以上信息得出你的结论"
####现在开始打印相关的问题线程堆栈信息
echo "we will monitor and print stack about tomcat"
jstack $TOMCAT_ID_1 |grep $THREAD_JINZHI -A 30 >> stack_thread.out
sleep 5
cat stack_thread.out
############### redis 环境内核参数修改 防止OOM killer导致集群挂掉
#!/bin/bash
for redis_pid in ${pgrep -r "redis-server"}
do
echo -17 > /proc/${redis_pid}/oom_adj
done