python & zeroMQ - способность обрабатывать сообщения большого размера? - PullRequest
1 голос
/ 15 июля 2011

Я хотел бы использовать python для создания приложения, аналогичного схеме zeroMQ для вентилятора / приемника

Предположим, что у нас есть 10 рабочих , все они работают на одном многоядерном сервере.

Допустим, что каждый 2 [сек] или около того, каждый Рабочий отправляет на Sink сообщение размером 5 [МБ]. Таким образом, Sink должен обрабатывать всего 50 [МБ] (= 10 x 5 [МБ]) каждые 2 [сек] или около того.

Если бы 10 рабочих были на разных машинах, я знаю , что сеть могла бы стать потенциальным узким местом.

Если бы 10 Рабочим пришлось записывать свои данные на диск (I / O), я знаю , что диск мог бы стать потенциальным узким местом.

Учитывая тот факт, что все 10 рабочих являются на одной и той же машине , каких узких мест следует ожидать?

Например, может ли один и тот же 10 рабочих каждый выдавать сообщение размером 10 [МБ] каждые 2 [сек] или около того? Могут ли они отправлять сообщения размером 20 [МБ] каждые 2 [сек] или около того?

Каковы ограничения zmq?

Какие типы узких мест следует ожидать при использовании python и zeroMQ в среде Linux?

1 Ответ

2 голосов
/ 15 июля 2011

Используя PUSH / PULL на том же сервере, я смог максимально увеличить запись в массив raid @ 400MB / sec (ограниченный по скорости записи).Результаты теста 10GbE здесь .Я бы предложил построить несколько простых тестов, производительность будет зависеть от многих факторов, таких как формат сообщения, размер и т. Д.

Например, совершенно тривиальный тест показывает, что zeromq способен отправлять 100 сообщений 10 Мб за 12,3мс на моей машине:

# 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
...