2016-07-06 105 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開發者控制檯網絡選項卡中讀取我不喜歡的數據包。使它更容易找出遊戲的工作方式,並可能找到作弊/漏洞利用..