3.x 版本 文件上传时内存泄漏

MakeHui

文件上传完内存没有得到释放, 导致一致累计, 最后崩溃自动重启

报错时的泄漏点(位置有点飘忽不定,这附近的代码都有概率报错):
https://github.com/walkor/Workerman/blob/6614873e22d88f7eb761c39afcaf8301b4084283/Protocols/Http.php#L551

尝试了手动释放掉$_cache并没能解决问题

附件为strace信息

阅读 501
2个回答

damao

内存报错不一定是内存泄漏吧,可能上传的文件过大超过内存限制。还有可能是同一个进程同时在接收几个用户上传的文件,所有文件加一起导致内存超过限制。

上传完文件,运行 php start.php status 看下内存释放没。

  • MakeHui 2021-06-10
    1. 上传文件为 100k; 2. 只有一个进程上传; 3. 我是通过 top 查看的内存变化情况, 每次上传完(可以上传成功)内存都会增加, 即便是等待一段时间内存也没有被回收掉.
MakeHui

找到一个曲线救国的方法: https://github.com/walkor/Workerman/issues/401#issuecomment-462043161
稍微优化了一下重启策略

Timer::add(5, function() use ($worker){
    $memoryUsage = memory_get_usage(true);
    if (count($worker->connections) !== 0 && $memoryUsage < $this->memoryUsageLimit[1]) {
        return;
    }
    if ($memoryUsage > $this->memoryUsageLimit[0] || static::$requestCount > 10000) {
        static::$requestCount = 0;
        // Restart current process.
        Worker::stopAll();
    }
});

还有一点要注意: 最好是和前端沟通一下请求时在header中设置Connection: close, 或者服务端调用close()不保持链接, 增加触发的概率

  • 暂无评论