webman1.5出现内存泄漏,如何定位

wuxian

webman1.5出现内存泄漏

webman框架运行了有一年,后面不知道从什么时候开始,内存一直在增加,不释放,按照之前walkor提供的方法检测,心跳检测接口都出现内存变化,各位大佬,有什么好的方法可以定位吗
检查内存变化中间件

public function process(Request $request, callable $handler) : Response
    {
        $response = $handler($request);
        $worker = App::worker();
        if (!$worker || $worker->id !== 0) {
            return $response;
        }
        static $memory = 0;

        if ($memory === 0) {
            $memory = memory_get_usage(true);
        }
        $usage = memory_get_usage(true);
        $diff = $usage - $memory;

        $checkLimit = 10 * 1024;
        if ($diff > $checkLimit) {
            $uri = $request->uri();
            $method = $request->method();
            (new FeiShuClient)->send([
                '上次内存' => $memory / 1024 . '(KB)',
                '本次内存' => $usage / 1024 . '(KB)',
                '内存变化' => $diff / 1024 . '(KB)',
                '请求方法' => $method,
                '请求地址' => $uri,
            ], 'fs_token_check');
        }
        $memory = $usage;

        return $response;
    }

心跳接口

public function isHealthy(Request $request)
    {
        return 'okk';
    }

飞书报警
截图

每次大概2M增加
截图

进程的内存分布也相差很大,处理的请求差不大,但有的进程才15M,有的就300M多
截图

后来加了xhprof监控,但和飞书里的内存不一致,xhprof监控的内存大致正常

xhprof监控页面
截图

飞书提醒有12M
截图

1101 10 1
10个回答

walkor 打赏

请求增长到一定程度不再增长不是内存泄露。
50M内存是正常内存占用,没超过100M不用担心。

  • wuxian 2025-07-08

    增长到300M了,服务器内存都爆了

  • walkor 2025-07-09

    看在是不是哪里读数据库 redis等读的数据太大了,超过php内存上限了。
    如果有类似 Fatal error: Allowed memory size of xxx bytes exhausted 看下调用栈,大概能看出来哪里大量使用了内存。

  • wuxian 2025-07-10

    有这个错误,是通过execl上传文件会爆这个错误,这块申请的内存是相当垃圾内存吗,之后都不能用吗,要怎么处理呢

  • walkor 2025-07-10

    php申请的内存不一定会全部释放,会留着下次复用

  • wuxian 2025-07-10

    大佬,评论贴不了图片。我在问题上加了几张图,飞书看到的报警是大概2M一加,进程内存严重不均衡

  • walkor 2025-07-10

    这个自己测试下吧,看下哪个请求占用了内存。尤其excel上传。其他人帮不上什么忙,只能自己去测试找问题

啥也不是

截图
没有慌过

  • 暂无评论
qqxxr

你尝试着注释你的中间件,composer包,先从架构层次排查,定位在那一层先。然后在定位业务,这个思路

  • qqxxr 2025-07-09

    也可以正向排查,下载一个裸框架,一层层把你的业务加上去。通过压力测试跑你的接口,这样也可以排查

liziyu

少用static多用new,少用tp多用lv生态。会很少很多烦恼;

  • 暂无评论
ichynul

有可能是redis存的东西太多,运行的时候加载进来了。有的缓存时间设置的很长或是永久的,时间久了就积累了一些垃圾数据。
如果redis里面数据不重要,直接把使用的库全库清除或手动判断删除。

  • wuxian 2025-07-09

    redis在一个进程里,变量名是一样的,应该会被覆盖吧

Le

之前遇到了跟你一样的问题。。突然开始进程增上,而且是慢慢稳定的向上,直到超过上限后自动重启。。

xiaoming

看是不是redis 我遇到过一次 是redis

  • wuxian 2025-07-10

    老哥,我这边的redis是用了云厂商的,redis的数据不占本机内存,redis是怎么关联的,php只是把redis数据读到内存里,

  • xiaoming 2025-07-10

    如果redis 单个数据太大也会

  • wuxian 2025-07-10

    老哥,我看下我这个情况,问题我加了几张图片,内存大概是2M一加,而且进程间内存相差很大

nitron

什么时候开始出现居高不下的情况的,看下代码提交日志,回想下当时上了什么功能,或者什么功能的业务量在那时候起突然比之前增多,没业务代码,大家看截图大概率只能靠猜,只能你自己去定位

  • 暂无评论
缝合

单独搞一部份流量用 xphrof 做内存使用分析。基本可以定位到。

  • wuxian 2025-07-16

    接入了xhprof,xhprof监控页面没发现大内存,问题又贴了几张图

jack10082009

Redis内存增加是不是应该体现在系统内存总占用上,请问对于PHP workerman中使用了Redis还会导致workerman进程的内存增加吗?

  • wuxian 2025-07-14

    现在就是使用了redis,问题我截图了,很奇怪,有的进程内存正常

  • qqxxr 2025-07-16

    你有云服务器吗?查看一下那段时间中间件redis,mysql日志,看在执行哪些操作。有的进程有,有的进程没,那就可能是某些进程触发了业务死循环

🔝