公司转java之后 经常会遇到java进程占用CPU特别多的情况. 每次连上机器进行处理都比较慢了. 索性自己写一个脚本, 把想要查询的信息直接汇总进去. 这样的话 就简单很多了.
脚本也很简单主要如下:
简单解释一下
1. 将产品的 java 路径定义到环境变量里面去. 便于使用命令. 注意这一个可以根据不同的安装目录进行修正.
2. 获取当前正在运行的进程号. 当然还可以使用其他的命令获取.
3. 获取当前日期加时分的一个变量.
4. 并且进行简单的echo输出, 便于后续的查看
5. top 一下这个进程. 并且将进程排序前五名的进程id 和cpu 占用率打印出来. 使用了 awk 和 sed 等多个命令.
6. 使用 jcmd 的命令打印相关信息 主要有 VM.flags , Thread.print , GC.class_histogram , GC.heap_info 等.
7. 再次打印一下占用量较高的进程信息.
8. 根据 state的关键词进行过滤,并且将同一行的信息进行查看展示和打印. 并且使用 sort和uniq 组合命令进行简单计算. 展示当前进程的状态分组情况.
export PATH=$PATH:/gscloud/jstack/runtime/java/x86_64-linux/bin/ export pid=`jps |grep caf-bootstrap.jar |awk '{print $1 }' ` echo $pid export now=`date +%Y%m%d%H%M` echo $now.log #cd /javalog top -Hp $pid -n 1 |awk '{print "占CPU较高的进程号 " $1 " 该进程CPU占用率 " $9}' |sed -n '8,12p' >> $now.log echo "JVM虚拟机的参数信息" >> $now.log jcmd $pid VM.flags >> $now.log echo "JVM虚拟机的进程信息" >> $now.log jcmd $pid Thread.print >> $now.log echo "JVM虚拟机的类信息" >> $now.log jcmd $pid GC.class_histogram >> $now.log echo "JVM虚拟机的GC堆的信息" >> $now.log jcmd $pid GC.heap_info >> $now.log top -Hp $pid -n 2 >> $now.log echo " " >> $now.log top -Hp $pid -n 1 |awk '{print "占CPU较高的进程号 " $1 " 该进程CPU占用率 " $9}' |sed -n '8,12p' >> $now.log echo "简单统计不同进程的state信息 " >> $now.log cat $now.log |grep "java.lang.Thread.State:" |awk '{print $2$3$4$5}' |sort |uniq -c >> $now.log #tar -zcvf $now.log.tar.gz $now.log --remove-files
可以简单看一个打印结果信息.
大概十秒左右收集完信息
查看文件.
(现在没有什么负载, 所以基本上看不到有高占用的情况.)
文档的末尾有简单的排序信息:
可以看到这十秒钟之类的进程占用信息有了变化.