nodejs开发游戏服务器遇到的性能问题
問題描述: 使用nodejs開發了一個游戲服務器,為了盡可能提高服務器的性能,服務器采用多進程的架構,前面處理玩家socket連接的是多個nodejs進程,使用 child_process 模塊,服務器啟動時fork出來,而處理玩家游戲邏輯的是單獨一個nodejs進程(因為玩家之間需要交互,而且玩家都是有狀態的,所以無法分成多個進程)這個作為主進程;主進程與子進程之間使用使用child_process模塊內建的通訊方式進行通訊;
現在服務器性能出現瓶頸,服務器同時在線去到1500人左右,CPU占用率在40+左右,目標是3000人同時在線;通過CPU Profile分析,唯一無狀態的可分離出來而且比較占用CPU的,就是玩家數據讀數據庫和保存數據庫的時候,數據庫使用的是mongodb,所以現在想把讀寫數據庫的邏輯獨立到一個新的進程中;但是問題來了,由于玩家的數據是一個大的Json結構,最大的大小能達到600+K,而node的child_process模塊的內建進程間通訊是通過JSON.stringify和JSON.parse來轉換成字符串來進行通訊的,所
以獨立出來以后,性能的問題,又指向了child_process模塊中的進程之間的通訊的函數,通過實驗: JSON.strinify 一個600K+玩家的數據平均需要35ms,JSON.parse 一個600K+玩家的數據平均需要20ms,而且這兩個函數都是同步的,會造成阻塞;這也就是說主進程無法把一些包含大數據處理的任務分派到其他進程去做,這也直接限制了主進程的承載量和在線玩家人數;
嘗試找過一寫解決的方案: 1.異步版的 JSON.stringify 和 JSON.parse ,可惜沒有結果,正如這里的討論:https://github.com/joyent/node/issues/7543 2.為node加入多線程?nodejs有幾個多線程的庫,但是貌似都不支持共享進程內存,無法操作主進程的內存,只能通過字符串進行交換數據,也就是說輪回到以上進程間的通訊問題;
百牛信息技術bainiu.ltd整理發布于博客園
這個問題一直比較困擾,還沒有找到好的解決方法,希望大牛來賜教
轉載于:https://www.cnblogs.com/bainiu/p/7541440.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的nodejs开发游戏服务器遇到的性能问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈js数据类型识别方法
- 下一篇: 我们用4行代码节省了100万 记录与阿里