限时 5折! 详情

hyperf 实战之内存泄漏检测

949 0 0

之前听小伙伴说,一直不敢使用 swoole, 原因并不是技术成本,而是怕不小心就会引起内存泄漏,真是让人哭笑不得。

今天我们通过一个例子来演示如何使用 smem 以及 SwooleTracker 搞定内存泄漏的问题问题。

为了方便测试,我们先对 server 的配置做一些简单的修改:

  1. .env 文件中设置 SCAN_CACHEABLE=true
  2. config/autoload/server.php 的 mode 改为 SWOOLE_BASE
  3. config/autoload/server.php 的 Constant::OPTION_WORKER_NUM 改为 1
  4. config/autoload/server.php 注释掉 Constant::OPTION_MAX_REQUEST => 100000 这一行

以上配置,在本篇文中测试后,大家记得自行改回来,这样的配置仅限本篇测试。

第二步,我们写一个明显会导致内存泄漏的例子。

#[AutoController]
class IndexController extends AbstractController
{
    public array $data = [];
    public function leak()
    {
        $this->data[] = str_repeat("'hello world'", 1024);
        return [];
    }
}

在 fpm 下,上面这个例子没有什么问题,但是在常驻进程模式下,请求结束后,IndexController::$data 并没有被 unset ,所以会有明显的内存泄漏。

第三步,假设业务逻辑十分复杂,上面这个内存泄漏点一开始我们是不知道的,但是却发现机器的内存一直在持续上升,像下面这张图一样。

d646977477-leak2.png

这个时候怎么排查呢?我们怎么确定就是 hyperf 的代码有问题,再或者说我们怎么定位到 IndexController::leak() 方法出了问题?

下面就要介绍我们今天要介绍的重点,smem 和 swoole_tracker。

由于我们需要安装 smem 命令以及 swoole_

去购买

还有90%的精彩内容,购买继续阅读