3臺(tái)(4cpu 8核)webman redis_consumer消費(fèi)
3臺(tái)(4cpu 8核)gateway負(fù)載均衡
3臺(tái)(4cpu 8核)businessworker redis_queue生產(chǎn)
3臺(tái)(6核 32G) jmeter每臺(tái)3000線程壓測(cè)
一直有如下問(wèn)題:
65280 導(dǎo)致這個(gè)退出碼的原因是業(yè)務(wù)代碼有致命錯(cuò)誤,例如調(diào)用了不存在的函數(shù)、語(yǔ)法錯(cuò)誤等。
編輯 workerman/Worker.php 里 checkError()方法,找到
$errors = error_get_last();
改成
$errors = error_get_last();
var_dump($errors);
看下具體是什么錯(cuò)誤。
沒(méi)有錯(cuò)誤,結(jié)果都是null。
有個(gè)現(xiàn)象是壓力一起動(dòng),剛開(kāi)始還好,所有日志(自己在業(yè)務(wù)邏輯中記錄的)都有打印,隔幾秒之后就不行了,好像程序跟阻塞了一樣,手機(jī)操作業(yè)務(wù)就沒(méi)反應(yīng)了,是不是業(yè)務(wù)機(jī)還不夠?
業(yè)務(wù)鏈路是:登錄(webman)->鏈接websocket(gateway)->模擬websocket發(fā)送數(shù)據(jù)請(qǐng)求(gateway),數(shù)據(jù)進(jìn)入redis_queue->業(yè)務(wù)接到(從redis_queue中取出)后處理(webman)->返回結(jié)果放回redis_queue(webman)->gateway從redis_queue取出廣播出去。
場(chǎng)景:模擬登錄,鏈接websocket,然后進(jìn)入直播間
可能哪里出現(xiàn)瓶頸了,沒(méi)有現(xiàn)場(chǎng)沒(méi)有辦法給你定位。每臺(tái)服務(wù)器php start. status
執(zhí)行下看下event-loop是不是\Workerman\Events\Event
。還有需要按照手冊(cè)優(yōu)化下每臺(tái)服務(wù)器的linux內(nèi)核 http://m.wtbis.cn/doc/workerman/appendices/kernel-optimization.html
優(yōu)化過(guò)代碼后未再出現(xiàn)。
還有兩個(gè)疑問(wèn):
1、怎樣能確認(rèn)內(nèi)核是優(yōu)化過(guò)的,模擬超過(guò)1000鏈接么?(a、配置確定改了b、event模塊確定已安裝)
2、自定義的進(jìn)程(process.php中的),一般開(kāi)幾個(gè)進(jìn)程好
命令 sysctl -a
會(huì)顯示生效的內(nèi)核參數(shù)
進(jìn)程數(shù)看業(yè)務(wù)類(lèi)型,如果沒(méi)有網(wǎng)絡(luò)調(diào)用(curl、數(shù)據(jù)庫(kù)、redis等)就開(kāi)成和cpu核數(shù)一樣,有的話就開(kāi)cpu核數(shù)的2-3倍。