有的時(shí)候播間連接數(shù)達(dá)到300人的時(shí)候,socket連接就會(huì)一直pending...
最后就連接失敗~~不能進(jìn)行數(shù)據(jù)接收。
請(qǐng)問這個(gè)問題處在哪里?應(yīng)該如何解決和避免?
服務(wù)器是centos的。我用php啟動(dòng)的workerman進(jìn)程,發(fā)現(xiàn)該php進(jìn)程CPU占用97%到100%。
請(qǐng)問該如何優(yōu)化下?
這個(gè)是PHPSocket.IO,不是直接用的workerman。
cpu占用多少和業(yè)務(wù)模型以及代碼質(zhì)量有關(guān)系。
業(yè)務(wù)模型:比如300個(gè)人在線,每個(gè)人1秒向其它300人廣播消息,那么每秒就是300*300=9W/秒的消息量,cpu占用肯定會(huì)很高。
代碼質(zhì)量:還要檢查業(yè)務(wù)邏輯代碼是否有問題,比如死循環(huán)、瘋狂循環(huán)超大數(shù)組等導(dǎo)致cpu很高。
計(jì)算用戶訪問量
你需要計(jì)算下用戶訪問量,看看PHPPSocket.IO每秒接收消息 發(fā)送消息量有多少?是否可以在業(yè)務(wù)上優(yōu)化下減少消息量。300人在線導(dǎo)致cpu97%到100%確實(shí)有點(diǎn)夸張,不是業(yè)務(wù)模型有問題就是代碼質(zhì)量問題。
對(duì)比
http://m.wtbis.cn頁面底部 用戶在線數(shù)實(shí)時(shí)統(tǒng)計(jì)功能就是PHPSocket.IO做的,每秒廣播給所有在線用戶當(dāng)前在線人數(shù)以及打開頁面數(shù),每天下午峰值也是300左右,但是因?yàn)闃I(yè)務(wù)模型簡單,能夠計(jì)算到消息量 300/每秒 左右,所以能看到服務(wù)器負(fù)載是0,cpu消耗幾乎也是0
建議
另外PHPSocket.IO是單進(jìn)程的,內(nèi)部工作機(jī)制比較復(fù)雜,性能相比workerman或者GatewayWorker差很多,建議聊天服務(wù)用GatewayWorker去做,可以多進(jìn)程多服務(wù)器部署,支持上萬人很輕松。
我的網(wǎng)站類似于即時(shí)留言板,用戶提問后不在前臺(tái)顯示,后臺(tái)管理員回復(fù)后,自動(dòng)在前臺(tái)顯示信息。這個(gè)功能用GatewayWorker合適嗎?
workerman 只是一個(gè)運(yùn)行 app 的容器,你應(yīng)該在你的應(yīng)用里面設(shè)置記錄運(yùn)行的調(diào)試代碼,不斷定位直到找到什么地方最耗時(shí)。
比如
$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移動(dòng)到windows服務(wù)器了,開始運(yùn)行正常,但1個(gè)小時(shí)候在cmd中報(bào)了如下錯(cuò)誤:
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
.......
這個(gè)錯(cuò)誤非常多。
請(qǐng)問這是哪里的問題?