我正在制作一个带有websockets和节点服务器的在线浏览器游戏,如果我有大约20-30个玩家,那么CPU通常在2%左右,RAM在10-15%。我只是使用便宜的数字海洋液滴来托管它。
然而,似乎每20-30分钟,服务器CPU使用率将在10秒内达到100%,然后最终崩溃。直到那一刻,CPU通常徘徊在2%左右,游戏运行非常顺利。
我无法告诉我生命中是什么触发了这一点,因为日志中没有错误,游戏中没有任何内容可以让我看到它。似乎是一个让服务器失效的随机事件。
还有一些较小的峰值,不会使服务器停机,但很快就会自行解决。这是一张图片:
我不认为我在任何地方阻止事件循环,而且我没有任何似乎长时间运行的执行路径。进出服务器的数据包通常是每用户每秒两个,所以根本没有使用多少带宽。并且服务器主要只是一个中继,除了验证之外几乎没有处理数据包,因此我不确定哪些代码路径可能如此密集。
我可以做些什么来分析这一点,并找出从何处开始研究导致这些峰值的原因?我想要想象一下我忘记的一些代码路径在负载下会出乎意料地慢,或者我错过了一个可以解决它的节点标志,但我不知道。< / p>
答案 0 :(得分:1)
我想我可能已经弄清楚了。
我在游戏中使用的主要是websockets而且我正在运行htop
并注意到如果有人发送大包(在很短的时间内执行大量操作),那么CPU会达到100%。我想知道为什么当我记得我使用binary-packer
来减少带宽使用时。
我尝试将解析器更改为JSON
,以便不压缩和打包数据包,无论数据包有多大,CPU使用率始终保持在2%。
所以我认为导致崩溃的原因是当一个玩家在很短的时间内发送大量数据时,服务器将不堪重负,必须将所有数据打包并及时发送出去。
这可能不是真正的答案,但至少需要修复一些问题。值得庆幸的是,游戏使用的带宽非常少,带宽不是瓶颈所以我可能只是把它留作JSON。
唯一的问题是,使用JSON编码,用户可以在Chrome开发者控制台网络标签中读取我不喜欢的数据包。让您更容易了解游戏的运作方式并可能找到作弊/漏洞..