Python与ZeroMQ—处理大消息的能力?

1 投票
1 回答
4107 浏览
提问于 2025-04-16 21:34

我想用 python 来做一个应用,类似于 zeroMQ 的通风口/水槽方案

假设我们有 10 个工作者,它们都在同一台 多核 服务器上运行。

假设每隔 2 秒,每个 工作者水槽 发送一个大小为 5[MB] 的消息。那么,水槽 每隔 2 秒 就需要处理总共 50[MB](= 10 x 5[MB])的数据。

如果这 10 个 工作者 在不同的机器上,我 知道 网络可能会成为一个瓶颈。

如果这 10 个 工作者 需要把数据写入磁盘(I/O),我 知道 磁盘也可能会成为一个瓶颈。

既然这 10 个 工作者 都在 同一台机器上,那么我们应该预期会有什么瓶颈呢?

比如说,这 10 个 工作者 能否每隔 2 秒 向水槽发送一个大小为 10[MB] 的消息?它们能否每隔 2 秒 发送一个大小为 20[MB] 的消息?

zmq 有什么限制?

Linux 环境下使用 pythonzeroMQ 时,应该预期会遇到什么类型的瓶颈?

1 个回答

2

在同一台服务器上使用 PUSHPULL,我已经能够让一个 RAID 阵列的写入速度达到每秒 400MB(写入速度是瓶颈)。这里有一些 10GbE 的基准测试结果 链接。我建议你可以做一些简单的基准测试,因为性能会受到很多因素的影响,比如消息格式、大小等等。

举个例子,一个非常简单的基准测试显示,在我的机器上,zeromq 能够在 12.3 毫秒内发送 100 个 10MB 的消息:

# server
import zmq

context = zmq.Context()
reciever = context.socket(zmq.PULL)
reciever.bind('tcp://127.0.0.1:5555')

while True:
    reciever.recv()

# client
import os, zmq

context = zmq.Context()
pusher = context.socket(zmq.PUSH)
pusher.connect('tcp://127.0.0.1:5555')

message = ' ' * 10485760

>>> %timeit pusher.send(message)
100 loops, best of 3: 12.3 ms per loop

撰写回答