Клиенты ZMQ - Сервер - Рабочая производительность
В настоящее время я разрабатываю систему с сервером, которая получает задачи некоторых клиентов и обрабатывает их.
Поскольку мне нужна высокая пропускная способность, я проверил скорость передачи данных в 1Гбитной сети.
Сценарий:
- Клиенты имеют сокет Dealer и отправляют задачу на сервер, сервер получает задачи через сокет Router (TCP-соединение)
- Сервер направляет задачи одному рабочему потоку (Дилер - Дилер через INPROC)
- Рабочий поток обрабатывает задачи и отправляет ответ обратно тем же способом
Для тестирования я использовал 16 клиентов на 16 машинах.
Контрольный параметр 1: (без рабочих сервер отправляет сообщение непосредственно клиентам) Результат:
- 1B-Сообщения: 143540,67 RT/s (RT = туда и обратно)
- 10B-Сообщения: 140160,72 RT / s
- 100B-Сообщения: 129634,43 RT / s
- 500B-Сообщения: 120977,5 RT / s
- 1024B-Сообщения: 107983,59 RT/ с
Тест 2: (с 10 рабочими, сервер просто выступает в качестве брокера)
- 1B-Сообщения: 92873,51 RT/s (RT = туда и обратно)
- 10B-Сообщения: 81619,33 RT / s
- 100B-Сообщения: 83606,02 RT / s
- 500B-Сообщения: 75229,45 RT / s
- 1024B-Сообщения: 63648,32 RT/s
Источники:
- http://pastebin.com/5JBD0DUH (контрольный ориентир 1)
- http://pastebin.com/3iq2Bxqc (контрольный ориентир 2)
Может кто-нибудь помочь мне определить, почему TP так сильно падает, просто добавив inproc-roundtrip с некоторым рабочим потоком? Я действительно ожидал более высокого TP с рабочими потоками. Производительность ZMQ Inproc не такая быстрая?
1 ответ
Вы не используете правильный шаблон для сокета ZMQ_ROUTER/ZMQ_DEALER.
Псевдокод
front = zmq_socket (context, ZMQ_ROUTER);
zmq_bind(front, "tcp://*:15555");
back = zmq_socket(context, ZMQ_DEALER);
zmq_bind (back, "inproc://abc");
// Here create thread
zmq_proxy(front, back, NULL); // zmq_proxy will not return
Псевдокод для потока
socket = zmq_socket(context, ZMQ_REP);
zmq_connect(socket, "inproc://abc");
do {
zmq_recv(...)
zmq_send(...)
} while (1);
Псевдокод для клиента
socket = zmq_socket(context, ZMQ_REQ);
zmq_connect(socket, "tcp://127.0.0.1:15555");
do {
zmq_send(...)
zmq_recv(...)
} while (1);