高负载的Rabbitmq:Socket.error [Errno 104]连接由同行重置

时间:2016-01-13 07:50:47

标签: python sockets rabbitmq celery

我一直在使用芹菜和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

导致此行为的原因是什么?我可以做些什么来处理这种情况?

1 个答案:

答案 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资源量

希望有所帮助