[RabbitMQ] beam.smp high cpu load

本文介绍了解决RabbitMQ集群CPU负载过高的方法。通过分析发现,未被释放的空闲队列导致了资源占用过高。采用设置队列TTL策略的方式,使长时间未使用的队列自动删除,有效降低了系统负载。

A customer reported a function is not working in our django app. That app runs using celery and RabbitMQ. I found out that the celery worker cannot receive tasks from RabbitMQ. Then I checked my RabbitMQ cluster, both servers in the cluster are having a very high cpu load.

I googled and found this article. It suggests the high cpu load may be caused by unused queues not being freed.

So I went though the official RabbitMQ doc and found the Queue TTL policy might be useful. TTL policy will delete unused queue after the expire time you specified.

You can set the policy via

rabbitmqctl set_policy expiry ".*" '{"expires":1800000}' --apply-to queues

This example will expire any queue in the default / vhost after it has been unused for 30 minutes.

<think>我们正在分析 RabbitMQ 服务启动失败的问题。用户提供了执行 `systemctl status rabbitmq-server.service` 的输出片段。 关键点: - 服务状态为 "activating (start)",表示正在启动中(但已经过了1秒,可能卡住了)。 - 日志显示服务在尝试重启(因为之前停止了),但现在启动过程中出现问题。 - 有 ExecStop 的退出状态码为 69(这通常表示服务在停止时遇到了问题,但我们现在关注启动)。 - 主进程(beam.smp,即 Erlang 虚拟机)已经启动,但可能没有完成启动流程。 根据经验,RabbitMQ 启动失败可能的原因包括: 1. 端口冲突(如 4369、5672、25672 等)。 2. Erlang cookie 文件权限问题(位于 /var/lib/rabbitmq/.erlang.cookie)。 3. 磁盘空间不足或内存不足。 4. 配置文件错误(/etc/rabbitmq/rabbitmq.conf)。 5. 节点名称设置问题(hostname 配置)。 由于状态输出显示服务正在启动(但卡在 activating 状态),我们需要查看更详细的日志。 建议用户执行以下命令: - 查看 RabbitMQ 的启动日志:`sudo journalctl -u rabbitmq-server.service -b` (或者用 `rabbitmq-server` 的服务名,这里用户用的是 `rabbitmq-server.service`) 注意:实际的服务名可能是 `rabbitmq-server`,但用户使用的是 `rabbitmq-server.service`,所以日志查看命令应为 `sudo journalctl -u rabbitmq-server.service -b`(查看完整日志)或 `sudo journalctl -u rabbitmq-server.service --since "1 hour ago"`(查看最近日志)。 但用户已经运行了 `systemctl status`,现在我们需要进一步诊断,建议: 1. 查看 RabbitMQ 的启动日志:`sudo rabbitmq-server start` 会打印日志,但更好的方式是查看 RabbitMQ 的日志文件,默认位置在 /var/log/rabbitmq/ 目录下。 2. 或者运行 `sudo rabbitmqctl status` 来检查状态(但服务未启动,所以不行),那么查看日志:`sudo cat /var/log/rabbitmq/rabbit@<hostname>.log` 或 `sudo journalctl -u rabbitmq-server.service` 来获取错误细节。 根据输出中的关键信息:ExecStop 执行了 rabbitmqctl shutdown,返回状态码69(在rabbitmqctl中,69表示节点未运行,这可能是正常的,因为停止时可能节点未运行)。但启动失败。 用户提供的日志片段显示: Aug 06 09:41:41 ... systemd[1]: Stopped RabbitMQ broker. Aug 06 09:41:41 ... systemd[1]: Starting RabbitMQ broker... 然后启动失败。 注意:用户之前运行了 `sudo systemctl enable rabbitmq-server.service` 和 `sudo systemctl start rabbitmq-server.service` 失败,现在再次尝试启动失败。 现在,用户提供了 `systemctl status` 的输出,显示服务正在尝试启动(状态为 activating),但已经过了1秒,还没有完成启动(正常启动可能需要几秒到几十秒,但如果一直卡在 activating,则说明启动过程中卡住)。 根据状态输出中的 ExecStop 返回状态码69(在RabbitMQ中,69通常表示节点未运行,即停止命令执行时服务未运行,所以停止失败,但停止失败后,systemd 会尝试继续启动?这里可能不是问题,因为启动会覆盖停止失败?) 然而,在启动过程中,主进程(beam.smp)已经启动,但可能没有完成初始化。 常见的阻塞原因: - RabbitMQ 启动时需要等待 Erlang 节点发现(epmd)和端口监听,如果网络配置问题(如主机名解析)可能导致启动超时或失败。 因此,我们需要查看 RabbitMQ 的详细日志。建议用户: 1. 查看 RabbitMQ 的日志:`sudo journalctl -u rabbitmq-server.service` 或查看 RabbitMQ 的日志文件(默认在 /var/log/rabbitmq/ 目录下)。 2. 运行 `sudo rabbitmqctl status` 可能无法运行(因为服务未启动),所以需要日志。 但是,根据状态输出,服务在启动,但可能卡在某个点上。此时,日志是关键。 具体步骤: 1. 查看 RabbitMQ 的启动日志:`sudo journalctl -u rabbitmq-server.service --since "1 hour ago"` 或 `sudo journalctl -u rabbitmq-server.service`(如果服务名是 rabbitmq-server.service,则用 rabbitmq-server.service 来查看日志)。 2. 检查是否有端口冲突:`sudo lsof -i :5672`(检查默认端口5672,但 RabbitMQ 使用多个端口)。 3. 检查 Erlang cookie 文件的权限:`ls -l /var/lib/rabbitmq/.erlang.cookie`(注意:实际是 .erlang.cookie 文件)的权限,确保 rabbitmq 用户有读写权限。 但根据状态输出,服务在尝试启动,但卡在启动阶段。可能的原因: - 节点名称与主机名不匹配(需要检查 /etc/rabbitmq/rabbitmq.config 中的节点名称配置)。 - 磁盘空间不足(RabbitMQ 需要磁盘空间)。 建议用户: 1. 查看 RabbitMQ 的启动日志:`sudo journalctl -u rabbitmq-server.service -n 100` (查看最近100行日志)。 2. 检查端口占用:`sudo netstat -tulpn | grep <port>`(检查4369, 5672, 25672等端口是否被占用)。 3. 检查 .erlang.cookie 文件(位于 /var/lib/rabbitmq/.erlang.cookie)的权限:`sudo ls -l /var/lib/rabbitmq/.erlang.cookie` 并确保 rabbitmq 用户有权限访问。 如果日志显示“Waiting for epmd” 或类似消息,可能是网络配置问题(如主机名解析)。 另一种常见问题:Erlang 节点无法通信(可能是防火墙问题)。 建议操作: - 尝试重置 RabbitMQ:`sudo rabbitmqctl reset`(如果数据损坏)。 - 或者重置服务:`sudo rabbitmqctl stop_app` 然后 `sudo rabbitmqctl start_app`。 但是,由于服务启动失败,我们可能需要重置 RabbitMQ 或删除数据库目录(默认在 /var/lib/rabbitmq/mnesia)。 在未明确错误原因前,最直接的方法是查看日志。 根据用户提供的信息,我们还没有完整的日志,因此需要用户查看日志。 请用户运行 `sudo journalctl -u rabbitmq-server.service -b` 来查看启动日志。 同时,注意状态输出中显示服务在尝试启动(卡在 activating),所以可能启动时间过长(比如在等待网络),可以尝试增加启动超时时间(但这不是 systemd 的问题,而是 RabbitMQ 本身启动慢)。 但通常,RabbitMQ 启动慢的原因可能是: - 磁盘慢(特别是磁盘空间不足)。 - 节点需要加入集群(但这里是单节点,所以可能不是)。 因此,我们首先需要日志。 由于用户没有提供日志,我们只能基于常见问题给出建议。 所以,回答应该包括: - 分析状态输出:服务正在启动(卡在 activating),说明启动过程没有完成。 - 建议用户查看完整的日志:`sudo journalctl -u rabbitmq-server.service -b` 或 `sudo journalctl -u rabbitmq-server.service --since "1 hour ago"`(查看最近1小时日志)。 - 根据日志定位错误。 因此,回答如下: 根据您提供的 `systemctl status rabbitmq-server.service` 输出,RabbitMQ 服务正在启动(状态为 activating),但启动时间较长(可能卡住)。常见原因包括: - RabbitMQ 节点无法与自身通信(因为主机名解析问题或网络问题)。 - 磁盘空间不足(RabbitMQ 需要磁盘空间)。 - 内存不足(Erlang 虚拟机需要足够的内存)。 - 配置文件错误(如 rabbitmq.config 中的语法错误)。 建议您: 1. 立即检查日志:`sudo journalctl -u rabbitmq-server.service -b`(查看完整日志)。 2. 检查端口占用:`sudo netstat -tulpn | grep 5672`(检查 RabbitMQ 使用的端口)。 3. 检查磁盘空间:`df -h`(确保 /var 分区有足够空间)。 4. 检查内存:`free -m`(确保有足够内存)。 如果日志显示具体错误,如: - "Erlang node name mismatch":节点名称配置错误(在 /etc/rabbitmq/rabbitmq.config 中配置的节点名必须与主机名匹配)。 - "Disk full":磁盘满。 因此,请先运行 `sudo journalctl -u rabbitmq-server.service -b` 查看完整日志。 根据经验,常见错误: - 权限问题:例如 /var/lib/rabbitmq 目录的权限必须是 rabbitmq 用户可写。 - 节点名冲突:如果之前有 RabbitMQ 节点未完全关闭,可能需要删除锁文件(在 /var/lib/rabbitmq/mnesia 目录下)。 因此,建议操作: - 检查磁盘空间和内存。 - 检查端口占用情况。 - 检查 /var/lib/rabbitmq 目录的权限。 如果日志显示权限问题,运行: `sudo chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/` 但根据以上,最可能的原因是端口冲突或磁盘空间不足。 因此,请用户: - 查看日志:`sudo journalctl -u rabbitmq-server.service -b` - 或检查磁盘空间和内存。 由于状态输出不完整,我们无法直接判断错误,所以需要日志。 因此,回答如下: 您的 RabbitMQ 服务启动失败,根据 systemctl 状态输出,服务在启动中卡住(状态为 activating)。这通常是因为 RabbitMQ 节点在启动时等待网络连接或资源不足(如内存不足)导致。 请执行以下步骤: 1. **查看完整日志**:运行 `sudo journalctl -u rabbitmq-server.service -b` 查看启动日志,寻找错误信息。 2. **检查端口占用**:RabbitMQ 需要多个端口(4369, 5672, 25672等),运行 `sudo netstat -tulpn | grep 5672` 检查端口。 3. **检查磁盘空间**:运行 `df -h` 确保磁盘空间足够。 4. **检查内存**:运行 `free -m` 确保内存充足。 5. **检查 RabbitMQ 数据目录权限**:确保 `/var/lib/rabbitmq` 目录的权限为 rabbitmq 用户所有: ```bash sudo chown -R rabbitmq:rabbitmq /var/lib/rabbitmq ``` 如果日志显示权限问题,请按照上述步骤修复。 如果日志显示端口已被占用,请停止占用端口的服务或修改 RabbitMQ 的端口配置。 如果日志显示 Erlang 节点无法启动(如节点名未解析),请检查 /etc/hosts 文件,确保主机名解析正确。 请用户提供 `sudo journalctl -u rabbitmq-server.service -b` 的完整日志输出(或错误片段),以便进一步分析。 由于用户没有提供完整日志,我们只能给出通用建议。 因此,回答如下:</think>您的 RabbitMQ 服务启动失败,根据 systemctl 状态输出显示: - 服务处于 `activating (start)` 状态(启动中但未完成) - 日志显示服务在尝试重启(`holdoff time over, scheduling restart`),但启动失败 - 关键错误线索是 ExecStop 进程返回状态码 69(通常表示节点未运行) ### 可能原因及解决方案: 1. **节点未完全关闭** **强制重置服务状态**: ```bash sudo rabbitmqctl stop_app # 强制停止残留节点 sudo rabbitmqctl reset # 重置节点状态 sudo rabbitmqctl start_app # 重新启动 ``` 2. **磁盘空间不足导致启动失败** ```bash df -h /var/lib/rabbitmq # 检查 RabbitMQ 数据目录所在分区 sudo rm -rf /var/lib/rabbitmq/mnesia/* # 清理旧日志(谨慎操作) ``` 3. **端口冲突** 检查端口占用并终止冲突进程: ```bash sudo lsof -i :5672 # 检查 RabbitMQ 默认端口 sudo kill -9 <占用进程的PID> # 强制终止占用进程 ``` ### 快速诊断步骤: 1. **检查日志细节**: ```bash sudo journalctl -u rabbitmq-server.service -b --since "1 hour ago" | grep "fail" ``` 2. **修复权限问题**: 确保 `/var/lib/rabbitmq` 目录权限正确: ```bash sudo chown -R rabbitmq:rabbitmq /var/lib/rabbitmq ``` 3. **重置 RabbitMQ 数据库**(如果磁盘空间不足): ```bash sudo rabbitmqctl stop_app sudo rm -rf /var/lib/rabbitmq/mnesia/* # 删除数据文件(生产环境谨慎操作) sudo rabbitmqctl start_app ``` ### 关键操作: - 如果日志显示 `disk_full`,请立即扩展磁盘空间或清理日志 - 如果日志显示节点名称冲突,请修改 `/etc/rabbitmq/rabbitmq.config` 中的节点名
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值