发现有三十多万的消息堆积在10的queue里没有被消费
记录一下查看问题的步骤:
1 jps
找出程序的PID
2 jstack ${PID}
查看线程dump,发现rabbitMQ的consumer worker线程block住了:
"Thread-33" prio=10 tid=0x00002aaac8013000 nid=0x3264 waiting for monitor entry [0x00000000437e4000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.lucene.index.IndexWriter.commit(IndexWriter.java:3525)
- waiting to lock <0x000000072039ce18> (a java.lang.Object)
at org.apache.lucene.index.IndexWriter.commit(IndexWriter.java:3505)
at com.xiaomi.miliao.mt.fulltextindex.UserIndexUpdater.updatePlUserIndex(UserIndexUpdater.java:229)
- locked <0x0000000711ab59c8> (a java.lang.Object)
at com.xiaomi.miliao.mt.fulltextindex.SearcherDelegate.updatePlUserIndex(SearcherDelegate.java:522)
at com.xiaomi.miliao.mt.fulltextindex.MessageQueueDelegate$PlUserIndexMessageHandler.handleMessage(MessageQueueDelegate.java:342)
at com.xiaomi.miliao.rabbitmq.ConsumerWorker.run(ConsumerWorker.java:107)
at java.lang.Thread.run(Thread.java:662)
这个线程的状态是wating for monitor entry,但是它在等待这个锁(0x000000072039ce18)已经被下面的这个线程占有了,而且下面的这个线程一直在run,没有返回。根据它的栈信息,查看java.io.FileDescriptor.sync方法,怀疑是系统IO很繁忙,一直没有返回。
"Thread-24" prio=10 tid=0x00002aaac8007000 nid=0x3257 runnable [0x00000000431d8000]
java.lang.Thread.State: RUNNABLE
at java.io.FileDescriptor.sync(Native Method)
at org.apache.lucene.store.FSDirectory.sync(FSDirectory.java:321)
at org.apache.lucene.index.IndexWriter.startCommit(IndexWriter.java:4801)
at org.apache.lucene.index.IndexWriter.prepareCommit(IndexWriter.java:3461)
at org.apache.lucene.index.IndexWriter.commit(IndexWriter.java:3534)
- locked <0x000000072039ce18> (a java.lang.Object)
at org.apache.lucene.index.IndexWriter.commit(IndexWriter.java:3505)
at com.xiaomi.miliao.mt.fulltextindex.UserIndexUpdater.updatePlUserIndex(UserIndexUpdater.java:229)
- locked <0x0000000711d6b558> (a java.lang.Object)
at com.xiaomi.miliao.mt.fulltextindex.SearcherDelegate.updatePlUserIndex(SearcherDelegate.java:522)
at com.xiaomi.miliao.mt.fulltextindex.MessageQueueDelegate$PlUserIndexMessageHandler.handleMessage(MessageQueueDelegate.java:342)
at com.xiaomi.miliao.rabbitmq.ConsumerWorker.run(ConsumerWorker.java:107)
at java.lang.Thread.run(Thread.java:662)
3 ssh到指定服务器,查看cpu负载
top -d 5 五秒刷新一次,然后按1,查看所有的cpu的情况,没有发现异常,但是发现我的服务确实很占cpu啊,给力!lucene确实需要优化,赶紧切换到sensei吧
[root@MT1-10 logs]# top -d 5
top - 20:13:51 up 439 days, 16:15, 7 users, load average: 4.56, 4.82, 4.84
Tasks: 244 total, 1 running, 243 sleeping, 0 stopped, 0 zombie
Cpu0 : 17.6%us, 1.6%sy, 0.0%ni, 73.6%id, 7.2%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 6.6%us, 1.4%sy, 0.0%ni, 6.0%id, 85.8%wa, 0.0%hi, 0.2%si, 0.0%st
Cpu2 : 5.6%us, 0.8%sy, 0.0%ni, 84.1%id, 9.6%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 4.4%us, 0.4%sy, 0.0%ni, 95.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu4 : 3.0%us, 0.6%sy, 0.0%ni, 93.8%id, 2.6%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu5 : 2.2%us, 0.6%sy, 0.0%ni, 94.4%id, 2.8%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu6 : 2.2%us, 0.2%sy, 0.0%ni, 95.6%id, 2.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu7 : 15.0%us, 2.4%sy, 0.0%ni, 70.1%id, 12.2%wa, 0.0%hi, 0.4%si, 0.0%st
Cpu8 : 5.4%us, 0.6%sy, 0.0%ni, 91.6%id, 2.2%wa, 0.0%hi, 0.2%si, 0.0%st
Cpu9 : 5.2%us, 1.2%sy, 0.0%ni, 66.9%id, 26.7%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu10 : 2.6%us, 0.6%sy, 0.0%ni, 92.4%id, 4.4%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu11 : 6.2%us, 0.8%sy, 0.0%ni, 93.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu12 : 2.4%us, 0.4%sy, 0.0%ni, 95.4%id, 1.8%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu13 : 11.8%us, 1.2%sy, 0.0%ni, 84.7%id, 2.4%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu14 : 2.2%us, 0.2%sy, 0.0%ni, 97.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu15 : 35.8%us, 5.2%sy, 0.0%ni, 41.8%id, 12.8%wa, 0.2%hi, 4.2%si, 0.0%st
Mem: 32956180k total, 32849076k used, 107104k free, 547628k buffers
Swap: 6144820k total, 228k used, 6144592k free, 18353516k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12681 root 18 0 5168m 2.4g 13m S 129.3 7.7 1675:27 java
4 使用iostat -d -x 1 100,查看系统io的使用情况(-d 是查看disk, -c是查看cpu), -x是查看更多信息,1是1秒刷新一次,100是查看一百次
[root@MT1-10 logs]# iostat -d -x 1 1
Linux 2.6.18-194.el5 (MT1-10) 10/09/2012
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
cciss/c0d0 0.00 776.00 3.00 259.00 24.00 11360.00 43.45 51.73 352.21 3.82 100.10
cciss/c0d0p1
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
cciss/c0d0p2
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
cciss/c0d0p3
0.00 23.00 0.00 3.00 0.00 208.00 69.33 0.18 61.00 61.00 18.30
cciss/c0d0p4
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
cciss/c0d0p5
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
cciss/c0d0p6
0.00 753.00 3.00 256.00 24.00 11152.00 43.15 51.55 355.59 3.86 100.10
具体名咯解析可查看
http://wenku.baidu.com/view/5991f2781711cc7931b7168c.html
发现cciss/c0d0p6的%util达到了100%,太繁忙了。
平均IO请求的队列长度avgqu-sz是51.55
平均使用的扇区数量是43.15
平均每个IO的等待时间的355.59毫秒
说明这快磁盘已经出现性能瓶颈了!
使用iopp可查看每个进程的IO情况!
- 大小: 54.6 KB
分享到:
相关推荐
标题中的“Rabbitmq堆积消息后生产速率降低的问题分析及应对措施1”涉及到RabbitMQ在消息堆积情况下的工作原理和解决策略。RabbitMQ是一个流行的开源消息代理,用于实现AMQP(Advanced Message Queuing Protocol)...
RabbitMQ是一个广泛使用的开源消息代理,它基于AMQP(Advanced Message Queuing Protocol)协议,用于处理应用程序之间的异步通信。而Shell脚本则是一种强大的Linux/Unix工具,可以执行各种任务,包括系统监控、自动...
在Java中,获取RabbitMQ消息总数的过程涉及与RabbitMQ服务器建立连接、创建通道、声明队列以及查询队列状态。以下是一个详细的步骤解析: 1. **建立连接**: 首先,需要通过`ConnectionFactory`类来创建一个连接工厂...
- 支持大量消息堆积而不影响性能。 - **缺点**: - 目前支持的客户端语言较少。 - 社区活跃度相对较低。 **2.4 RabbitMQ** - **优点**: - 基于Erlang语言实现,具备良好的并发性能。 - 支持多种编程语言,...
- **TTL和死信队列**:设置消息存活时间,处理未消费消息,防止消息堆积。 6. **RabbitMQ安全** - **认证(Authentication)**:通过用户名和密码验证用户。 - **授权(Authorization)**:控制用户对虚拟主机、...
### MQ消息堆积终极解决方案【RabbitMQ】 #### 概述 在分布式系统中,消息队列(MQ)作为异步通信的重要组件,在提高系统吞吐量、解耦合度方面发挥着关键作用。然而,随着业务量的增长及复杂性的增加,消息堆积...
云消息队列 RabbitMQ 版兼容开源 RabbitMQ 客户端,解决开源各种稳定性痛点(例如消息堆积、脑裂等问题),同时具备高并发、分布式、灵活扩缩容等云消息服务优势。 了解云消息队列RabbitMQ版和开源版本的区别和优势...
- **Kafka**:高性能的发布/订阅消息系统,支持高吞吐、低延迟和大数据量堆积。 - **RocketMQ**:原为Metaq,阿里巴巴开源,提供严格的消息顺序、丰富的拉取模式和大规模扩展能力。 - **RabbitMQ**:基于AMQP协议,...
- "RabbitMQ堆积消息后生产速率降低的问题分析及应对措施.docx":当消息堆积时,生产者可能会被阻塞,降低发送速率。文档分析了这个问题的原因,并提出了相应的应对策略,以保证系统的稳定运行。 6. **RabbitMQ的...
5. **合理设置消息过期时间**:避免queue堆积过多消息,造成资源浪费。 以上是对RabbitMQ服务开发的基本介绍,包括其核心概念、工作流程、安装配置、客户端使用以及高级特性和最佳实践。深入理解并熟练运用这些知识...
如果持续增长,表示有消息堆积,可能存在队列积压的问题。此时,可以通过查看Overview后面的标签,如Connection、Channel、Exchange和Queue,进一步定位问题源头并解决。 文章中给出了一个实际案例,描述了...
- **RocketMQ**:源于阿里巴巴,优化了Kafka的设计,提供了更高的消息零丢失保证和更完善的MQ功能,适合大规模消息堆积场景。然而,RocketMQ的客户端支持语言有限,社区活跃度相对较低。 - **RabbitMQ**:作为Java...
【RabbitMQ高可用集群部署】是实际生产环境中常见的解决方案,因为单一实例的RabbitMQ在面对高并发、高吞吐量以及消息堆积时可能存在局限性。为了提高系统的可靠性和可扩展性,采用集群模式是必要的。RabbitMQ基于...
- 为避免消息堆积,尽量减少不必要的延迟消息。 - 设计合理的消息结构,便于过滤和查找特定的延迟消息。 - 定期评估和调整延迟策略,以适应业务变化。 总结,RabbitMQ的延迟插件3.7.x版本为分布式系统提供了强大...
- 停止现有消费者,防止新消息继续堆积。 - 创建一个新的主题,设置partition数量为原来的10倍,并建立相应的临时队列,数量可能是原来的10倍或20倍。 - 编写一个临时消费者程序,部署后用于快速消费积压数据,...
课程目的 1. 了解消息中间件背景...5、如何发现出现了大量消息的堆积?采取了哪些应急措施?问题产生的根源是什么?如何避免 消息中间件概述: 分布式系统中如何进行远程通信 为什么要使用消息中间件?市场上有哪些
- **消息堆积能力**: 可以有效处理亿级别的消息堆积。 - **高效订阅**: 支持多种消息订阅模式。 - **适用场景**: - 分布式系统消息传递 - 企业级应用集成 #### 总结 - **性能考量**: 当消息性能要求较高时,...
解释RabbitMQ的消息堆积问题及解决方案。** - **问题原因:** 消费者处理能力不足。 - **解决方案:** 增加消费者数量、优化处理逻辑。 **47. 在RabbitMQ中,如何诊断和解决网络问题?** - 利用网络监控工具追踪...
根据给定的信息,本文将详细解析“高级Java人才培训专家-RabbitMQ-高级篇”中的核心知识点,并深入探讨其中提及的几个关键问题:延迟消息、消息堆积、消息可靠性以及高可用性。 ### 一、延迟消息问题 在某些场景下...
此外,我们还学习了如何发现出现了大量消息的堆积,采取了哪些应急措施?问题产生的根源是什么?如何避免?并讨论了项目中为什么要使用消息中间件?项目中为什么使用RocketMQ而不是RabbitMQ?系统TPS有多少?引入...