java进程的cpu和线程快照一般都会接入监控平台进行监控和查看,也可以通过命令在服务器查看:top -b -n 1 -Hp pid > 1.top && jstack pid > 1.stack,当然也可以通过shell脚本的方式将cpu和jstack指标记录输出到文件。
if [ ! -d "result" ]; then mkdir result; fi
num=1;
prefix=`date -d "today" +"%H%M%S"`; #文件前缀
while true; do
realCpu=`top -b -n 5 -d 1 -Hp $1 | grep Cpu | tail -1 | awk '{print $2}'` #每隔1秒输出一次top,连续5次,取最后一次判断CPU,耗时5秒
printf $(date -d "today" +"%Y%m%d.%H:%M:%S")" CPU: "$realCpu;
CpuStatus=`echo $realCpu | awk '{if($0 > 70 ) print "high"; else print "low"}'`; #注意这里设置阈值,阈值是80%
if [ $CpuStatus == "high" ]; then
printf ", 大于80,开始采集10分钟堆栈..."
for ((i=1;i<=120;i++)); do
top -b -n 5 -d 1 -Hp $1 > top.tmp & sar -u 1 5 >> ./result/$prefix-"sar-cpu"-$(date -d "today" +"%Y%m%d").txt & sar -r 1 5 >> ./result/$prefix-"sar-memory"-$(date -d "today" +"%Y%m%d").txt & sar -b 1 5 >> ./result/$prefix-"sar-io"-$(date -d "today" +"%Y%m%d").txt & sar -B 1 5 >> ./result/$prefix-"sar-swap"-$(date -d "today" +"%Y%m%d").txt; #并发执行top和sar命令,都是每个1秒执行一次,连续5次,sar采集了CPU、内存、IO、页交换速率四项
lastLine=`grep -n "top -" top.tmp | tail -1 |awk -F ':' '{print $1}'`;
echo $lastLine | xargs -I {} sed -n '{},$p' top.tmp > ./result/$prefix-$num-"top"-$(date -d "today" +"%Y%m%d_%H%M%S").txt && jstack $1 > ./result/$prefix-$num-"stack"-$(date -d "today" +"%Y%m%d_%H%M%S").txt;
num=$(($num+1));
done
fi
printf "\n";
find ./result/ -mmin +300 -type f -exec rm -rf {} \; #删除5小时前修改的文件
done
使用说明:
chmod 777 top.sh (上面的脚本);执行nohup ./top.sh pid &
如果打堆栈的话会在当前目录下面新建result文件夹,只保留1天的;
如果有重启java进程的话这个脚本也需要重启,因为pid改变了。
固定频率打线程快照脚本
#!/bin/bash
pid=$1
# 创建保存日志文件的目录
log_dir="/opt/jstack"
mkdir -p $log_dir
# 循环执行并保存堆栈信息
while true; do
current_time=$(date +%Y%m%d%H%M%S)
jstack -l $pid > "$log_dir/$current_time.txt"
find /opt/jstack/*.txt -mmin +2880 -type f -exec rm -rf {} \;
sleep 5
done
其他
sftp服务io性能测试
yum install time
sync;/usr/bin/time -p bash -c "(dd if=/dev/mapper/centos-root of=test.dd bs=1000K count=20000;sync)"