出现问题:研发更新发布后,服务器异常卡顿,查看监控,磁盘读取read非常高,基本都是峰值,用iotop命令看到读取频率较高的都是些阿里云盾或者ELK的firebeat日志提取服务在读取,把这些都kill掉,还是卡,又怀疑是不是服务器被攻击,但是没有任何可疑IP,也没发现异常进程,于是干脆重启服务器,重启后就不卡了,非常流畅,怀疑是服务的问题,将服务一个个重启,发现启动tomcat-web服务的时候,又卡的不行,定位到问题点了,因为研发使用jenkins自动发布的时候是会重启这个服务的。
继续排查问题,强行启动了tomcat-web,关闭了mqbroker,服务器又正常了,以为问题出在了mqbroker上,因为mq是消息队列,是存在读取的情况的,但是这么点业务不至于读到服务器卡死,于是继续重启服务器,由于mqbroker是开机自启动,启动后服务器没有卡顿现象,证明mqbroker没问题,问题又回到了tomcat-web上,检查启动命令发现没有配置启动内存参数。
查看了下服务器内存,可用内存还有5G,但还是尝试了下在tomcat/bin目录下的catalina.sh文件cygwin=false上面添加了一行参数:
JAVA_OPTS="-Xms2g -Xmx2g -XX:PermSize=512m -XX:MaxPermSize=8g"
-XX:PermSize建议设置为物理内存的64分之一,-XX:MaxPermSize建议设置为物理内存的4分之一
再次启动服务器后正常了,不卡了
原因分析:
rocketmq新消息在内存存储,内存不足会持久化到磁盘,就会存在频繁的磁盘与内存数据交换。
不管是tomcat还是jar包服务,建议在启动时添加内存参数限制。