CPU、内存过高排查

上次上网的时候,半夜CPU就爆炸了。
我满头大汗地起身检查。
首先,我打开终端并输入 top。
屏幕变绿了,我的眼睛几乎失明了。
我看到一个 CPU 速度为 9 0% 的进程。
这个名字看着眼熟,就记下了PID 1 2 3 4 5 然后打top -H -p 1 2 3 4 5 ,一排子线程跑了出来,发现2 3 4 号线程消耗CPU最多。
等等,2 3 4 转换成十六进制是0xe2 ,快jstack 1 2 3 4 5 | grep 0xe2 ,堆栈信息向下滚动,原来是一个无限循环计算斐波那契数列。
把递归改成循环,CPU立刻就掉了。

内存方面也很头疼。
free -m 看了一下,发现有一个进程占用了8 G内存,比其他进程加起来还多。
运行jstat -gcutil 1 2 3 4 5 1 000 1 0时,GC活动非常频繁,出现了3 次Full GC。
然后使用jmap -heap 1 2 3 4 5 > heapdump.txt,打开VisualVM一看,哦,一堆用户对象实例填满了老年代。
查看代码,发现缓存没有设置过期时间,而且越用越多。
更改缓存逻辑并添加最大容量限制后,内存曲线趋于稳定。

但有时还有更奇怪的事情。
上次一个界面突然变慢,线程池爆了2 00个线程还卡住。
反复检查jstack,没有发现死锁,但是TIMED_WAITING状态太多。
经查,数据库查询超时。
只要增加连接池时间就可以了。
但CPU激增的原因是什么? 难道斐波那契幽灵还在作怪吗?

uptime命令查看系统负载和top命令动态管理进程

嗯...正常运行时间...这个命令...非常方便。

例如...例如...例如2 02 3 年...1 2 月...在上海...登录服务器...输入一个正常运行时间...
屏幕上会出现什么...像这样... 1 7 :3 0:4 5 up 4 5 天,5 :2 3 ,1 个用户,平均负载:0.05 ,0.1 0,0.1 0,告诉01 ,这个系统已经运行了...4 5 天...5 小时2 3 分钟...目前只有1 人在线...然后是平均负载...
是最近1 分钟、5 分钟、1 5 分钟的平均负载...0.05 、0.1 0、0.1 5 ...这个数字相当小...
你知道...系统相当简单...北京没有卡...假设...2 02 年7 月...正常运行时间...看到负载是5 .00,5 :5 0, 6 :00...
可能...有点高...尤其是1 5 分钟...如果继续这么高...
您必须思考...CPU是否太忙?还是内存不够?
但是...不能绝对...比如...你的服务器配置很高...8 核CPU...负载达到8 .00...
并不一定意味着它坏了...也许只是...处理了很多任务...
所以...正常运行时间...是快速查看...快速感觉...快速感觉...如果这个系统很忙...按顶部...然后按回车...
然后...屏幕开始...一直显示...杂项信息...
例如...在顶部...还有三个正常运行时间数字...相同...
下一步...任务...显示有多少进程...正在运行...休息...
Cpu...显示CPU的百分比...显示当前使用的CPU百分比...用户百分比是多少...内核百分比是多少...空闲...
Mem/Swap...显示正在使用多少内存...正在使用多少交换分区...
关键点是以下...许多进程的列表...
PID...进程ID...每个进程都有自己的ID...
USER...是谁干的...例如root...
PR/NI...优先级...精细值...使用了多少内存...虚拟/虚拟.../内存速度如何...使用了多少物理内存...使用了多少共享内存...
S...进程状态...R正在运行...S正在睡眠...Z是一个僵尸进程...看起来死了...但没有完全删除...
所以... %CPU...这个进程使用了多少CPU...%MEM...这个进程使用了多少内存...
TIME+...这个进程使用了多少...CPU时间...例如,或者COMMAND...python...
这个顶部...你可以按P...只要按P键...它会按照CPU使用量排序...
前面的使用最多...它会到顶部...
你也可以按M...按M键...它会按照多少排序内存正在使用...
您想查看哪个进程...尤其是在顶部...当顶部正在...
正在运行...键入 k...然后 1 2 3 4 ... k 1 2 3 4 ...
它会问您...您确定要杀死吗? ...你输入y...它就会被杀死...
这个峰值...是一个非常强大的东西...你可以看到很多细节...你可以调整进程优先级...你可以做很多事情...
使用它...它更动态...它在那里不断刷新...
嗯...就是这样...正常运行时间...和峰值...很常用...