Клиенты 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

Источники:

Может кто-нибудь помочь мне определить, почему 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);
Другие вопросы по тегам