ZeroMQ на удивление медленный

В настоящее время я выполняю тест задержки для некоторых коммуникационных промежуточных программ и обнаружил, что ZeroMQ REQ а также REP розетки на удивление медленные. Например, я ожидал, что ZeroMQ будет быстрее, чем ZeroC Ice. Для полноты вот результаты испытаний на данный момент:

  1. Ice 7600 сообщений в секунду
  2. ZeroMQ 4300 - 4500 сообщений в секунду

Сообщение является удаленным вызовом со структурой данных в качестве параметра. Структура данных содержит поля основных типов (int, float, double, boolean, string). Сначала я подозревал, что сериализация данных с использованием протокольных буферов может стать узким местом для ZeroMQ, но затем я протестировал с использованием пустых сообщений, и результаты довольно схожи. Ice быстрее, даже если ZeroMQ отправляет пустые сообщения.

Тем не менее я хочу дать ZeroMQ хороший шанс. В этом духе я хочу знать, смогу ли я улучшить скорость REQ а также REP в любом случае. Может мне стоит использовать другие розетки? Единственным ограничением является то, что связь должна быть RPC-подобной. Клиент не должен выполнять какую-либо работу, пока он ожидает результата своего сообщения.

Вот код моей реализации. Я предоставляю версию теста Java, но результаты довольно схожи для Python(немного медленнее) и C++ (немного быстрее):

клиент

...
MQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.REQ);
socket.connect("tcp://*:5555");

for(int i=0; i<measuredIterations; i++){
    t0 = System.nanoTime();
    socket.send("",0);
    socket.recv(0);
    rtt = System.nanoTime() - t0;
    ...
}

сервер

ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.REP);
socket.bind("tcp://*:5555");


while (!Thread.currentThread().isInterrupted()){
    socket.recv(0);
    socket.send("",0);
}

Остальная часть кода в основном для расчета средней задержки и количества сообщений в секунду.

Может быть, ZeroMQ просто медленен для этого шаблона коммуникации, и он превосходит многие из многих шаблонов коммуникации...

Примечание: я "прогрел" оба промежуточных программного обеспечения перед записью результатов. Тем не менее ZeroMQ всегда медленнее, чем Ice.

EDIT1: я увеличил количество итераций потепления до 10000. Новые результаты:

  1. Ice 8100 сообщений в секунду (сходится к 8250 с большим потеплением)
  2. Буфер протокола ZeroMQ + конвертируется в 4650 сообщений в секунду

0 ответов

Другие вопросы по тегам