做壓力測試時,分配的內(nèi)存是 2.5G,在 1 萬個 websocket 連接的情況下,我用 base64 方式廣播了一個圖片(數(shù)據(jù)包大小大概是 300K)。每次廣播都會引起一個 Gateway 進(jìn)程的意外終止,多次試驗(yàn)后,出現(xiàn)了 65280、11、9 等終止?fàn)顟B(tài)碼,65280 貌似是爆內(nèi)存的意思,另兩個是什么意思?
另外,需要的內(nèi)存量是不是大約是 連接數(shù) 乘以 數(shù)據(jù)包大?。?/p>
下面是廣播前的狀態(tài)
---------------------------------------GLOBAL STATUS--------------------------------------------
Workerman version:3.4.5 PHP version:5.6.30
start time:2017-10-12 11:36:01 run 0 days 0 hours
load average: 1.01, 2, 1 event-loop:\Workerman\Events\Event
3 workers 9 processes
worker_name exit_status exit_count
YourAppBusinessWorker 0 0
YourAppGateway 0 0
Register 0 0
---------------------------------------PROCESS STATUS-------------------------------------------
pid memory listening worker_name connections total_request send_fail throw_exception
28540 2M none YourAppBusinessWorker 5 2535 0 0
28539 2M none YourAppBusinessWorker 5 2578 0 0
28538 2M none YourAppBusinessWorker 5 2433 0 0
28542 7.25M websocket://0.0.0.0:8282 YourAppGateway 863 10006 0 0
28546 1.25M text://0.0.0.0:1238 Register 8 10 0 0
28541 2M none YourAppBusinessWorker 5 2473 0 0
28543 7.5M websocket://0.0.0.0:8282 YourAppGateway 912 10006 0 0
28545 43.75M websocket://0.0.0.0:8282 YourAppGateway 5859 10006 0 0
28544 18M websocket://0.0.0.0:8282 YourAppGateway 2386 10006 0 0
http://doc.workerman.net/315185
部分退出碼在意義在手冊里有寫
65280 你這里應(yīng)該是內(nèi)存超過php.ini限制,導(dǎo)致致命錯誤
11 是有coredump,一般是php的bug或者某個php擴(kuò)展的bug導(dǎo)致
9 是進(jìn)程被kill掉,一般發(fā)生在 restart/stop命令時。由于進(jìn)程繁忙,進(jìn)程收到重啟或者停止命令后在規(guī)定時間內(nèi)(1秒左右)沒有執(zhí)行退出,主進(jìn)程會給他發(fā)送kill命令,強(qiáng)制殺死(產(chǎn)生9退出碼),用來快速完成重啟或者停止操作。
每個socket連接操作系統(tǒng)都會給其分配發(fā)送緩沖區(qū),當(dāng)給1萬客戶端廣播大數(shù)據(jù)時(例如300k),瞬間最差情況會產(chǎn)生1W*300k約3G數(shù)據(jù)在緩沖區(qū),所以php進(jìn)程會占用大量的內(nèi)存,超過php.ini限制(默認(rèn)128M),導(dǎo)致致命錯誤(65280退出碼)。如果網(wǎng)絡(luò)流暢帶寬足夠(需要萬兆帶寬),網(wǎng)卡是萬兆網(wǎng)卡,并且客戶端接收速度夠快, 則會緩解很多,但是也會有不小的內(nèi)存占用。服務(wù)器瞬間發(fā)出去3G的數(shù)據(jù)還是很考驗(yàn)服務(wù)器的性能的,網(wǎng)卡和帶寬都必須萬兆了,cpu拍腦袋也得至少8核 16核甚至更高吧。