NodeJS socket.io не может обработать скорость прибытия в тесте производительности

При тестировании производительности моего приложения socket.js socket.io кажется, что оно не может обработать желаемое количество одновременных запросов websocket.

Я тестирую приложение в среде Docker со следующими спецификациями:

Процессоры: 2 RAM: 4 ГБ

Приложение урезано до минимума, которое принимает только подключения к веб-сокетам с помощью socket.io + express.js.

Я выполняю тесты с помощью artillery.io, сценарий тестирования:

config:
  target: "http://127.0.0.1:5000"
  phases:
    - duration: 100
      arrivalRate: 20
scenarios:
    - engine: "socketio"
      flow:
      - emit:
          channel: "echo"
          data: "hello"        
      - think: 50

Доклад:

Summary report @ 16:54:31(+0200) 2018-07-30
  Scenarios launched:  2000
  Scenarios completed: 101
  Requests completed:  560
  RPS sent: 6.4
  Request latency:
    min: 0.1
    max: 3
    median: 0.2
    p95: 0.5
    p99: 1.4
    Scenario counts:
    0: 2000 (100%)
  Codes:
    0: 560
  Errors:
    Error: xhr poll error: 1070
    timeout: 829

Поэтому я получаю много ошибок в опросе xhr. Пока я наблюдаю за статистикой CPU + mem, самое высокое значение для CPU составляет всего 43,25%. Память будет только до 4%.

Даже когда я изменяю свой тест на частоту прибытия 20 в течение 100 секунд, я все равно получаю ошибки опроса XHR.

Значит, эти тестовые числа выходят за рамки возможностей nodejs + socket.io с этими спецификациями или что-то еще работает не так, как ожидалось? Возможно, среда докера или программное обеспечение Artillery?

любая помощь или предложения будут оценены!

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

Обновление 1

После еще нескольких тестирований с помощью сценария стресс-тестирования websocket, найденного здесь: https://gist.github.com/redism/11283852 Кажется, что я достиг своего рода предела, когда я использую показатель прибыльности выше 50 или хочу установить больше соединений, чем +/- 1900.

До 1900 соединений почти каждое соединение устанавливается, но после этого числа ошибка опроса XHR растет экспоненциально.

Все еще нет высоких значений ЦП или памяти для док-контейнеров.

Ошибка опроса XHR в деталях:

Error: xhr poll error
at XHR.Transport.onError (D:\xxx\xxx\api\node_modules\engine.io-client\lib\transport.js:64:13)
at Request.<anonymous> (D:\xxx\xxx\api\node_modules\engine.io-client\lib\transports\polling-xhr.js:128:10)
at Request.Emitter.emit (D:\xxx\xxx\api\node_modules\component-emitter\index.js:133:20)
at Request.onError (D:\xxx\xxx\api\node_modules\engine.io-client\lib\transports\polling-xhr.js:309:8)
at Timeout._onTimeout (D:\xxx\xxx\api\node_modules\engine.io-client\lib\transports\polling-xhr.js:256:18)
at ontimeout (timers.js:475:11)
at tryOnTimeout (timers.js:310:5)
at Timer.listOnTimeout (timers.js:270:5) type: 'TransportError', description: 503 

Обновление 2

Изменение транспорта на "websocket" в артиллерийском испытании дает лучшую производительность.

Прецедент:

config:
  target: "http://127.0.0.1:5000"
  socketio:
    transports: ["websocket"]
  phases:
    - duration: 20
      arrivalRate: 200
scenarios:
    - engine: "socketio"
      flow:
      - emit:
          channel: "echo"
          data: "hello"        
      - think: 50

Результаты: норма прибытия больше не проблема, но я достиг некоторого предела в 2020 соединениях. После этого выдает "Ошибка Websocket".

Так ли это ограничение для Windows 10, и вы можете изменить его? Является ли это пределом причины, по которой тесты с длительным опросом работают так плохо?

0 ответов

Другие вопросы по тегам