Я создал сервер веб-сокетов с использованием модуля ws, и он, кажется, работает хорошо, за исключением того, что я только что заметил, что количество «Активных дескрипторов» немного превышает вдвое больше моих фактических активных подключений.
Поэтому я проверил открытые сокеты на сервере:
Я пропущу совместное использование 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 может сделать именно это.
Посмотрев на значения lastrcv, я обнаружил, что некоторые из этих сокетов «бездействуют» примерно в то же время, когда был создан процесс — примерно 30 дней, но их состояние все еще УСТАНОВЛЕНО. Мне это кажется странным, и я подозреваю, что что-то происходит, когда сервер завершает сокет, он удаляется из списка клиентов в моем приложении, но фактический сокет в операционной системе остается открытым.
Есть ли у кого-нибудь информация по этому поводу?
Подробнее здесь:
https://stackoverflow.com/questions/793 ... erminating