NodeJS `net` модуль медленно ECONNREFUSED на Windows - PullRequest
2 голосов
/ 24 января 2020

Кажется, существует огромная разница в производительности между Linux и Windows при обработке ошибок на модуле net NodeJS. Я обрабатывал ошибку ECONNREFUSED на Windows, которая, казалось, была почти в 85 раз медленнее по сравнению с Linux.

. Взгляните на следующий файл с нуля:

const net = require("net");
console.time("Timing");
const connection = net.createConnection(9999, "localhost");

connection.on("error", err => {
    console.log(err);
    console.timeEnd("Timing");
});

Результат запуска этого файла на Windows 10 Pro 64bit:

Error: connect ECONNREFUSED 127.0.0.1:9999
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1126:14) {
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 9999
}
Timing: 2030.534ms

Обратите внимание, что время здесь 2030.534ms.

Результат выполнения этого скрипта на WSL

{ Error: connect ECONNREFUSED 127.0.0.1:9999
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1106:14)
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 9999 }
Timing: 24.748ms

Время здесь 24.748ms.

Почему этот разрыв в производительности такой большой? Кто-нибудь может уточнить, что происходит внутри при выполнении вышеуказанного скрипта и что может привести к разнице в производительности?


Edit Я проверил, какие версии Node у меня работают возможность сравнения двух: Windows: v12.11.1 WSL: v10.16.3

Я использую WSL2 на Windows 10.0.18363 N / Сборка 18363

Чтобы убедиться, что эта проблема возникает на одной и той же версии узла I, в обеих средах обновлен узел до v12.14.1. Windows был все еще намного медленнее, чем WSL. Вот результаты теста:

Windows:

Error: connect ECONNREFUSED 127.0.0.1:9999
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1134:16) {
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 9999
}
Timing: 2038.687ms

WSL:

Error: connect ECONNREFUSED 127.0.0.1:9999
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1134:16) {
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 9999
}
Timing: 18.661ms

1 Ответ

0 голосов
/ 26 января 2020

Лично я не вижу никакой разницы

WSL работает под управлением Ubuntu в ZSH

➜  networkPerf node app1.js
Error: connect ECONNREFUSED 127.0.0.1:9999
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1129:14) {
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 9999
}
Timing: 1072.149ms
➜  networkPerf node -v
v12.13.1

Windows cmd

StangerD@laptop c:\_stuff\code\playground\node\networkPerf
$ node app1.js
Error: connect ECONNREFUSED 127.0.0.1:9999
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1129:14) {
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 9999
}
Timing: 1057.658ms
StangerD@laptop c:\_stuff\code\playground\node\networkPerf
$ node -v
v12.13.1

Вещи я бы check

  • Версии узла одинаковы
  • Версии ваших зависимостей одинаковы
  • На порту 9999
* нет служб, работающих 1018 * Кроме того, какую версию wsl вы используете в wsl1 windows 10.0.17134 Build 17134 Также вы видите какие-либо различия при использовании ip 127.0.0.1 вместо этого, возможно, проблема с медленным разрешением имен?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...