RockMQ 消费慢排查

1消费端
1.1确认消费线程是否满负荷
--查找线程名称
thread | grep 'ConsumeMessageThread'
--查看活跃线程数,是否与设置消费线程匹配,若活跃线程远小于 设置消费线程 (比如设置150,活跃 < 50),说明消费逻辑存在阻塞或等待
thread --state RUNNABLE | grep "ConsumeMessageThread_" | wc -l

-----检查是否因锁或 I/O 阻塞
--查找阻塞线程数
thread --state BLOCKED | grep "ConsumeMessageThread_" | wc -l

thread --state WAITING | grep "ConsumeMessageThread_" | wc -l
thread --state TIMED_WAITING | grep "ConsumeMessageThread_" | wc -l
1.2定位消费耗时方法
--统计方法调用次数和耗时分布
monitor -c 5 com.hbhtxx.consumerkeepalive.consumer.DelayTaskConsumer onMessage

--使用 trace 跟踪消费方法(采样 10 次,避免性能影响),定位消费耗时方法
--若不确定类名,先用 sc *Consumer* 搜索
trace com.hbhtxx.consumerkeepalive.consumer.DelayTaskConsumer onMessage -n 10
trace com.hbhtxx.consumerkeepalive.consumer.TaskHandler loginInfoData -n 10

trace com.hbhtxx.consumerkeepalive.consumer.DelayTaskConsumer onMessage '#cost > 500'
1.3监控消费拉取频率(Pull 频率)
--每次拉取的数据个数
watch org.apache.rocketmq.client.impl.consumer.ConsumeMessageConcurrentlyService submitConsumeRequest 'params[0].size()' -x 1 -n 10

monitor -c 5 org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl
pullMessage

-- 1. 确认类是否存在
sc org.apache.rocketmq.client.impl.consumer.PullMessageService

-- 2. 监控 pullMessage 调用频率和耗时
monitor -c 5 org.apache.rocketmq.client.impl.consumer.PullMessageService pullMessage


monitor -c 5 org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl
pullMessage

1.4检查线程池状态(RocketMQ 消费线程池)
#查看注册的主题
vmtool --action getInstances --className org.apache.rocketmq.spring.support.DefaultRocketMQListenerContainer --limit 10
#获取当前队列偏移
watch org.apache.rocketmq.client.impl.consumer.ProcessQueue getMaxSpan -n 5
#获取当前队列长度数量
watch org.apache.rocketmq.client.impl.consumer.ProcessQueue getMsgCount -n 5
#获取当前队列内存大小
watch org.apache.rocketmq.client.impl.consumer.ProcessQueue getMsgSize -n 5
#查看源码
jad org.apache.rocketmq.client.impl.consumer.ProcessQueue
#执行方法
vmtool --action getInstances --className org.apache.rocketmq.client.impl.consumer.PullRequest -x 3

vmtool --action getInstances --className org.apache.rocketmq.client.impl.consumer.ProcessQueue --limit 20 -x 2
vmtool --action getInstances --className org.apache.rocketmq.client.impl.consumer.ProcessQueue --limit 10 --express 'instances[3].getMaxSpan()'
vmtool --action getInstances --className org.apache.rocketmq.client.impl.consumer.ProcessQueue --limit 10 --express 'instances[3].getMsgCount ()'
vmtool --action getInstances --className org.apache.rocketmq.client.impl.consumer.ProcessQueue --limit 10 --express 'instances[3].getMsgSize ()'
vmtool --action getInstances --className org.apache.rocketmq.client.impl.consumer.ProcessQueue --limit 10 --express 'instances[5].getMsgTreeMap()'


2生产端
# 监控 RocketMQ Producer 的 send 方法
trace org.apache.rocketmq.spring.core.RocketMQTemplate syncSend
统计方法调用次数和耗时分布
monitor -c 5 org.apache.rocketmq.spring.core.RocketMQTemplate syncSend

3系统资源
# 查看 JVM 基本信息
Dashboard
# 查看内存使用
memory
# 查看 GC 次数和耗时
vmoption PrintGC # 确保 GC 日志开启(需 JVM 启动参数)
# 或jvm 或 dashboard

posted @ 2025-11-06 10:21  Materben  阅读(7)  评论(0)    收藏  举报