客户端调用rocketmq同步生产 进行压测过程中,一段时间后报错:service not available now. It may be caused by one of the following reasons: the broker's disk is full [CL: 0.24 CQ: 0.24 INDEX: 0.24], messages are put to the slave, message store has been shut down
目前只是单机测试,只启动了一个beoker, 对应版本是4.9.7, broker启动时指定的broker.conf的配置项如图:
这个问题会与broker所在服务器中的文件句柄数有关么?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的错误信息 service not available now. It may be caused by one of the following reasons: the broker's disk is full [CL: 0.24 CQ: 0.24 INDEX: 0.24], messages are put to the slave, message store has been shut down
,可以初步判断以下可能原因:
the broker's disk is full
,这表明 RocketMQ 的存储目录(CommitLog、ConsumeQueue 和 Index 文件)所在的磁盘可能已接近或达到容量上限。接下来,我们将针对这些可能性逐一分析,并结合知识库中的内容提供解决方案。
RocketMQ 的存储机制依赖于磁盘空间,尤其是 CommitLog、ConsumeQueue 和 Index 文件。如果磁盘空间不足,Broker 将无法继续写入消息,从而触发该错误。
解决方法: - 检查 Broker 所在服务器的磁盘使用情况,确保有足够的可用空间。可以通过以下命令查看磁盘使用率:
df -h
broker.conf
中的 storePathRootDir
配置项,指向新的存储路径。broker.conf
中,可以通过以下参数限制磁盘使用率:
diskMaxUsedSpaceRatio=85
该参数表示磁盘使用率达到 85% 时,Broker 将停止写入消息。建议根据实际磁盘容量调整该值。
RocketMQ 在运行过程中需要打开大量的文件句柄,尤其是在高并发场景下。如果服务器的文件句柄数限制过低,可能会导致无法正常写入消息。
解决方法: - 检查当前系统的文件句柄数限制:
ulimit -n
默认情况下,Linux 系统的文件句柄数限制可能较低(如 1024),这可能不足以支持 RocketMQ 的高并发写入。 - 提高文件句柄数限制。可以通过以下步骤进行调整: 1. 编辑 /etc/security/limits.conf
文件,添加以下内容: plaintext * soft nofile 65535 * hard nofile 65535
2. 编辑 /etc/pam.d/common-session
和 /etc/pam.d/common-session-noninteractive
文件,添加以下内容: plaintext session required pam_limits.so
3. 重启服务器以使配置生效。 - 验证调整后的文件句柄数限制:
ulimit -n
在单机测试环境中,Broker 的资源配置可能不足以支持高并发压测。例如,内存不足、线程池配置不合理等问题可能导致性能瓶颈。
解决方法: - 检查 Broker 的 JVM 配置,确保分配了足够的内存。可以在启动脚本中调整 JVM 参数,例如:
JAVA_OPT="${JAVA_OPT} -Xms4g -Xmx4g -Xmn2g"
这里的 -Xms
和 -Xmx
分别表示 JVM 的初始堆内存和最大堆内存,-Xmn
表示新生代内存大小。根据服务器的物理内存调整这些参数。 - 检查 broker.conf
中的线程池配置,确保线程池大小能够满足压测需求。例如:
sendMessageThreadPoolNums=16
pullMessageThreadPoolNums=16
这些参数分别表示发送消息和拉取消息的线程池大小,可以根据压测的并发量适当增加。
ConsumerLagLatencyPerGidTopic
)来判断是否存在堆积问题。根据上述分析,您的问题可能与以下因素有关: 1. 磁盘空间不足:检查磁盘使用率并清理空间,或调整磁盘使用阈值。 2. 文件句柄数限制:提高系统的文件句柄数限制。 3. 资源配置不足:优化 JVM 和线程池配置,确保 Broker 能够支持高并发压测。
建议按照以下步骤排查和解决问题: 1. 检查磁盘空间使用率,确保有足够的可用空间。 2. 检查并提高文件句柄数限制。 3. 优化 Broker 的 JVM 和线程池配置。 4. 监控消息堆积量和 TPS 指标,确保未触发流控或堆积问题。
如果问题仍未解决,请提供更多上下文信息(如完整的 broker.conf
配置、压测工具的参数等),以便进一步分析。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/