最近一个应用出现了cpu升高到100%的问题,一直没有解决掉
根据常见的top -Hp等思路发现占用cpu较高的几个pid 都是正常业务,
不过当时也看到有属于内存回收的进程占用的cpu非常高,但是很快就没有了, 当时没太注意
后来还改了程序的一个实现方式,因为修改了cat的源码,当时以为改坏了,目前看只靠猜测是不靠谱的
修改了实现方式还是不行 还是几天后会cpu100%
处理步骤:
1今天还是利用jstack pid打出了应用的线程栈信息 发现线程数非常多
tomcat启动了7000左右的线程
查看某个应用pid下面的线程数
ps -Lf 10090|wc -l (10090为某个应用的pid)
2查看当前tomcat的jvm的配置发现 Xms Xmx都是2g 服务器总共4g
top看到tomcat使用内存已经是2.7g
使用命令查看gc情况
有点慌 12天运行fullgc 13827次 年老代一直100% fullgc没效果了 内存不够
当然这个使用内存(和占用cpu 和线程数)都是慢慢爬上去的,所以一开始有可能几天看不出来这个问题
(参数的解释可以看这里https://blog.csdn.net/AlbertFly/article/details/87084744 )
解决办法 在4g 总内存的情况下 调整jvm 参数
-Xms3460m -Xmx3460m -Xss256K -XX:NewSize=1724m -XX:MaxNewSize=1724m
Xss默认是1m 由于这个项目使用线程数很多 设置为较小值 比较合适,新时代 年老代都调大.
目前测试环境还在观察 效果
-----------
测试一天发现还是有问题 提高内存 减小线程大小从根本上解决不了问题
因为线程数还在上升,慢慢把内存占满最后发现是cat引入了一个依赖包 有问题,
最后cpu100%的问题还是回归 top -Hp 以及查找具体的线程 定位具体的线程栈信息
如果定位到自己项目的方法 基本就是问题所在
如果是底层的代码,可能是这个底层代码出问题了 看看依赖是否正确
或者拿掉。或者寻找替换品,或者版本是否正确