Почему Websocket/ws подключает сокет к одному ядру? (узлы/кластер)

Я запускаю узел js и использую модуль кластера. В дочернем процессе я создаю сервер веб-сокетов, а при соединении с веб-сокетом я делаю console.log(process.pid) для каждого соединения с веб-сокетом. Я даже добавил цикл в рабочий поток, чтобы замедлить его, что, по-видимому, так и есть, но он по-прежнему назначает одно и то же ядро ​​​​каждому клиенту веб-сокета. Я написал сценарий bash для запуска моего html-файла, который открывает одновременные N соединений, чтобы проверить, нормально ли работает модуль кластера. Это проблема с модулем кластера или сервером веб-сокетов?

const os = require('os');
const cluster = require('cluster');

if (cluster.isMaster) {

    for (let i = 0; i < os.cpus().length; i++) {
        cluster.fork();
    }

} else {

    const server = require('http').createServer(app);
    const WebSocket = require('ws');
    let ws_clients = {};
    const wss = new WebSocket.Server({ server: server});    

    wss.on('connection', function connection(ws) {

      let h = 0;

      for (let i = 0; i < 2e10; i++) {
        h++;
      }

      console.log('handled by:', process.pid);

    });

}

person Momin Siddiqui    schedule 17.12.2020    source источник


Ответы (1)


Ваш цикл просто приостанавливает основной поток процесса, который уже принял соединение и в настоящее время обрабатывает его. Если я не ошибаюсь, запросы на подключение под капотом и по дизайну node.js обрабатываются отдельными потоками.

Если вы хотите проверить распределение нагрузки на вашем локальном компьютере, создайте 4 дочерних процесса и 4 других дочерних процесса, запрашивающих соединения. Затем, если вы проверите использование ядра, вы увидите, что все ваши ядра работают нормально, если у вас есть машина с 8 логическими ядрами (в Windows -> расширенный вид диспетчера задач -> процессор -> логические ядра). Вы увидите множество регистрируемых pid процессов.

person syd619    schedule 19.12.2020