如何减少 celery worker 网络开销?
How can I scale down celery worker network overhead?
我是 运行 一个在 AWS 上运行 celery 的 Web 应用程序。然而,所有工作进程都运行在私有数据中心(校园超级计算机)中。我有 34 个独立的工作进程 运行 使用作业,用于代理和后端的 rabbitmq 和 Redis 实例存在于我的 EC2 实例中的 AWS 上。
上个月我震惊地发现,在没有向应用程序提交作业的情况下,我在托管 rabbit 和 Redis 的 EC2 实例上仍然使用了将近 700GB 的网络带宽(仅传出流量!)。此流量完全是由 celery worker 与 rabbit 实例的开销通信引起的。尽管没有要处理的实际计算作业,但仍有近 17 messages/second 被发送到每个工作实例。
我的任务很长 运行(至少是多秒,有时是多分钟)、繁重的计算作业,因此任务检索的高延迟是完全可以接受的——以秒为单位的时间尺度很好。理想情况下,我想告诉我的 celery 工作人员每隔几秒检查一次新任务并停止所有其他网络开销通信。
有没有办法减少 celery worker 的整体网络开销?
根据 CloudAMQP 上的 this 文章,除了其他设置外,他们还建议 运行 worker 使用以下三个标志来限制 worker 的闲聊:
celery -A my_celery_app worker --without-heartbeat --without-gossip --without-mingle
这个以其他形式提出的问题似乎对堆栈溢出有一些讨论 。
Celery 文档在这些标志上非常不透明。有一些关于心跳的信息 here.
在使用 iptraf
对自己进行了一些分析之后(快速概览 here), I was able to learn that the --without-gossip
flag cuts celery overhead by 95%. It appears the gossip feature subscribes all workers to all other worker related events, like heartbeats and clock synchronization. This creates an N^2 scaling curve with N being the number of workers. This quickly creates tons of network chattiness and unless you have written your own code that leverages the gossip feature,看来所有这些交流都是完全没有必要的。
我的分析证实 --without-mingle
仅减少了 worker 启动通信,但对长期网络开销没有影响。
心跳似乎确实会消耗一些网络开销。令人惊讶的是,有 34 个工作人员和 120 秒的 broker_heartbeat
和 3.0 秒的 broker_heartbeat_checkrate
我仍然会为这些心跳检查产生 21GB/月(粗略分析)的网络开销。我不清楚从文档中禁用它们对应用程序的影响——工作人员是否会检测到代理是否不可用?我通过终止我的 RabbitMQ 实例并监视工作日志(通过 --without-heartbeat
的工作人员)进行了基本检查。他们似乎很快(在几秒钟内)检测到代理丢失,并在我重新启动代理后立即重新连接。所以我的基本观察表明,不需要心跳来维持芹菜工人的普遍预期行为。那么心跳有什么意义呢?我不清楚。
以上三个标志似乎通过消除所有多余的消息传递来减少所有不必要的工作网络开销。在没有启用这些功能的情况下,celery worker 的行为似乎也符合预期。
我是 运行 一个在 AWS 上运行 celery 的 Web 应用程序。然而,所有工作进程都运行在私有数据中心(校园超级计算机)中。我有 34 个独立的工作进程 运行 使用作业,用于代理和后端的 rabbitmq 和 Redis 实例存在于我的 EC2 实例中的 AWS 上。
上个月我震惊地发现,在没有向应用程序提交作业的情况下,我在托管 rabbit 和 Redis 的 EC2 实例上仍然使用了将近 700GB 的网络带宽(仅传出流量!)。此流量完全是由 celery worker 与 rabbit 实例的开销通信引起的。尽管没有要处理的实际计算作业,但仍有近 17 messages/second 被发送到每个工作实例。
我的任务很长 运行(至少是多秒,有时是多分钟)、繁重的计算作业,因此任务检索的高延迟是完全可以接受的——以秒为单位的时间尺度很好。理想情况下,我想告诉我的 celery 工作人员每隔几秒检查一次新任务并停止所有其他网络开销通信。
有没有办法减少 celery worker 的整体网络开销?
根据 CloudAMQP 上的 this 文章,除了其他设置外,他们还建议 运行 worker 使用以下三个标志来限制 worker 的闲聊:
celery -A my_celery_app worker --without-heartbeat --without-gossip --without-mingle
这个以其他形式提出的问题似乎对堆栈溢出有一些讨论
Celery 文档在这些标志上非常不透明。有一些关于心跳的信息 here.
在使用 iptraf
对自己进行了一些分析之后(快速概览 here), I was able to learn that the --without-gossip
flag cuts celery overhead by 95%. It appears the gossip feature subscribes all workers to all other worker related events, like heartbeats and clock synchronization. This creates an N^2 scaling curve with N being the number of workers. This quickly creates tons of network chattiness and unless you have written your own code that leverages the gossip feature,看来所有这些交流都是完全没有必要的。
我的分析证实 --without-mingle
仅减少了 worker 启动通信,但对长期网络开销没有影响。
心跳似乎确实会消耗一些网络开销。令人惊讶的是,有 34 个工作人员和 120 秒的 broker_heartbeat
和 3.0 秒的 broker_heartbeat_checkrate
我仍然会为这些心跳检查产生 21GB/月(粗略分析)的网络开销。我不清楚从文档中禁用它们对应用程序的影响——工作人员是否会检测到代理是否不可用?我通过终止我的 RabbitMQ 实例并监视工作日志(通过 --without-heartbeat
的工作人员)进行了基本检查。他们似乎很快(在几秒钟内)检测到代理丢失,并在我重新启动代理后立即重新连接。所以我的基本观察表明,不需要心跳来维持芹菜工人的普遍预期行为。那么心跳有什么意义呢?我不清楚。
以上三个标志似乎通过消除所有多余的消息传递来减少所有不必要的工作网络开销。在没有启用这些功能的情况下,celery worker 的行为似乎也符合预期。