在進(jìn)行壓力測試時(shí),只是測試在線保持?jǐn)?shù)量,客戶端和服務(wù)端并沒有發(fā)送任何數(shù)據(jù):
這里是我簡單寫的壓測程序:https://github.com/liamhao/websocket-pressure-test
,只要測試機(jī)內(nèi)存允許,支持百萬連接壓測。
先通過php start.php start
啟動GatewayWorker
,這時(shí)輸入php start.php status
查看進(jìn)程狀態(tài),結(jié)果如下圖所示,Summary
字段顯示內(nèi)存占用18M
:
開始壓測,當(dāng)連接數(shù)達(dá)到37
萬左右時(shí),Summary
字段顯示內(nèi)存占用2052M
:
停止壓測,將連接數(shù)將為0
時(shí),Summary
字段仍然顯示內(nèi)存占用2052M
,并沒有降低。即使等了很長時(shí)間,也是如此:
為什么連接斷開了,仍然會有這么大的內(nèi)存占用?里面的數(shù)據(jù)到底是什么?在以上的基礎(chǔ)上,不重啟GatewayWorker
的情況下,進(jìn)行第二次壓測,內(nèi)存并不會在2052M
的基礎(chǔ)上繼續(xù)增加。想知道具體原因和實(shí)現(xiàn)的原理,謝謝。
對,php內(nèi)存管理器申請的內(nèi)存不一定會歸還操作系統(tǒng),留著復(fù)用以提升性能。所以下次以同樣的客戶端數(shù)量壓測時(shí)內(nèi)存不會增長或者說不會明顯增長,因?yàn)槟遣糠诸A(yù)留內(nèi)存被復(fù)用了。
如果你想釋放這部分內(nèi)存,在start_gateway.php里加一個(gè)定時(shí)器,定時(shí)調(diào)用gc_mem_caches()
試下。
$gateway->onWorkerStart = function(){
Workerman\Timer::add(10, function(){
gc_collect_cycles();
gc_mem_caches();
});
};