ZeroMQ на удивление медленный
В настоящее время я выполняю тест задержки для некоторых коммуникационных промежуточных программ и обнаружил, что ZeroMQ REQ
а также REP
розетки на удивление медленные. Например, я ожидал, что ZeroMQ будет быстрее, чем ZeroC Ice. Для полноты вот результаты испытаний на данный момент:
- Ice 7600 сообщений в секунду
- 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. Новые результаты:
- Ice 8100 сообщений в секунду (сходится к 8250 с большим потеплением)
- Буфер протокола ZeroMQ + конвертируется в 4650 сообщений в секунду