Python与ZeroMQ—处理大消息的能力?
我想用 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
环境下使用 python
和 zeroMQ
时,应该预期会遇到什么类型的瓶颈?
1 个回答
2
在同一台服务器上使用 PUSH
和 PULL
,我已经能够让一个 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