Как остановить чрезвычайно высокую задержку / пинг в сокете.ввод-вывод при перегрузке сервера?

#javascript #node.js #performance #websocket #socket.io

Вопрос:

Я делаю небольшую веб-игру с сокетом javascript.клиент ввода-вывода и node.js розетка.сервер ввода-вывода, и я обнаружил, что всякий раз, когда цикл основного сервера (вызывается 30 раз в секунду) не завершается до следующего вызова, сокет.задержка ввода-вывода начинает быстро увеличиваться.

как был вызван цикл сервера:

 constructor(){
    setInterval(this.update.bind(this), 1000 / 30));
}
update(){
//server loop code (processing collisions, sending update packets to clients, etc.)
}
 

Это прекрасно работало, когда сервер работал хорошо, но когда сервер не завершается до следующего вызова, задержка/пинг клиента начинает увеличиваться до неиграемых величин (20 000-50 000 мс). Я предполагаю, что это гнездо.У ввода — вывода недостаточно времени для фактической отправки пакетов, и он ждет времени для этого, которое иногда может быть на 20-50 секунд позже. Есть ли способ позволить сокету.io заканчивает делать все, что он делает, каждое обновление перед вызовом следующего? Я был бы в порядке, если бы сервер работал медленнее, пока задержка не превышает пятизначных цифр.

Другими словами, есть ли способ разрешить все сокеты.процессы ввода-вывода завершаются в определенное время, независимо от того, сколько времени это займет?

Если это имеет значение, на серверах есть 512 МБ оперативной памяти и 1vCPU. Когда я смотрю на использование ресурсов сервера, загрузка ЦП обычно составляет около 99%, а оперативная память обычно составляет стабильные 25%. Я измеряю задержку, делая:

 socket.on("pong", function (ms) {
    console.log(ms); //prints latency
});
 

Комментарии:

1. Я не могу понять, как вам удалось ограничить сокет. возможности ввода-вывода и ограничивают продолжительность операций, потому что это не похоже на распространенную проблему с socket.io, но скорее с вашей довольно необычной реализацией. Вы отправляете уведомления 30 раз в секунду? Зачем тебе это нужно? Что содержат эти уведомления? Скольким клиентам вы отправляете эти уведомления?

2. @KamilJanowski, это многопользовательская веб-игра, и обновления содержат такие данные, как положение других игроков. пакеты обновлений отправляются только через каждое второе обновление (15/с), но основной цикл обновления выполняется 30 раз в секунду, чтобы улучшить качество таких вещей, как конфликты. Эти обновления отправляются всем игрокам.

3. Но тогда, если никто не двигается, вы все равно отправляете довольно большое количество данных, а это может быть очень дорого. С такой скоростью, если у вас 10 игроков, у вас начнутся проблемы с достаточно частой отправкой этих обновлений, не говоря уже о передаче большего количества игроков. Удалите периодические обновления. Отправляйте обновления другим пользователям, обновляющим свои данные (совершающим движение). Это будет намного полезнее для вашего сервера и, скорее всего, решит вашу проблему. Периодическая отправка данных через сокет ничем не отличается от периодического опроса клиентов… это просто дороже, так как сокеты должны быть постоянно открыты

4. @KamilJanowski это не имело бы значения, игроки большую часть времени двигаются, и вокруг всегда будут лететь пули. даже если это работает так, почему задержка становится такой высокой из всех вещей?