Celery worker与Rabbitmq的连接在gevent或eventlet模式下遇到断管错误

Celery worker与Rabbitmq的连接在gevent或eventlet模式下遇到断管错误,rabbitmq,celery,gevent,broken-pipe,eventlet,Rabbitmq,Celery,Gevent,Broken Pipe,Eventlet,我运行此命令是为了解决芹菜工人与Rabbitmq的连接在Gevent模式下遇到断管错误的问题。当芹菜工人在进程池模式下工作时没有问题(没有gevent,没有猴子补丁) 之后,芹菜工人将不再从Rabbitmq获取任务消息,直到他们重新启动 当芹菜工人使用任务消息的速度比Django应用程序生成消息的速度慢,并且Rabbitmq中堆积了大约3万亿条消息时,就会出现这个问题 Gevent版本1.1.0 芹菜3.1.22版 =======芹菜日志====== [2016-08-08 13:52:06,9

我运行此命令是为了解决芹菜工人与Rabbitmq的连接在Gevent模式下遇到断管错误的问题。当芹菜工人在进程池模式下工作时没有问题(没有gevent,没有猴子补丁)

之后,芹菜工人将不再从Rabbitmq获取任务消息,直到他们重新启动

当芹菜工人使用任务消息的速度比Django应用程序生成消息的速度慢,并且Rabbitmq中堆积了大约3万亿条消息时,就会出现这个问题

Gevent版本1.1.0

芹菜3.1.22版

=======芹菜日志======

[2016-08-08 13:52:06,913: CRITICAL/MainProcess] Couldn't ack 293, reason:error(32, 'Broken pipe')
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/kombu/message.py", line 93, in ack_log_error
    self.ack()
  File "/usr/local/lib/python2.7/site-packages/kombu/message.py", line 88, in ack
    self.channel.basic_ack(self.delivery_tag)
  File "/usr/local/lib/python2.7/site-packages/amqp/channel.py", line 1584, in basic_ack
    self._send_method((60, 80), args)
  File "/usr/local/lib/python2.7/site-packages/amqp/abstract_channel.py", line 56, in _send_method
    self.channel_id, method_sig, args, content,
  File "/usr/local/lib/python2.7/site-packages/amqp/method_framing.py", line 221, in write_method
    write_frame(1, channel, payload)
  File "/usr/local/lib/python2.7/site-packages/amqp/transport.py", line 182, in write_frame
    frame_type, channel, size, payload, 0xce,
  File "/usr/local/lib/python2.7/site-packages/gevent/_socket2.py", line 412, in sendall
    timeleft = self.__send_chunk(chunk, flags, timeleft, end)
  File "/usr/local/lib/python2.7/site-packages/gevent/_socket2.py", line 351, in __send_chunk
    data_sent += self.send(chunk, flags)
  File "/usr/local/lib/python2.7/site-packages/gevent/_socket2.py", line 320, in send
    return sock.send(data, flags)
error: [Errno 32] Broken pipe
=======Rabbitmq日志==================

=ERROR REPORT==== 8-Aug-2016::14:28:33 ===
closing AMQP connection <0.15928.4> (10.26.39.183:60732 -> 10.26.39.183:5672):
{writer,send_failed,{error,enotconn}}

=ERROR REPORT==== 8-Aug-2016::14:29:03 ===
closing AMQP connection <0.15981.4> (10.26.39.183:60736 -> 10.26.39.183:5672):
{writer,send_failed,{error,enotconn}}

=ERROR REPORT==== 8-Aug-2016::14:29:03 ===
closing AMQP connection <0.15955.4> (10.26.39.183:60734 -> 10.26.39.183:5672):
{writer,send_failed,{error,enotconn}}

添加设置和负载测试信息

我们使用supervisor启动芹菜,并提供以下选项

celery worker -A celerytasks.celery_worker_init -Q default -P gevent -c 1000 --loglevel=info
芹菜使用Rabbitmq作为代理

通过在管理器配置中指定“numprocs=4”,我们有4个芹菜工作进程

我们使用jmeter模拟web访问负载,Django应用程序将生成供芹菜工人使用的任务。这些任务基本上需要访问Mysql数据库来获取/更新一些数据


从rabbitmq web管理页面,任务的生成速度大约为50/s,而消耗速度大约为20/s。在大约1分钟的负载测试后,日志文件显示Rabbitmq和Celery met Breaked Pipe error之间的许多连接

您能否提供有关您的设置和尝试测试的工作负载的更多详细信息?从这个错误来看,这似乎只是一个网络问题,但可能与其他事情有关。@lesingerouge,请将这些信息添加到我文章的底部。我不认为这是一个随机的网络问题,因为每次我们进行测试时,这个问题都会重现。当芹菜工人处于处理池模式时,一切都进行得很顺利。芹菜的作者Ask怀疑这是一个bug。我很好奇以前没有人见过这么广泛使用的工具?在谷歌搜索之后,我没有发现类似的帖子。你用什么操作系统来运行这些测试?当你启动芹菜工人时,你试过改变绿色线程的数量吗?例如,使用100、200、500个线程进行测试,看看是否有任何差异?我这样问是因为这听起来像是TCP端口问题。我在Windows上遇到过这个问题,但在Linux上从未遇到过。
celery worker -A celerytasks.celery_worker_init -Q default -P gevent -c 1000 --loglevel=info