生產(chǎn)環(huán)境是2臺16核32G的配置,按照手冊分布式部署,配置gateway進(jìn)程16個(gè),和worker進(jìn)程數(shù)100個(gè),
使用壓力測試系統(tǒng)并發(fā)2000個(gè)鏈接,只鏈接,不發(fā)送業(yè)務(wù)處理。在壓力測試下,gateway進(jìn)程cpu個(gè)別跑滿,其他的也大都在70%,壓力測試關(guān)掉后很長一段時(shí)間,有一個(gè)gateway進(jìn)程cpu始終100%,其他gateway進(jìn)程cpu基本回落到0,該狀態(tài)下,業(yè)務(wù)系統(tǒng)可以正常鏈接上gateway,但是發(fā)送數(shù)據(jù)無法被接收到。該狀態(tài)一直持續(xù)很長時(shí)間。我們之所以做這個(gè)壓力測試,是為了復(fù)現(xiàn)我們業(yè)務(wù)異常并發(fā)下,也同樣導(dǎo)致了gateway的某個(gè)進(jìn)程cpu跑滿,而其他進(jìn)程都很空閑,不知道是什么原因,而業(yè)務(wù)系統(tǒng)處于無法收發(fā)的狀態(tài)下。gateway框架也沒有任何異常報(bào)錯(cuò),服務(wù)器整體cpu還低于20%。
Workerman version:3.4.7 PHP version:7.1.8-2+ubuntu16.04.1+deb.sury.org+4
start time:2024-02-29 16:14:16 run 0 days 1 hours
load average: 0.38, 0, 0 event-loop:\Workerman\Events\Event
GatewayWorker系統(tǒng)內(nèi)部有個(gè)緩沖區(qū),如果businessWorker進(jìn)程處理不過來客戶端發(fā)來的請求,請求會放在緩沖區(qū)排隊(duì),壓測過程中這個(gè)排隊(duì)可能越來越多,即使停止壓測后,緩沖區(qū)里的請求數(shù)據(jù)仍然存在,所以進(jìn)程還在一直工作。
這個(gè)緩沖區(qū)可以設(shè)置大小,默認(rèn)10M,start_gateway.php里設(shè)置
$gateway->sendToWorkerBufferSize = 10240; // 字節(jié)
這樣超過緩沖區(qū)的數(shù)據(jù)會被丟棄,壓測停止后緩沖區(qū)的請求由于數(shù)量變少會馬上處理完,cpu就恢復(fù)了