公司有两个java系统运行在同一台服务器上面,有一天接到开发人员反馈,有时候打开页面反应很慢,于是开始上服务器排查:
top 命令发现服务器负载不高,但是cpu0 的iowait 很高,达到了60%,于是开始初步怀疑是磁盘io引起的cpu 负载,于是iostat 查看磁盘负载:
发现磁盘的util 并不高,于是用iotop查看所有程序的io使用情况:
发现kswap0 的磁盘利率为99.99,我们都知道kswap 为 内核线程,当内存不足的时候,kswapd0就会回收内存和(swap 换入唤出,将内存数据写到磁盘上)。
于是这是free 查看内存使用情况:
这时发现剩余内存还很多
通过/proc/sys/vm/min_free_kbytes 可以得到自动清理阀值,由此可以看出当前系统剩余内存并未达到自动清理条件 ,而且通过上图也可以看出系统并没有开启swap 功能,那上面的kswap0 又怎样解释呢?
这时通过系统ps aux 查看所有进程,发现有两个进程站用资源比较多,java 和 mysqld,这时突然想起一开始项目上线时限定了jvm 的内存为JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m,后来又在这台服务器上上了另一个web项目,两个项目都运行在同一个tomcat 中,但是虽然增加了新的项目,但是java的内存限制却还是保持原来的没有改变,于是将tomcat 的内存限制改为了JAVA_OPTS="$JAVA_OPTS -server -Xms4096m -Xmx4096m,与业务方确认后重启了tomcat。
查看系统状态:
到此,服务恢复正常,cpu iowait 和 负载 都降下来了