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