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