我在Node.JS中有一个TCP服务器。当我每秒钟超过1000个数据包时,一切都会延迟。
不仅是一个短暂的延迟,而是一个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 :(得分:0)
为了查看事件循环是否被阻止或其他事情正在发生(例如垃圾收集或我不知道是什么),您可以测量事件循环时间。只需立即启动setImmediate(),然后使用process.hrtime()测量执行回调所需的时间。如果事件循环被长时间阻止,您将看到它使用此方法。 如果您发现循环时间低于10毫秒,则循环不是问题,您需要搜索其他内容。