我一直在使用芹菜和rabbitmq作为后端。每当我向rabbitmq发送高负载(大约600-1000)任务时,我都会收到以下错误 socket.error [Errno 104]通过对等方重置连接
我一直使用的示例命令是:
for i in {1..500}; do python client.py queue_name time_out bash -c "sleep 20 && touch folder/$i" & done
for i in {1..500}; do python client.py different_queue_name time_out bash -c "sleep 20 && touch folder/$i" & done
这里client.py发送一个任务,该任务在worker处执行给定的bash命令并轮询结果time_out秒。
我还尝试使用此命令在一段时间内发送加载。它仍然会给出相同的错误
for i in {1..10}; do for i in {1..50}; do python client.py queue_name time_out bash -c "sleep 60 && touch folder/$i" & done; sleep 10; done
for i in {1..10}; do for i in {1..50}; do python client.py different_queue_name time_out bash -c "sleep 60 && touch folder/$i" & done; sleep 10; done
导致此行为的原因是什么?我可以做些什么来处理这种情况?
答案 0 :(得分:2)
=WARNING REPORT== file descriptor limit alarm set.
表示您达到了filedescriptor限制。
你应该调整你的O.S.和RabbitMQ。
这里有一些你应该遵循的链接:
打开文件句柄限制操作系统限制最大数量 并发打开文件句柄,包括网络套接字。使 确保您将限制设置得足够高以允许预期数量 并发连接和队列。
确保您的环境允许至少50K的打开文件 有效RabbitMQ用户的描述符,包括在开发中 的环境中。
根据经验,多数并发第95百分位数 连接2并添加要计算的队列总数 建议打开文件句柄限制。高达500K的值不是 不足,不会消耗大量的硬件资源,而且 因此建议用于生产设置。请参阅网络指南 了解更多信息。
Erlang VM I / O线程池Erlang运行时使用一个线程池 异步执行I / O操作。游泳池的大小是 通过+ A VM命令行标志配置,例如+ A 128.我们非常高兴 建议使用。覆盖标志
RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS
环境变量:RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS =“+ A 128”默认值为30。 建议使用具有8个或更多可用内核的节点 值大于96,即每个核心有12个或更多I / O线程 可用。请注意,较高的值并不一定意味着更好 吞吐量或由于等待I / O而导致的CPU损耗降低。调整大型 连接数
一些工作负载,通常被称为“物联网”,假设 每个节点有大量的客户端连接,而且相对较低 来自每个节点的流量。一个这样的工作量是传感器 网络:可能有数十万或数百万个传感器 部署,每隔几分钟发出一次数据。优化 最大并发客户端数量可能比更重要 总吞吐量。
有几个因素可以限制单个并发连接的数量 节点可以支持:
打开的文件句柄数(包括套接字)使用的RAM数量 每个连接每个连接使用的CPU资源量
希望有所帮助