2013-05-23 4 views
1

В настоящее время я разрабатываю систему с сервером, которая выполняет задачи некоторых клиентов и обрабатывает их.Клиенты ZMQ - Сервер - Производительность рабочего стола

Поскольку мне нужна высокая пропускная способность, я изучил скорость для круговых переходов в сети 1 Гбит.

Сценарий:

  • Клиенты имеют сокет дилера и отправить задание на сервер, сервер получает задания с сокетом Router (TCP-соединения)
  • Сервер fowards Задачи для один работник-нить (дилер - дилер с помощью InProc)
  • рабочий поток обрабатывает задания и отправляет ответ обратно по тому же пути

Я использовал 16 клиентов на 16 машинах для теста.

Тест 1: (без рабочих, сервер посылает сообщение непосредственно обратно к клиентам) Результат:

  • 1B-сообщений: 143540,67 RT/с (RT =
  • в обе стороны)
  • 10B : 140160,72-сообщения RT/сек
  • 100B-сообщения: 129634,43 RT/сек
  • 500B-сообщения: 120977,5 RT/сек
  • -1024b валики сообщения: 107983,59 RT/с

Тест 2: (с 10 work0ers, сервер просто выступает в качестве брокера)

  • 1B-сообщений: 92873,51 RT/с (RT =
  • в обе стороны)
  • 10b-сообщения : 81619,33 RT/сек
  • 100B-сообщения: 83606,02 RT/сек
  • 500B-сообщений: 75229,45 RT/сек
  • -1024b валиков сообщений: 63648,32 RT/с

Источники:

Может кто-то помочь мне определить, почему TP идет вниз, что много с просто добавить inproc-roundtrip с некоторой рабочей нитью? Я действительно ожидал повышения TP с рабочими потоками. Является ли производительность ZMQ Inproc не такой быстрой?

ответ

0

Вы не используете правильный шаблон для гнезда 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);