文章目录
- MQ 服务占用 CPU 太高
- 1. 出现问题
- 2. 分析过程
- 1. 通过日志定位问题服务
- 2. 查询异常服务进程、CPU、内存、IO、锁和网络
- 3. CPU 占用过高分析
- 3. 解决方案
MQ 服务占用 CPU 太高
1. 出现问题
- 测试环境中,匹配业务运行时会出现响应缓慢或超时失败的情况
2. 分析过程
1. 通过日志定位问题服务
- 根据匹配业务查询日志,发现查询房间信息的 Redis 缓存为空时会超时,这可能是由于缓存未被添加或中途被删除所致
- 多次新开房间测试,缓存添加正常,排除添加缓存业务问题
- 删除缓存的业务:
- 前端关闭或 IM 端通知关闭:日志正常,排除
- 心跳两次未更新(定时检测):一系列业务操作后、发布到 RabbitMQ 异步更新,RabbitMQ 服务的日志显示更新缓慢,更新不及时导致定时检测误判异常并删除缓存
- 确定异常服务为 RabbitMQ 服务
2. 查询异常服务进程、CPU、内存、IO、锁和网络
-
直接查询 RabbitMQ 的服务进程未发现问题:
ps -ef | grep 'rabbitmq'
-
使用
top 然后按 P
命令,然后使用cat /proc/cpuinfo| grep "processor"| wc -l
查到机器是 32 核,CPU 负载不高:10 / 32 = 0.3125 -
但是 RabbitMQ 的业务处理服务 rabbitmq 占用比较高:117.3%(90 - 300 % 之间)
-
free -m
:内存还有 5315M 空闲 -
df -l
:磁盘占用很高 89%(同时还在涨)
-
阿里云流量监控未发现服务器流量异常
-
使用 jstack、jmap、jstat 命令,在 /home/webadmin 目录下查 JVM dump 日志,JVM 内存状态正常,非 GC 原因
-
因此问题就是
- RabbitMQ 占用 CPU 太高
- 磁盘占用太高
3. CPU 占用过高分析
- 进入 rabbitmq 消息存储目录,发现该目录占用磁盘过高,猜测磁盘占用过高导致 IO 读取异常
- 尝试清理磁盘无用数据后,速度明显变快,但不久后磁盘再次快速增长
- 问题所在:找到磁盘占用过多的服务
3. 解决方案
- 首先使用 root 权限,进入根目录查询大文件:
du -sh * \ --exclude="proc" \ --exclude="data*" | grep G
,未找到 - 然后查询隐藏文件:
du -sh .[!.]*
- 发现其他项目组的Android包放在此目录,占用空间巨大
- 沟通后将包打包至其他位置,同时删除Android包,磁盘占用恢复正常