解决RabbitMQ队列超长QueueingCons…

学相伴飞哥RabbitMQ笔记 什么是中间件 我国企业从20世纪80年代开始就逐渐进行信息化建设,由于方法和体系的不成熟,以及企业业务和市场需求的不断变化,一个企业可能同时运行着多个不同的业务系统,这些系统可能基于不同的操作系统、不同的数据库、异构的网络环境。现在的问题是,如何把这些信息系统结合成一个有机地协同工作的整体,真正实现企业跨平台、分布式应用。中间件便是解决之道,它用自己的复杂换取了企业应用的简单。 什么是中间件 飞哥 分类:学习笔记 创建时间:2021/02/28 13:33 小字体最后修改于: 2021/03/02 19 阅读详情
      我们的服务器使用RabbitMQ作为消息中转的容器。某天我怀疑RabbitMQ队列 是否都能及时消化。于是用命令查询了下:rabbitmqctl list_vhosts | grep -P ".*\.host" | xargs -i rabbitmqctl list_queues -p {} | grep "queue"。   不查不知道,一查吓一跳:大多数服务器的队列基本上都是空的,但是有些服务器的某个队列竟然有超过500W条的记录。一般 RabbitMQ进程占用内存不过100M-200M,这些队列超长的 RabbitMQ 进程可以占用超过2G的内存。
        显然消息队列的消费者出现了问题。开发查看日志发现作为该队列消费者的Java服务的日志也卡住了,重启服务 (这点做得不对,应该用jstat、jstack进行排查,而不是直接重启)又很快卡住。这时候他才想起来用jstat,通过jstat发现JVM内存都耗尽了,之后进入无尽的Full GC,所以当然不会处理队列消息和输出日志信息了。jstat的输出如下:
------------------------------------- -------------------------------------
[root@mail ~]# jstat -gcutil 29389
  S0     S1     E       O       P     YGC     YGCT     FGC     FGCT     GCT    
100.00   0.00 100.00 100.00   59.59   1639     2.963 219078 99272.246 99275.209
------------------------------------- -------------------------------------
       使用jmap导出这时候的Java堆栈,命令:jmap -dump:format=b,file= 29389.hprof   29389。将得到的dump文件放到MAT( Eclipse Memory Analyzer) 里进行分析,发现很明显是QueueingConsumer持有大量对象导致JVM内存溢出,截图如下:
        解决RabbitMQ队列超长QueueingConsumer导致JVM内存溢出的问题
      上网搜索了下,发现有人遇到了类似的问题: RabbitMQ QueueingConsumer possible memory leak  。解决办法是调用Channel的basicQos方法,设置临时内存中最多保存的消息数。这个数值的设置建议参考  《Some queuing theory: throughput, latency and bandwidth》  权衡决定。
      拍脑袋将 basicQos设置为16后重启服务,队列终于开始消化了。用jstat 观察JVM内存使用情况,也没有再出现剧增溢出的现象。
      总结:使用RabbitMQ的时候,一定要合理地设置QoS参数。 我感觉RabbitMQ的默认做法其实是很脆弱的,容易导致 雪崩。“You have a queue in Rabbit. You have some clients consuming from that queue. If you don't set a QoS setting at all (basic.qos), then Rabbit will push all the queue's messages to the clients as fast as the network and the clients will allow.“。 这样如果由于某些原因,队列中堆积了比较多的消息,就可能导致Comsumer内存溢出卡死,于是发生 恶性循环,队列消息不断堆积得不到消化, 彻底地悲剧了。


yolov7目标追踪:基于自定义数据集完成检测 目标追踪包含两个阶段:(1)基于自定义数据集,训练yolo目标检测模型;(2)基于检测模型,将实时检测结果传递到StrongSORT追踪算法中,该算法在OSNet基础上结合运动和外观信息,可以跟踪yolo模型检测到的任何物体。 阅读详情

相关推荐

C#解析基恩士(KEYENCE)PLC数据:KV协议通信与实时监控实现

KV协议是基恩士PLC使用的一种专用通信协议,通常用于与上位机进行数据交换。KV协议通过RS-232C、RS-485、Ethernet等接口与上位机通信,支持多种数据类型的读写,包括但不限于位、字、双字、浮点数等。简洁易用:KV协议的通信格式简单,易于实现。支持多种数据类型:支持位数据、字数据、定长字符串等。高效实时性:能够提供较高的实时数据交换性能,适合实时监控应用。本文介绍了如何通过C#与基恩士KV系列PLC进行通信,实现数据的解析和实时监控功能。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1760

rabbitMQ 队列过多导致性能问题解决思路

rabbitMQ 队列过多导致性能问题解决思路 最近在使用 事件驱动(eventdrive)的方式架构一个新的实验项目,发现在这样的方式下逻辑稍微复杂会需要创建不少的 queue,几乎是每一个消息都需要新增一个queue,AMQP协议本身 是exchange对应queue,消费者消费queue,而queue的数量过多会直接影响 rabbit 本身的性能,rabbit本身不能帮我们解决这样的问题,因此我们需要自己从设计方面来解决这个问题。 第一种方式: 一个队列接受多种类似的消息,message header

baidu_41858046的博客 3284

云母计算公式

处理云母的电子探针数据,计算二价铁和三价铁

RabbitMQ最大连接数

RabbitMQ的Socket连接数(socket descriptors)是文件描述符(File descriptors)的一个子集,也就是说,RabbitMQ能同时打开的最大连接数和最大文件句柄数都是受限于操作系统关于文件描述符数量的限制,两者是此消彼长的关系。默认情况下,rabbitmq文件句柄数设置是1024。例如:(1024-100)*0.9=831.6,取整831再减2得到829。连接数=(文件句柄数-100)*0.9,计算后的值取整再减2。一般通过ulimit来调整程序的最大文件句柄数。

我的博客 2352

RabbitMQ——最大连接数

默认情况下,rabbitmq文件句柄数设置是1024。连接数最多为829,连接数的具体计算方式为: 连接数=(文件句柄数-100)*0.9,计算后的值取整再减2。 例如:(1024-100)*0.9=831.6,取整831再减2得到829。 真正使用时,1024可能无法满足实际需求。这个时候,一般通过ulimit来调整程序的最大文件句柄数。下图为通过ulimit将文件句柄数调整到1024...

hncscwc的博客 1万+

RabbitMQ能打开的最大连接数

RabbitMQ自带了显示能够接受的最大连接数,有2种比较直观的方式: 1. rabbitmqctl命令。 1 2 3 4 5 6 7 8 9 10 11 12 n$ rabbitmqctl status Status of node 'rabbit@10-101-17-13' ... [{pid,23658}, ...... {file_descripto

沉底的石头 5万+

RabbitMQ学习笔记:RabbitMQ能打开最大连接数

1.通过rabbitmqctl命令查看 [root@rabbit1 /]# rabbitmqctl status ... File Descriptors Total: 2, limit: 1048469 Sockets: 0, limit: 943620 ... 2.通过Management UI查看 Socket descriptors说明: The network sockets...

OceanSky的专栏 4607

RabbitMQ队列长度限制说明

原文来自RabbitMQ官网:https://www.rabbitmq.com/maxlength.html。 可以将队列的最大长度限制为一组消息或一组字节数(所有消息体长度的总和,忽略消息属性和任何开销),或两者都限制。 当设置了最大消息队列或者大小后,RabbitMQ的默认行为是丢弃队列前面的消息或死信消息(即队列中最老的消息)。若要修改此行为,请使用overflow设置。 使用overflow设置来配置队列溢出行为。如果overflow设置为reject-publish或者reject-publ

shirly的博客 2925

RabbitMQ(四):RabbitMQ消息大小限制,队列长度限制

消息大小限制 在版本3.7中的源码,我们可以看到最大消息大小为2GiB。 274 %% Trying to send a term across a cluster larger than 2^31 bytes will 275 %% cause the VM to exit with "Absurdly large distribution output data 276 %% buffer". So we limit the max message size to 2^31 - 10^6 by

cuibin1991的专栏 3万+

RabbitMQ:Queue长度限制的介绍和使用

1.声明 当前内容用于本人学习和复习只用,内容包括:限制Queue中消息总数、限制Queue中消息的byte长度、溢出类型的设定 当前内容来源:RabbitMQ官方 2.官方的Queue Length Limit介绍 The maximum length of a queue can be limited to a set number of messages, or a set number of bytes (the total of all message body lengths, ignoring

编程学习者的博客 4394

RabbitMQ系列(三)RabbitMQ进阶-Queue队列特性 (一)简单队列

RabbitMQ Exchange和Queue队列 RabbitMQ 任务分发

流浪的喵的博客 2486

解决RabbitMQ队列超长QueueingConsumer导致JVM内存溢出的问题

我们的服务器使用RabbitMQ作为消息中转的容器。某天我怀疑RabbitMQ队列是否都能及时消化。于是用命令查询了下:rabbitmqctllist_vhosts | grep -P ".*\.host" | xargs -i rabbitmqctl list_queues-p {} | grep "queue"。  不查不知道,一查吓一跳:大多数服务器的队列基本上都是空的,但是有些服务器的某

落叶翩翩的CSDN博客 7681

CentOS搭建Zookeeper

CentOS搭建zookeeper

Button的博客 1376

RabbitMQ队列长度限制

队列长度限制 概述 队列的最大长度可以限制为一组消息数或一组字节数(忽略消息属性和其他开销的所有消息体长度总和),或者两者兼有。 对于任何给定的队列,最大长度(任一类型)可以由客户端使用队列的参数来定义,也可以在服务器中使用配置策略(policies)来定义。在策略和参数都指定最大长度的情况下,将应用两个值中的较小值。 对列长度可以使用 operator policies 强制设置。 在所有情况下...

天空之城 2万+

RabbitMQ(十一):RabbitMQ最大连接数

RabbitMQ自带了显示能够接受的最大连接数,有2种比较直观的方式: 1. rabbitmqctl命令 n$ rabbitmqctl status Status of node 'rabbit@10-101-17-13' ... [{pid,23658}, ...... {file_descriptors, [{total_limit,924}, {total_u...

weixin_40805079的博客 1万+

RabbitMq进阶

消息何去何从 mandatory和immediate是channel.basicPublish方法中的两个参数,它们都有 当消息传递过程中不可达目的地时将消息返回给生产者的功能。RabbitMQ提供的备份交换器 (Alternate Exchange)可以将未能被交换器路由的消息(没有绑定队列或者没有匹配的绑定)存 储起来,而不用返回给客户端。 对于初学者来说,特别容易将mandatory和i...

今天吃了吗的博客 1261

学习《消息队列高手课》后总结梳理

消息队列是作为后台开发不可忽视的一个技术,在应用发展到一定阶段,肯定是需要通过消息队列的方式来优化业务处理。消息队列由于它特有的性能,会在特定的场景让用户的体验更好。全方位的了解消息队列的原理,特性有助于提高问题的解决能力,精通特定的某一框架,也会加深对技术的深刻认识。

时光钟摆 3703

RabbitMQ学习(十四):队列长度限制(Queue Length Limit)

说明 在上篇博文《RabbitMQ学习(十三):死信交换机》中,我对官方文档有关死信交换机的内容进行了翻译和学习,文中提到消息成为死信的原因有三种,队列长度的限制就是其中之一。本篇博文我将继续翻译学习官方文档中有关队列长度限制的相关的内容,通过本文记录学习总结有关队列长度限制如何设置,超出限制队列如何处理等内容。 正文 概述 队列的最大长度限制可以是限制消息的数量,或者是消息的总字节数(总字节数表...

wds的博客 9824

RabbitMQ---5、qos内存溢出+prefetch消息堵塞问题

1、prefetch消息堵塞问题 mq是实现代码扩展的有利手段,个人喜欢用概念来学习新知识,介绍堵塞问题的之前,先来段概念的学习。 ConnectionFactory:创建connection的工厂类 Connection: 简单理解为socket Channel:和mq交互的接口,定义queue、exchange和绑定queue、exhange等接口都是它。 接下来就是和mq的交互类 ...

weixin_30346033的博客 825
上一篇: 解决Java从MySQL读取大量数据时卡…
下一篇: 升级CentOS6.6后Java新建线程抛出O…
Runyon1982
博客等级 码龄18年 19粉丝 164原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值