有的時候播間連接數(shù)達到300人的時候,socket連接就會一直pending...
最后就連接失敗~~不能進行數(shù)據(jù)接收。
請問這個問題處在哪里?應(yīng)該如何解決和避免?
服務(wù)器是centos的。我用php啟動的workerman進程,發(fā)現(xiàn)該php進程CPU占用97%到100%。
請問該如何優(yōu)化下?
這個是PHPSocket.IO,不是直接用的workerman。
cpu占用多少和業(yè)務(wù)模型以及代碼質(zhì)量有關(guān)系。
業(yè)務(wù)模型:比如300個人在線,每個人1秒向其它300人廣播消息,那么每秒就是300*300=9W/秒的消息量,cpu占用肯定會很高。
代碼質(zhì)量:還要檢查業(yè)務(wù)邏輯代碼是否有問題,比如死循環(huán)、瘋狂循環(huán)超大數(shù)組等導致cpu很高。
計算用戶訪問量
你需要計算下用戶訪問量,看看PHPPSocket.IO每秒接收消息 發(fā)送消息量有多少?是否可以在業(yè)務(wù)上優(yōu)化下減少消息量。300人在線導致cpu97%到100%確實有點夸張,不是業(yè)務(wù)模型有問題就是代碼質(zhì)量問題。
對比
http://www.wtbis.cn頁面底部 用戶在線數(shù)實時統(tǒng)計功能就是PHPSocket.IO做的,每秒廣播給所有在線用戶當前在線人數(shù)以及打開頁面數(shù),每天下午峰值也是300左右,但是因為業(yè)務(wù)模型簡單,能夠計算到消息量 300/每秒 左右,所以能看到服務(wù)器負載是0,cpu消耗幾乎也是0
建議
另外PHPSocket.IO是單進程的,內(nèi)部工作機制比較復雜,性能相比workerman或者GatewayWorker差很多,建議聊天服務(wù)用GatewayWorker去做,可以多進程多服務(wù)器部署,支持上萬人很輕松。
workerman 只是一個運行 app 的容器,你應(yīng)該在你的應(yīng)用里面設(shè)置記錄運行的調(diào)試代碼,不斷定位直到找到什么地方最耗時。
比如
$code_xxx_start = microtime(true);
file_put_contents('/tmp/app_run.log', 'code:xxx:start'.$code_xxx_start."\n", FILE_APPEND)
// codes
file_put_contents('/tmp/app_run.log', 'code:xxx:end'.microtime(true)-$code_xxx_start."\n", FILE_APPEND)
從你的應(yīng)用的入口代碼開始,一步一步不斷縮小范圍。
今天我把Workerman移動到windows服務(wù)器了,開始運行正常,但1個小時候在cmd中報了如下錯誤:
next called after client was closed - ignoring socket
next called after client was closed - ignoring socket
next called after client was closed - ignoring socket
next called after client was closed - ignoring socket
next called after client was closed - ignoring socket
next called after client was closed - ignoring socket
next called after client was closed - ignoring socket
next called after client was closed - ignoring socket
next called after client was closed - ignoring socket
next called after client was closed - ignoring socket
.......
這個錯誤非常多。
請問這是哪里的問題?