Утечка памяти на сервере 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);
  });

});

0 ответов

Другие вопросы по тегам