[1149]RabbitMQ CPU 占用过高优化

2023-10-31

背景

服务器上搭建的 RabbitMQ 在并发量不是很大的情况下 CPU 占用竟然达到了 40% 左右,这种情况第一感觉是不科学的,推测应该是使用不当或哪里配置不合理造成的。

问题排查

首先通过 top 命令查看到 CPU 和 内存使用情况:
image.png

error_logger 问题

然后可以通过 RabbitMQ 提供的插件 rabbitmq_top 来查看详细的各个线程内存和 CPU 的使用情况。首先我们通过命令 rabbitmq-plugins list 查看所有插件及开启情况,然后使用命令 rabbitmq-plugins enable rabbitmq_top 开启插件,关闭插件的命令是 rabbitmq-plugins disable rabbitmq_top 。这样开启后就能在 RabbitMQ 的管理后台查看了。如下图:

然后点击 Reductions / sec 排序,这个值越大表示的 CPU 的使用越高。会发现 error_logger 程序的 CPU 使用最高,从描述上看是和日志相关。
image.png

自然地要去看日志输出有没有什么异常,通过查看日志文件发现并没有什么异常,而且日志输出的内容很少。然后改变了日志等级为 debug (rabbitmqctl set_log_level debug)看下详细的日志,发现有start_link 日志。

2020-05-21 10:43:01.177 [debug] <0.21161.3240> Supervisor {<0.21161.3240>,rabbit_channel_sup} started rabbit_writer:start_link(#Port<0.176195>, 1571, 131072, rabbit_framing_amqp_0_9_1, <0.29275.7908>, {<<"10.244.5.77:58214 -> 10.244.3.9:5672">>,1571}, true) at pid <0.20273.3240>
2020-05-21 10:43:01.177 [debug] <0.21161.3240> Supervisor {<0.21161.3240>,rabbit_channel_sup} started rabbit_limiter:start_link({<<"10.244.5.77:58214 -> 10.244.3.9:5672">>,1571}) at pid <0.21143.3240>
2020-05-21 10:43:01.177 [debug] <0.21161.3240> Supervisor {<0.21161.3240>,rabbit_channel_sup} started rabbit_channel:start_link(1571, <0.29275.7908>, <0.20273.3240>, <0.29275.7908>, <<"10.244.5.77:58214 -> 10.244.3.9:5672">>, rabbit_framing_amqp_0_9_1, {user,<<"guest">>,[administrator],[{rabbit_auth_backend_internal,none}]}, <<"...">>, [{<<"exchange_exchange_bindings">>,bool,true},{<<"connection.blocked">>,bool,true},{<<"authentica...">>,...},...], <0.29654.7908>, <0.21143.3240>) at pid <0.20766.3240>
2020-05-21 10:43:01.225 [debug] <0.21123.3240> Supervisor {<0.21123.3240>,rabbit_channel_sup} started rabbit_writer:start_link(#Port<0.80537>, 41, 131072, rabbit_framing_amqp_0_9_1, <0.28490.3357>, {<<"10.244.2.171:55900 -> 10.244.3.9:5672">>,41}, true) at pid <0.21071.3240>
2020-05-21 10:43:01.225 [debug] <0.21123.3240> Supervisor {<0.21123.3240>,rabbit_channel_sup} started rabbit_limiter:start_link({<<"10.244.2.171:55900 -> 10.244.3.9:5672">>,41}) at pid <0.20379.3240>
2020-05-21 10:43:01.225 [debug] <0.21123.3240> Supervisor {<0.21123.3240>,rabbit_channel_sup} started rabbit_channel:start_link(41, <0.28490.3357>, <0.21071.3240>, <0.28490.3357>, <<"10.244.2.171:55900 -> 10.244.3.9:5672">>, rabbit_framing_amqp_0_9_1, {user,<<"guest">>,[administrator],[{rabbit_auth_backend_internal,none}]}, <<"...">>, [{<<"exchange_exchange_bindings">>,bool,true},{<<"connection.blocked">>,bool,true},{<<"authentica...">>,...},...], <0.28524.3357>, <0.20379.3240>) at pid <0.21072.3240>
2020-05-21 10:43:01.229 [debug] <0.21280.3240> Supervisor {<0.21280.3240>,rabbit_channel_sup} started rabbit_writer:start_link(#Port<0.176195>, 1571, 131072, rabbit_framing_amqp_0_9_1, <0.29275.7908>, {<<"10.244.5.77:58214 -> 10.244.3.9:5672">>,1571}, true) at pid <0.21014.3240>
2020-05-21 10:43:01.229 [debug] <0.21280.3240> Supervisor {<0.21280.3240>,rabbit_channel_sup} started rabbit_limiter:start_link({<<"10.244.5.77:58214 -> 10.244.3.9:5672">>,1571}) at pid <0.20939.3240>
2020-05-21 10:43:01.230 [debug] <0.21280.3240> Supervisor {<0.21280.3240>,rabbit_channel_sup} started rabbit_channel:start_link(1571, <0.29275.7908>, <0.21014.3240>, <0.29275.7908>, <<"10.244.5.77:58214 -> 10.244.3.9:5672">>, rabbit_framing_amqp_0_9_1, {user,<<"guest">>,[administrator],[{rabbit_auth_backend_internal,none}]}, <<"...">>, [{<<"exchange_exchange_bindings">>,bool,true},{<<"connection.blocked">>,bool,true},{<<"authentica...">>,...},...], <0.29654.7908>, <0.20939.3240>) at pid <0.21039.3240>
2020-05-21 10:43:01.253 [debug] <0.20564.3240> Supervisor {<0.20564.3240>,rabbit_channel_sup} started rabbit_writer:start_link(#Port<0.80537>, 41, 131072, rabbit_framing_amqp_0_9_1, <0.28490.3357>, {<<"10.244.2.171:55900 -> 10.244.3.9:5672">>,41}, true) at pid <0.20612.3240>
2020-05-21 10:43:01.253 [debug] <0.20564.3240> Supervisor {<0.20564.3240>,rabbit_channel_sup} started rabbit_limiter:start_link({<<"10.244.2.171:55900 -> 10.244.3.9:5672">>,41}) at pid <0.20962.3240>
2020-05-21 10:43:01.254 [debug] <0.20564.3240> Supervisor {<0.20564.3240>,rabbit_channel_sup} started rabbit_channel:start_link(41, <0.28490.3357>, <0.20612.3240>, <0.28490.3357>, <<"10.244.2.171:55900 -> 10.244.3.9:5672">>, rabbit_framing_amqp_0_9_1, {user,<<"guest">>,[administrator],[{rabbit_auth_backend_internal,none}]}, <<"....">>, [{<<"exchange_exchange_bindings">>,bool,true},{<<"connection.blocked">>,bool,true},{<<"authentica...">>,...},...], <0.28524.3357>, <0.20962.3240>) at pid <0.20158.3240>
2020-05-21 10:43:01.260 [debug] <0.21185.3240> Supervisor {<0.21185.3240>,rabbit_channel_sup} started rabbit_writer:start_link(#Port<0.176195>, 1571, 131072, rabbit_framing_amqp_0_9_1, <0.29275.7908>, {<<"10.244.5.77:58214 -> 10.244.3.9:5672">>,1571}, true) at pid <0.20278.3240>
2020-05-21 10:43:01.260 [debug] <0.21185.3240> Supervisor {<0.21185.3240>,rabbit_channel_sup} started rabbit_limiter:start_link({<<"10.244.5.77:58214 -> 10.244.3.9:5672">>,1571}) at pid <0.20461.3240>
2020-05-21 10:43:01.261 [debug] <0.21185.3240> Supervisor {<0.21185.3240>,rabbit_channel_sup} started rabbit_channel:start_link(1571, <0.29275.7908>, <0.20278.3240>, <0.29275.7908>, <<"10.244.5.77:58214 -> 10.244.3.9:5672">>, rabbit_framing_amqp_0_9_1, {user,<<"guest">>,[administrator],[{rabbit_auth_backend_internal,none}]}, <<"....">>, [{<<"exchange_exchange_bindings">>,bool,true},{<<"connection.blocked">>,bool,true},{<<"authentica...">>,...},...], <0.29654.7908>, <0.20461.3240>) at pid <0.20990.3240>
2020-05-21 10:43:01.268 [debug] <0.21033.3240> Supervisor {<0.21033.3240>,rabbit_channel_sup} started rabbit_writer:start_link(#Port<0.80537>, 41, 131072, rabbit_framing_amqp_0_9_1, <0.28490.3357>, {<<"10.244.2.171:55900 -> 10.244.3.9:5672">>,41}, true) at pid <0.20840.3240>
2020-05-21 10:43:01.269 [debug] <0.21033.3240> Supervisor {<0.21033.3240>,rabbit_channel_sup} started rabbit_limiter:start_link({<<"10.244.2.171:55900 -> 10.244.3.9:5672">>,41}) at pid <0.21042.3240>

后来经过一系列的查找,在生产者发生完消息后,执行下面语句能够减少日志输出:

RabbitUtils.isPhysicalCloseRequired();

修改完客户端的代码后,发现rabbitMQ 的 CPU 降了几个百分点,但是还是很高。那么就表明 CPU 的占用高不是因为 error_logger 引起的。

erlang 调度器问题

通过 top -H -p PID 命令查看 beam.smp 进程里的每个线程的 CPU 使用情况:
image.png

发现主要是 erlang 语言的两个调度器(调度器有关文档:https://hamidreza-s.github.io/erlang/scheduling/real-time/preemptive/migration/2016/02/09/erlang-scheduler-details.html)占用 CPU。通过命令 rabbitmq-diagnostics runtime_thread_stats 查看线程的运行状况,发现两个调度器的 sleep 时间在 99 % ,也就是说调度器大部分时间是空闲的。在官方文档中有一节讲到了 CPU 相关的内容:https://www.rabbitmq.com/runtime.html#cpu。里面提到了调度器在从 sleep 状态转换成工作状态是需要一定的成本的,因此在调度器没有任务调度时默认会延迟一段时间才进入 sleep 状态,调度器的忙等待是会占用 CPU的。因此我们可以通过禁用忙等待来降低 CPU 的消耗:

RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="+sbwt none +sbwtdcpu none +sbwtdio none"

这条配置需要添加到文件 /etc/rabbitmq/rabbitmq-env.conf 中,如果没有则创建该文件。

文档上还给出了,在共享或CPU受限的环境(包括容器化的环境)中,可能需要显式配置调度程序个数。我们也可以通过改变调度器个数来降低 CPU 的消耗:

RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="+S 1:1"

上面的两种方式的修改经过压测都可以有效的降低 CPU 的占用,效果上相差不大,在多核 CPU 的情况下多个调度器可能 CPU 的利用率更高。在实际的应用中要根据实际情况进行选择。

总结

上面主要介绍了 RabbitMQ 占用 CPU 高的排查过程和解决方案,一种方案是禁止调度器忙等,另一种是通过减少调度器的个数。这两种方案的选择还要根据实际情况进行选择,比如消息的生产/消费并发量,或着服务器的配置等。

来源:https://blog.csdn.net/u010657094/article/details/106392113
https://www.codenong.com/cs106392113/
https://stackoom.com/question/1hZuW
https://blog.csdn.net/whatday/article/details/114478698
https://blog.csdn.net/qq_18630487/article/details/113681802

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[1149]RabbitMQ CPU 占用过高优化 的相关文章

随机推荐

  • gcc/g++搜索路径

    一 查看gcc g 默认include路径 1 gcc print prog name cc1plus v 2 g print prog name cc1plus v 3 echo main gcc E v 二 include搜索路径 1
  • 论文笔记:Mind the Gap An Experimental Evaluation of Imputation ofMissing Values Techniques in TimeSeries

    pVLDB 2020 1 abstract intro 这篇论文横向比较了12种 time series imputation的方法 作者声称这是第一篇深入讨论这些模型的准确度 效率和参数化 由于不同的方法使用的编程语言不同 作者用C 重新
  • 786. 第k个数

    文章目录 Question Ideas Code Question 给定一个长度为 n 的整数数列 以及一个整数 k 请用快速选择算法求出数列从小到大排序后的第 k 个数 输入格式 第一行包含两个整数 n 和 k 第二行包含 n 个整数 所
  • Jetbrains开发者日见闻(三)之Kotlin1.3新特性(inline class篇)

    简述 上接上篇文章 我们深入分析了Kotlin1 3版本中的Contract契约的内容 那么这篇文章将会继续把Kotlin1 3新特性研究完毕 这篇文章还有个非常重要的点就是inline class 内联类 关于内联类的知识除了这篇文章会有
  • [PPPOE]报文交互分析

    1 简介 PPPoE PPP Over Ethernet 协议是在点到点链路上承载网络层数据包的一种链路层协议 由于它能够提供用户验证 易于扩充 并且支持同 异步通信 因而获得广泛应用 PPPoE主要协议标准 RFC2516 图 PPPOE
  • 字母顺序排序

    这周做题的时候遇到了一些困难 当时一直程序并没有报错但就是不知道哪错了 后来通过问同学 终于知道哪错了 其实有的时候哪怕你多加了一个等于号 而以至于程序达不到你需要的效果 也是有的 所以一定不要让数组运行时少一次 否则有可能到后面就出错了
  • python自动化:系统凭据的获取与添加

    在自动化流程开发中 我们经常会遇到输入帐号 密码的情况 帐号明文还可以 但是密码不想展示给他人 但是不想自己去手动输入怎么办 基于以上情况我们可以使用windows自带的凭据管理器进行密码存储 其实我们经常用的git也存储在这里 首先搜索
  • shader里的uv是什么

    shader里的uv是什么 前言 先看一段shadertoy大牛写的代码 vec3 getPixel in vec2 coord float time vec2 uv coord iResolution xy uv uv 2 0 1 0 u
  • 考研数学基础30讲

    基础30讲 第1讲 高等数学预备知识 一 函数的概念与特性 1 函数 2 反函数 3 复合函数 4 函数的四种特性 第1讲 高等数学预备知识 一 函数的概念与特性 1 函数 设x与y是两个变量 D是一个给定的数集 若对于每个值x in D
  • JavaScript中的设计原则

    文章目录 一 单一职责原则 1 运用了单一职责 SRP 的设计模式 2 何时应该分离职责 3 优缺点 二 最少知识原则 1 运用了最少知识原则的设计模式 三 开放 封闭原则 1 运用了开放 封闭原则的设计模式 2 接受第一次愚弄 三 接口和
  • 1010 Radix (25 分)

    题目 题目链接 题解 二分 数学 先说几点注意事项 开 LL 最高进制不是35 可以更高 枚举可能的进制时存在爆LL的情况 整体思路 先计算出知道进制的那个数对应的十进制数 二分进制 找到某个进制使得另一个数对应的十进制数与已知的十进制数相
  • 异步信号的去抖电路及同步电路

    异步输入的问题 如果电路有异步信号 就可能使电路进入亚稳态 因为异步信号可能处于时钟信号建立时间以内 即是输出不确定的状态 去抖电路 异步信号如果是外部的机械输入 比如键盘等 输入信号就会产生机械性地振荡 因此首先需要对此类异步信号加一个去
  • 计算机网络-网络层

    网络层 1 前言 2 网络层的作用 3 网络层数据交换 4 网络层协议及报文格式 5 ARP与RARP 6 国际控制报文协议ICMP 1 前言 网络层介于传输层和数据链路层之间 其主要作用是实现两个网络系统之间的数据透明传送 具体包括路由选
  • openpyxl空值填充、分列、单元格百分比格式显示

    还是之前的日报 处理一个xlsx文件 需求描述如下 不多说 上代码 import openpyxl as op import time lxwb i1 op load workbook 文件路径 5GR I1 15个对象属性空值核对 s x
  • 【计量统计】计量经济学导论常见公式原理及习题解答

    关键词 Stata 计量经济学 习题解答 一 简单二元回归模型 y b 0 b 1
  • 电脑计算机推荐笔记本电脑,十佳办公笔记本电脑排名,性价比高的笔记本电脑推荐...

    商务人士人手必备一台办公笔记本 这样在需要的时候 随时都能办公 当然选择笔记本最重要的是性能好 要方便携带 这里有十大最优质的办公笔记本推荐 足够高的性价比 方便你随身携带随时办公 成为一位优秀的商务人士 1 华硕灵耀S4300FN 这款笔
  • 云孚科技受邀参加第二十二届中国计算语言学大会(CCL 2023)

    云孚科技 CCL 2023 中国计算语言学大会 2023年8月3日 8月6日 第二十二届中国计算语言学大会 CCL 2023 在哈尔滨市成功举行 本次大会由中国中文信息学会主办 哈尔滨工业大学承办 涵盖计算语言学领域最新技术和动向 为与会专
  • 中小型企业网络规划设计方案_实战:企业网络系统规划与设计与事项

    某大中型企业 有多个部门 财务部 人事部 销售部 工程部 同部门之间采用二层交换网络相连 不同部门之间采用VLAN路由方式互访 企业有一台内部web服务器 承载着内部网站 方便员工了解公司的即时信息 局域网路由器启用多种路由协议 静态路由
  • 禁止缩放meta标签

    转载于 https www cnblogs com LiuJL p 10977907 html
  • [1149]RabbitMQ CPU 占用过高优化

    文章目录 背景 问题排查 error logger 问题 erlang 调度器问题 总结 背景 服务器上搭建的 RabbitMQ 在并发量不是很大的情况下 CPU 占用竟然达到了 40 左右 这种情况第一感觉是不科学的 推测应该是使用不当或