2016-07-06 71 views
2

我正在制作一个带有websockets和节点服务器的在线浏览器游戏,如果我有大约20-30个玩家,CPU通常为2%左右,RAM为10-15%。我只是使用廉价的数字海洋液滴来承载它。节点服务器随机尖峰到100%,然后崩溃。如何诊断?

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

我不知道什么触发了我的生活,因为日志中没有错误,游戏中没有任何东西可以导致它。只是似乎是一个随机事件,导致服务器失效。

也有一些较小的尖峰,以及不会使服务器停机,但很快就会自行解决。以下是图像:

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

我不认为我在任何地方阻塞事件循环,我没有,似乎是长时间运行的任何执行路径。往返于服务器的数据包通常每个用户每秒两个,所以根本没有太多的带宽。而且服务器主要只是一个中继,除了验证之外几乎没有数据包处理,所以我不确定哪个代码路径会如此密集。

我该如何处理这个问题并找出从哪里开始调查造成这些尖峰的原因?我想象一下我忘记了一些代码路径,这在负载下令人惊讶地很慢,或者我错过了可以解决它的节点标志,但我不知道。

+0

你检查了这个http://techblog.netflix.com/2014/11/nodejs-in-flames.html?或者这个http://stackoverflow.com/questions/13375735/node-js-cpu-100/13376256#13376256?你能够通过顶层或类似的东西确认负载来自节点进程吗? –

+0

@ mh-cbon:顶部证实它全部来自节点应用程序 –

+0

你有没有考虑去看看newrelic?也可以帮助。 –

回答

1

我想我可能已经想通了。

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

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

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

这可能不是实际的答案,但它至少是需要解决的问题。幸运的是,游戏使用的带宽非常小,带宽不是瓶颈,所以我可以把它留作JSON。

唯一的问题是,使用JSON编码,用户可以在Chrome开发者控制台网络选项卡中读取我不喜欢的数据包。使它更容易找出游戏的工作方式,并可能找到作弊/漏洞利用..