2015-02-14 3 views
-1

У меня есть TCP-сервер в Node.JS. Когда я получаю более 1000 пакетов в секунду, внезапно все задерживается.Сервер TCP в реальном времени в Node.JS

Не просто короткая задержка, но и задержка 3-4 секунды. Что очень плохо для моего сервера в реальном времени.

Итак, почему это происходит? Я использовал process.nextTick при приеме и отправке пакетов, но у меня все еще есть проблема.

Возможная проблема дизайна:

Это пытается транслировать пакеты для всех соответствующих игроков в этой области. Может быть, цикл забивает обработку?

 // TO BE REFACTORED 
     var listOffset = packet.readUInt16LE(6); // the users to broadcast to 
     var listSize = packet.readUInt8(listOffset); 
     var payload = packet.slice(10, listOffset); 
     // broadcast 
     while (listSize--) { 
      var userNo = packet.readUInt16LE(listOffset + 1 + (listSize * 2)); 
      var client = Server.getConnection(userNo); 
      if (client) client.send(payload); 
     } 

Соответствующие функции:

getConnection is this._connections[id] 
client.send is this._socket.write(data) 
+0

Если для обработки одного пакета требуется более 1 мс, то ваш сервер не может не отставать от 1000 пакетов в секунду. Это может быть проблема? – jfriend00

+0

@ jfriend00 возможно, учитывая, что node.js не предназначен для вычислений, пакеты дешифруются или зашифрованы (собственный аддон) по прибытии или выходу, выполняется несколько контрольных сумм. Еще несколько проверок на пакет, которые могут суммироваться до 1 мс или более. Поэтому я думаю, что 'node.js' не может справиться с этим видом использования? – majidarif

+0

Слишком рано говорить, что это проблема, характерная для node.js. Это полностью зависит от вашего кода и того, что вы делаете с этими пакетами. Вы не включили какой-либо соответствующий код, поэтому мы не можем комментировать это. Если бы мне было поручено создать максимально возможный пакетный маршрутизатор, и скорость/масштабируемость были конечной целью, я бы, вероятно, построил его на C/C++, возможно, с некоторыми разделами кода даже в сборке вручную, поэтому вам нужно выбрать инструмент, который подходит для работы. С другой стороны, вполне возможно, что то, что делает ваш код, может быть улучшено в node.js. – jfriend00

ответ

0

Для того, чтобы увидеть, заблокирован ли цикл событий или что-то еще происходит (например, сбор мусора, или я не знаю, что), вы можете измерить время цикла события. Просто запустите setImmediate() время от времени и измерьте время, необходимое для выполнения обратного вызова с помощью process.hrtime(). Если цикл событий заблокирован в течение длительного времени, вы увидите, что он подходит с помощью этого метода. Если вы видите время цикла ниже 10 мс, цикл не является проблемой, и вам нужно искать что-то еще.

Смежные вопросы