Соединения WebSocket остаются установленными после завершения?Javascript

Форум по Javascript
Ответить
Anonymous
 Соединения WebSocket остаются установленными после завершения?

Сообщение Anonymous »

Я создал сервер веб-сокетов с использованием модуля ws, и он, кажется, работает хорошо, за исключением того, что я только что заметил, что количество «Активных дескрипторов» немного превышает вдвое больше моих фактических активных подключений.
Поэтому я проверил открытые сокеты на сервере:

Код: Выделить всё

lsof -p 
 > lsof.log
Я пропущу совместное использование IP-адресов, но он сообщил о том же количестве УСТАНОВЛЕННЫХ tcp-сокетов, что и активные дескрипторы.
Я сделал это была проведена некоторая обработка и установлено, что около 2/3 соединений происходят с повторяющихся адресов

Код: Выделить всё

cat lsof.log | grep -oP ':3000->\S+:' | grep -oP '[0-9A-z\-.]+:$' | sort
Определенно существуют определенные проблемы с подключением, поскольку клиенты находятся в разных местах, поэтому серверу приходится время от времени разрывать соединения, чтобы сохранять точные отчеты о состоянии клиентов. Это делается с помощью базового цикла пульса:

Код: Выделить всё

function heartbeat() {
this.isAlive = true;
}

var noop = function () {};
var interval = setInterval(function () {
server.clients.forEach(function (conn) {
if (conn.isAlive === false) {
conn.emit("close");
return conn.terminate();
}

conn.isAlive = false;
conn.ping(noop);
});
}, options.pingInterval);

server.on('connection', function onOpen(conn, req) {

...

conn.isAlive = true;
conn.on('pong', heartbeat);
});

Чтобы получить больше информации о проблеме, я решил, что мне нужно выяснить, когда в последний раз данные передавались через сокеты, к счастью, ss может сделать именно это.

Код: Выделить всё

ss -ti > ss.log
Посмотрев на значения lastrcv, я обнаружил, что некоторые из этих сокетов «бездействуют» примерно в то же время, когда был создан процесс — примерно 30 дней, но их состояние все еще УСТАНОВЛЕНО. Мне это кажется странным, и я подозреваю, что что-то происходит, когда сервер завершает сокет, он удаляется из списка клиентов в моем приложении, но фактический сокет в операционной системе остается открытым.
Есть ли у кого-нибудь информация по этому поводу?

Подробнее здесь: https://stackoverflow.com/questions/793 ... erminating
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»