早上突然有小伙伴说系统无法访问,
以下记录下解决过程:
测试了一个接口结果如下
接口没有响应
先看下应用日志
日志使用tail -f 不会自己追加,用htop看到系统两个核都100%,看到是应用占用的
接下了分析下Java程序怎么占用的
先来个总的:
服务器CPU使用率一直很高,达到100% 定位方法
方法一:
转载:http://www.linuxhot.com/java-cpu-used-high.html
1.jps 获取Java进程的PID。
2.jstack pid >> java.txt 导出CPU占用高进程的线程栈。
3.top -H -p PID 查看对应进程的哪个线程占用CPU过高。
4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写。
5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。
6.分析负载高的线程栈都是什么业务操作。优化程序并处理问题。
方法二:
1.使用top 定位到占用CPU高的进程PID
top
通过ps aux | grep PID命令
2.获取线程信息,并找到占用CPU高的线程
ps -mp pid -o THREAD,tid,time | sort -rn
3.将需要的线程ID转换为16进制格式
printf "%x\n" tid
4.打印线程的堆栈信息
jstack pid |grep tid -A 30
方法3:
1.确认占用过高的进程
ps -ef|grep mem-* 查看进程的pid
top -Hp PID 查看某进程PID的
jstack -l 21113 查看线程的堆栈
具体操作
jps 获取Java进程的PID。
8783
jstack pid >> java.txt 导出CPU占用高进程的线程栈
使用jstack 打印上面查到的java pid 中的线程
打印线程的堆栈信息
没有异常???
再去看下log,指定最后100行
哇哦,log写入停止前报了一个日志写入错误,日志写不进去,估计是磁盘的问题
果然,满了
看下谁占了,并依次往里看
删除占空间的应用日志后,发现/a**的分区磁盘容量回来了,但是根目录还是99%,从du -sh /*结果来看,/tmp占用的较多,看下/tmp挂载点是否和/在同一个分区上:df -h /tmp 结果如下
清除/tmp文件夹下的临时文件后
好了,重启下应用,正常了
我的天,原来绕这么一大圈只是磁盘问题,从查看应用日志发现日志不会追加就应该看出端倪了。。。
来源:https://www.icode9.com/content-4-677901.html