早上突然有小伙伴说系统无法访问,
以下记录下解决过程:
测试了一个接口结果如下
接口没有响应
先看下应用日志
日志使用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 " 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文件夹下的临时文件后
好了,重启下应用,正常了
我的天,原来绕这么一大圈只是磁盘问题,从查看应用日志发现日志不会追加就应该看出端倪了。。。