GatewayWorker Summary 显示的内存没有变小

liamhao

在进行压力测试时,只是测试在线保持数量,客户端和服务端并没有发送任何数据:

这里是我简单写的压测程序:https://github.com/liamhao/websocket-pressure-test,只要测试机内存允许,支持百万连接压测。

第一步:

先通过php start.php start启动GatewayWorker,这时输入php start.php status查看进程状态,结果如下图所示,Summary字段显示内存占用18M
截图

第二步

开始压测,当连接数达到37万左右时,Summary字段显示内存占用2052M
截图

第三步

停止压测,将连接数将为0时,Summary字段仍然显示内存占用2052M,并没有降低。即使等了很长时间,也是如此:
截图

问题

为什么连接断开了,仍然会有这么大的内存占用?里面的数据到底是什么?在以上的基础上,不重启GatewayWorker的情况下,进行第二次压测,内存并不会在2052M的基础上继续增加。想知道具体原因和实现的原理,谢谢。

1113 2 1
2个回答

walkor

对,php内存管理器申请的内存不一定会归还操作系统,留着复用以提升性能。所以下次以同样的客户端数量压测时内存不会增长或者说不会明显增长,因为那部分预留内存被复用了。

如果你想释放这部分内存,在start_gateway.php里加一个定时器,定时调用gc_mem_caches()试下。

$gateway->onWorkerStart = function(){
    Workerman\Timer::add(10, function(){
        gc_collect_cycles();
        gc_mem_caches();
    });
};
  • liamhao 2022-04-29

    那这些留着复用的内存里有存储什么数据吗?还是说只是占着这些内存,但内容都是空的?

  • liamhao 2022-04-29

    以及第一次连接时,这些内存是用来存储哪些数据用的?

  • walkor 2022-04-29

    留着复用的内存没有存数据。

  • liamhao 2022-04-29

    留着复用我明白了,那第一次启动,连接后,第一次涨到2G时,那时的内存里存的是什么?

  • walkor 2022-04-29

    连接对象

  • liamhao 2022-04-29

    ok,感谢。刚刚把 linux 中 /etc/security/limits.conf 文件的 nofile 改的太大了,导致 ssh 登录不上了... 😂

  • liziyu 2022-04-29

    搭顺车请教下:比如说服务器物理内存总共有4G,如果这2G占用了,意味着服务器内的其它的应用最多也只能用剩余的2G内存空间了,这样理解对吗?

  • liamhao 2022-04-29

    @liziyu 我觉得是这样的,那2G是php占用的,不可能给系统别的进程用

年代过于久远,无法发表回答
🔝