Утечка памяти на сервере Websocket: большие сообщения - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть простой сервер 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);
  });

});
...