Утечка памяти на сервере Websocket: большие сообщения
У меня есть простой сервер websocket в nodejs, использующий npm ws (поведение то же самое с npm websocket). У меня есть ядро .NET, связывающееся напрямую с ws-сервером, который подает реагирующий интерфейс и отправляет сообщения 30–60 КБ на частоте до 50 Гц.
Мое приложение предназначено для возможности отслеживать несколько сообщений одновременно. Когда я добавляю подписку к этим сообщениям, использование памяти сервером узлов растет чрезвычайно быстро и согласуется с тем, сколько сообщений я добавляю (чем больше сообщений, тем быстрее оно растет). Но сервер веб-сокетов или объекты веб-сокетов, похоже, очень долго зависают в буферах сообщений.
Я могу увеличить объем используемой сервером памяти до нескольких ГБ, добавив более 5 сообщений и подождав всего несколько минут. Когда я прекращаю сообщения, использование памяти перестает расти, но остается, как будто wss хранит все в памяти. Я также попытался очистить доступное для записи состояние объектов ws (закомментировано), однако это вызывает ошибки на клиентских подключениях. Есть ли способ, которым я могу безопасно очистить эти буферы, чтобы сохранить память достаточно низкой? (Обратите внимание, что для информации с частотой 50 Гц в любом случае нецелесообразно поддерживать их в буфере очень долго, поскольку потоковая передача очень быстрая)
wss.on('connection', function connection(ws) {
clients.push(ws)
ws.on('message', function incoming(message) {
clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
try {
client.send(message)
}
finally {
// client._socket._writableState.bufferedRequest = null
// client._socket._writableState.lastBufferedRequest = null
}
}
})
});
ws.on('close', function close(data) {
console.log('disconnected');
console.log(data);
});
});