节点服务器随机尖峰到100%,然后崩溃。 如何诊断?

我正在做一个带有websockets和一个节点服务器的在线浏览器游戏,如果我有大约20-30个玩家,CPU通常在2%左右,内存在10-15%。 我只是使用一个便宜的数字海洋液滴托pipe它。

但是,似乎每20-30分钟,服务器CPU使用率将在10秒内达到100%,然后最终崩溃。 直到那一刻,CPU通常徘徊在2%左右,游戏运行非常顺利。

我不能告诉我的生活是什么触发这个,因为没有在日志中的错误,在游戏中我没有看到任何东西导致它。 只是似乎是一个随机事件,导致服务器失效。

也有一些较小的尖峰,不要把服务器closures,但很快就会解决自己。 这是一个图像:

http://i.imgur.com/EH3o8ue.png

我不认为我在任何地方阻止事件循环,而且我也没有任何似乎长时间运行的执行path。 往返于服务器的数据包通常每个用户每秒两个,所以根本没有太多的带宽。 而且服务器大部分只是一个中继,除了validation以外几乎没有数据包的处理,所以我不确定代码path可能如此密集。

我能做些什么来分析这个问题,并找出从哪里开始调查引起这些峰值的原因? 我想象一下,我忘记了一些代码path,在负载下令人惊讶的缓慢,也许我错过了一个节点标志,可以解决它,但我不知道。

我想我可能已经知道了。

我主要使用websockets来进行游戏,而且我正在运行htop并且注意到如果有人发送大包(在短时间内执行大量的操作),那么CPU会达到100%。 我想知道为什么当我记住我正在使用binary-packer来减less带宽使用。

我尝试将parsing器更改为JSON ,以便不压缩和打包数据包,而不pipe数据包有多大,CPU使用率始终保持在2%。

所以我认为造成这次事故的原因是当一个玩家在很短的时间内发送了大量的数据,服务器将不得不打包所有的数据并及时发送。

这可能不是真正的答案,但至less是需要修正的东西。 谢天谢地,游戏使用的带宽非常小,带宽不是瓶颈,所以我可以把它留作JSON。

唯一的问题是,使用JSON编码,用户可以在Chrome开发者控制台networking选项卡中读取我不喜欢的数据包。使其更容易了解游戏的工作方式,并可能find作弊/漏洞攻击。