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, и вы можете изменить его? Является ли это пределом причины, по которой тесты с длительным опросом работают так плохо?