hyperf 实战之内存泄漏检测
1508
0
0
之前听小伙伴说,一直不敢使用 swoole, 原因并不是技术成本,而是怕不小心就会引起内存泄漏,真是让人哭笑不得。
今天我们通过一个例子来演示如何使用 smem 以及 SwooleTracker 搞定内存泄漏的问题问题。
为了方便测试,我们先对 server 的配置做一些简单的修改:
- .env 文件中设置 SCAN_CACHEABLE=true
- config/autoload/server.php 的 mode 改为 SWOOLE_BASE
- config/autoload/server.php 的 Constant::OPTION_WORKER_NUM 改为 1
- 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 ,所以会有明显的内存泄漏。
第三步,假设业务逻辑十分复杂,上面这个内存泄漏点一开始我们是不知道的,但是却发现机器的内存一直在持续上升,像下面这张图一样。
这个时候怎么排查呢?我们怎么确定就是 hyperf 的代码有问题,再或者说我们怎么定位到 IndexController::leak() 方法出了问题?
下面就要介绍我们今天要介绍的重点,smem 和 swoole_tracker。
由于我们需要安装 smem 命令以及 swoole_
还有90%的精彩内容,购买继续阅读
- 评论区
共4条评论
登录
后发布评论