我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Hyperf下Swoole Tracker的使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Hyperf下Swoole Tracker的使用

Hyperf下免费版Swoole Tracker使用

公司使用hyperf框架搭建的微服务平台,内存泄露问题十分严重,在排查期间也使用了gc_mem_caches回收内存,但是作用不大,所以后面还是采用免费版的Swoole Tracker作为内存检测工具,帮助排查内存问题;Hyperf的官方文档给的也不是很详细,安装过程也是踩了一些坑;

1. 首先要从官网获取最新的swoole_tracker

* 地址 https://business.swoole.com/SwooleTracker/apply* 注意使用和php环境版本一致的 swoole_tracker.so 文件

2. Hyperf一般使用docker作为开发容器,这里需要把swoole_tracker相关的扩展以及ini配置打包进dockerfile

[swoole_tracker];Tracker从v3.3.0版本开始修改为了Zend扩展zend_extension=swoole_tracker.so;打开总开关  tracker.enable和tracker.enable_malloc_hook不能同时开启tracker.enable=0;采样率 例如:100%tracker.sampling_rate=100;开启内存泄漏检测时添加 默认0 关闭状态tracker.enable_memcheck=1;Leak检测开关tracker.enable_malloc_hook=1
# DockerFile需要增加的内容ADD ./swoole_tracker80.so /tmpRUN cd /tmp \&& cp /tmp/swoole_tracker80.so /usr/lib/php8/modules/swoole_tracker.so \&& echo "zend_extension=swoole_tracker.so" >> /etc/php8/conf.d/swoole_tracker.ini \&& echo "tracker.enable=0" >> /etc/php8/conf.d/swoole_tracker.ini \&& echo "tracker.sampling_rate=100" >> /etc/php8/conf.d/swoole_tracker.ini \&& echo "tracker.enable_memcheck=1" >> /etc/php8/conf.d/swoole_tracker.ini \&& echo "tracker.enable_malloc_hook=1" >> /etc/php8/conf.d/swoole_tracker.ini \

下载好的文件直接放在项目根目录在这里插入图片描述

值得注意的是hyperf官方文档dockerfile配置中有一个 swoole-tracker-install.sh文件,免费版用不到这个文件,所以我们忽略掉即可;

3. 依赖组件

composer安装

composer require hyperf/swoole-tracker

config/autoload/aspects.php 配置中间件

return [    'http' => [    // 这个HttpServerMiddleware就是一个坑,引入后会造成一个报错,在这浪费了很多时间。希望有大佬解答下,是什么地方的问题。在此,我们不引入这个扩展        // Hyperf\SwooleTracker\Middleware\HttpServerMiddleware::class,                Hyperf\SwooleTracker\Middleware\HookMallocMiddleware::class    ],];

ps:引入Hyperf\SwooleTracker\Middleware\HttpServerMiddleware::class后会产生的错误

[INFO] HTTP Server listening at 0.0.0.0:9501zend_mm_heap corrupted[2023-03-03 13:46:39 $67.0]     WARNING Server::check_worker_exit_status(): worker(pid=68, id=0) abnormal exit, status=1, signal=0

如果创建目录有以下报错 就需要手动创建目录或者在dockerfile中尝试命令创建

PHP Fatal error: PHP Startup: swoole_tracker extension ERROR: mkdir /opt/swoole/var/run/swoole_tracker/ error,make sure that start the agent first or start your php with root permission(No such file or directory)// 创建目录命令mkdir -p /opt/swoole/var/run/swoole_tracker/

4.测试

  1. app/Controller/IndexController.php文件中写一个内存泄漏函数,并调用
public function demo(){$parallel = new Parallel();$parallel->add(function () {$this->foo();sleep(1);return Coroutine::id();});$parallel->add(function () {$this->foo();sleep(1);return Coroutine::id();});try{return $parallel->wait();} catch(ParallelExecutionException $e){print_r($e->getResults()); // $e->getResults() 获取协程中的返回值。print_r($e->getThrowables());// $e->getThrowables() 获取协程中出现的异常。return "exception";}}public function foo(){//如果不需要全局检测 就需要在主函数加上 trackerHookMalloc 用来测试//上面的中间件配置的有全局中间件 Hyperf\SwooleTracker\Middleware\HookMallocMiddleware::class 所以此处不需要单独标记主函数//trackerHookMalloc(); //标记主函数,开始hook mallocstatic $arr = [];$arr[] =  str_repeat("big string", 1024);$GLOBAL['g_arr'][] = str_repeat("big string", 1024);}
  1. 运行项目访问demo方法。http://127.0.0.1:9501/index/demo
  2. 查看泄露结果。
    Cli 命令行调用trackerAnalyzeLeak()函数即可分析泄漏日志,生成泄漏报告;可以直接php -r "trackerAnalyzeLeak();"
    Cli 命令行调用trackerCleanLeak()函数即可可以清除泄漏日志,重新开始;可以直接php -r "trackerCleanLeak();"

5.结果分析

泄漏的信息默认在 /tmp/trackerleak 日志里面
在这里插入图片描述

下面是泄漏报告的格式:

  • 没有内存泄漏的情况:
[217 (Loop 5)] ✅  Nice!! No Leak Were Detected In This Loop

其中217表示进程 idLoop 5表示第 5 次调用主函数生成的泄漏信息

  • 有确定的内存泄漏的情况:
[217 (Loop 6)] /data/hyperf-skeleton/vendor/hyperf/di/class="lazy" data-src/ClosureDefinitionCollector.php:23 => [256][217 (Loop 6)] /data/hyperf-skeleton/runtime/container/proxy/App_Controller_IndexController.proxy.php:64 => [24576][217 (Loop 6)] ❌  This Loop TotalLeak: [24832]

表示第6次调用ClosureDefinitionCollector.php23行,泄露了256字节内存;调用IndexController.php64 行,泄漏了24576字节内存,总共泄漏了 24832 字节内存。

跨 loop 分析:有时本次 Loop 的泄漏会在下次释放掉,Leak工具会跨相邻 2 个Loop 进行分析,自动对冲泄漏信息,如果是跨多个 Loop 的释放,会以如下格式输出:

[195 (Loop 7)] /opt/www/vendor/hyperf/load-balancer/class="lazy" data-src/AbstractLoadBalancer.php:76 => [-2640]               Free Pre (Loop 5) : /opt/www/vendor/hyperf/utils/class="lazy" data-src/Codec/Json.php:49 => [360]               Free Pre (Loop 5) : /opt/www/vendor/hyperf/rpc-client/class="lazy" data-src/AbstractServiceClient.php:210 => [2280]

上述信息表示 Loop 7 释放了 Loop 5360+2280 字节内存,如果只算这里,也是没有内存泄漏。

注意事项

  1. 前几次 Loop 的泄漏信息不用管,因为大部分项目都有一些初始化的缓存是不释放的,所以可以先清空下记录。
  2. 检测期间尽量不要有并发。
  3. 由于开启泄漏检测后性能会非常差,不要在 php.ini 中开启apm.enable_malloc_hook = 1压测。
  4. 和 Swoole Tracker2.x 的检查泄漏原理不一样,不能一起用。
  5. 一个进程只能有一个地方调用trackerHookMalloc()函数。
  6. Swoole4.5.3由于底层 api 有问题,Leak工具无法正常工作,请升级到最新版Swoole或者降级Swoole版本。

一些相关命令

查找PHP扩展目录的位置,
php -i | grep extension_dir

查看swoole和swoole_track版本
php --ri swoole
php --ri swoole_tracker

查询基础环境
uname -a

查询php版本
php -v

cp拷贝命令
cp 源头文件 目标文件

apache的ab压测
ab -n 500 -c 2000 http://10.2.1.28:9501/index/index

docker build
docker build -t swoole_admin_docker:v0.1 .

来源地址:https://blog.csdn.net/github_39327383/article/details/129318227

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Hyperf下Swoole Tracker的使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Swoole与HTTP的使用介绍

这篇文章主要讲解了“Swoole与HTTP的使用介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Swoole与HTTP的使用介绍”吧!目标了解swoole的http_server的使用了解
2023-06-07

swoole框架的使用示例

这篇文章将为大家详细讲解有关swoole框架的使用示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。正文swoole有两个部分。 一个是PHP扩展,用C开发的,这是核心。 另一个是框架,像yii、TP、L
2023-06-14

swoole框架的使用方法

这篇文章将为大家详细讲解有关swoole框架的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。swoole有两个部分。 一个是PHP扩展,用C开发的,这是核心。 另一个是框架,像yii、TP、Lar
2023-06-14

使用 Swoole 来加速你的 Laravel 应用

Swoole 是为 PHP 开发的生产级异步编程框架。 他是一个纯 C 开发的扩展, 他允许 PHP 开发者在 PHP 中写 高性能,可扩展的并发 T
使用 Swoole 来加速你的 Laravel 应用
2022-06-09

怎么使用Swoole避免分包问题的发生

这篇文章主要讲解了“怎么使用Swoole避免分包问题的发生”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Swoole避免分包问题的发生”吧!一、什么是分包问题在网络通信中,为了提高效
2023-07-05

使用Swoole和Workerman加速PHP与MySQL的消息传输

随着互联网的发展,PHP在网站开发中的应用越来越广泛。然而,由于PHP是解释型语言,每次与MySQL进行交互时都需要建立数据库连接,这会导致性能上的一定损耗。为了解决这个问题,我们可以借助Swoole和Workerman来加速PHP与MyS
2023-10-21

如何在Laravel5.6中使用Swoole的协程数据库查询

这篇“如何在Laravel5.6中使用Swoole的协程数据库查询”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“如何在Laravel5.6中使用Swoole的协程数据库查询”,小编整理了以下知
2023-06-06

php使用Swoole与WebSocket实现弹幕效果的示例代码

本文介绍了使用PHPSwoole和WebSocket实现弹幕效果。服务器端代码使用SwooleWebSocketServer类,处理连接、消息和关闭事件。客户端代码使用RatchetClientWebSocket连接到服务器并处理消息。弹幕效果通过前端生成消息、服务器广播消息和客户端渲染消息来实现。Swoole提供高性能和WebSocket支持,而WebSocket提供双向通信和实时性。需要注意服务器处理并发连接、客户端优化和安全考虑。
php使用Swoole与WebSocket实现弹幕效果的示例代码
2024-04-02

python下的MySQLdb使用

下载安装MySQLdb <1>linux版本http://sourceforge.net/projects/mysql-python/ 下载,在安装是要先安装setuptools,然后在下载文件目录下,修改mysite.cfg,指定本地my
2023-01-31

Ubuntu下netplan的使用

背景 netplan是Ubuntu下配置网络的工具,通过写yaml配置文件,配置网络连接规则。最近在玩树莓派,网络配置是个令人头疼的问题,使用netplan配置好后就算树莓派重启网络规则依旧生效。 安装 Ubuntu 18.04开始可以使用
2023-08-19

linux下netsnmp v3 的使用

XX的,弄了2天的V3版本终于弄好了,真的是会者不难,难者不会呐。郁闷。netsnmp的安装就非常简单了,在这里就略过算了,下面是V3版本的参数:V3 版本参数重要的一共为六个,分别为:-U  用户名-S security level [n
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录