Какова ожидаемая производительность ZeroMQ?

Я занимаюсь коммуникацией процесса с процессом; цель состоит в том, чтобы рабочие процессы выполняли некоторые вычисления и передавали результат в управляющий процесс. Я установил zeromq.node и установил простой запросчик и ответчик в coffeescript.

запросчик:

# requester.coffee

zmq                       = require 'zmq'
context                   = new zmq.Context()
socket                    = zmq.socket 'req'

socket.bind 'tcp://127.0.0.1:5555', ( error ) =>
  throw error if error?
  console.log 'Requesting writer bound to port 5555'
  setInterval ( -> socket.send 'helo world' ), 1


response_count  = 0
t0              = new Date() / 1000

socket.on 'message', ( message ) ->
  response_count += 1
  # x = message.toString 'utf-8'
  if response_count % 1000 is 0
    t1              = new Date() / 1000
    console.log "received #{ parseInt response_count / ( t1 - t0 ) + 0.5 } messages per second"
    response_count  = 0
    t0 = new Date() / 1000

Ответчик:

# responder.coffee

zmq                       = require 'zmq'
context                   = new zmq.Context()
socket                    = zmq.socket 'rep'

socket.connect 'tcp://127.0.0.1:5555'
console.log 'Responder bound to port 5555'
process.stdin.resume()

request_count   = 0
t0              = new Date() / 1000

socket.on 'message', ( message ) ->
  request_count += 1
  # message = message.toString 'utf-8'
  # console.log message
  socket.send 'helo back'
  if request_count % 1000 is 0
    t1              = new Date() / 1000
    console.log "received #{ parseInt request_count / ( t1 - t0 ) + 0.5 } messages per second"
    request_count  = 0
    t0 = new Date() / 1000

Теперь, когда я запускаю их в отдельных терминальных окнах на моем компьютере ubuntu (11.10, 8GB, Intel Duo Core 3GHz, NodeJS 0.8.6), я получаю следующий вывод:

received 135 messages per second
received 6369 messages per second
received 6849 messages per second
received 6944 messages per second
received 7042 messages per second
received 7143 messages per second
received 5952 messages per second
received 2967 messages per second
received 914 messages per second
received 912 messages per second
received 928 messages per second
received 919 messages per second
received 947 messages per second
received 906 messages per second
received 918 messages per second
received 929 messages per second
received 916 messages per second
received 917 messages per second
received 916 messages per second
received 928 messages per second

который (1) немного похож на некоторое насыщение в канале передачи через несколько секунд; (2) чувствует себя недостаточно быстро. в соответствии с этот контрольный показатель, я должен быть в сотнях тысяч - не тысячи - сообщений в секундах, который подкрепляется это обсуждение ( "ZeroMQ: для получения 10 000 сообщений требуется около 15 миллисекунд" ).

Я также попытался использовать ответчика, написанного на python 3, и получил точные номера. что еще, я написал альтернативную пару скриптов, где мастер-процесс будет порождать дочерний процесс и связываться с ним по stdout/stdin; Я получил около 750 сообщений в секунду (я не видел большой дисперсии, когда я увеличил длину сообщения), который находится в том же самом шаге, что и эксперимент zeromq.

Ожидаются ли эти цифры? Какой здесь ограничивающий фактор?

Ответ 1

Я думаю, что происходит две вещи. Во-первых, у вас есть setInterval ( -> socket.send 'helo world' ), 1. Это отправляет запрос каждые миллисекунды, поэтому вы будете ограничены 1000 запросами в секунду.

Кроме того, модель запроса/ответа является синхронной. Запрос входит в сокет и блокируется до тех пор, пока не будет дан ответ. С ответом следующий запрос обрабатывается и блокируется.

Я изменил запросчик script от socket = zmq.socket 'req' до socket = zmq.socket 'push' и setInterval ( -> socket.send 'helo world' ), 0 до socket.send 'helo world' while true. Затем я изменил ответчик script socket = zmq.socket 'rep' на socket = zmq.socket 'pull' и получил этот вывод

$ coffee responder.coffee
Responder bound to port 5555
received 282 messages per second
received 333357 messages per second
received 249988 messages per second
received 333331 messages per second
received 250003 messages per second
received 333331 messages per second
received 333331 messages per second
received 333331 messages per second
...

Заявитель не получил выход, потому что он блокировал цикл while, но демонстрирует, что ØMQ может получить гораздо лучшую производительность.