iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >Hyperf下Swoole Tracker的使用
  • 383
分享到

Hyperf下Swoole Tracker的使用

swoolephp 2023-09-04 16:09:07 383人浏览 安东尼
摘要

Hyperf下免费版Swoole Tracker使用 公司使用hyperf框架搭建的微服务平台,内存泄露问题十分严重,在排查期间也使用了GC_mem_caches回收内存,但是作用不大,所以后面还

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/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/src/AbstractLoadBalancer.php:76 => [-2640]               Free Pre (Loop 5) : /opt/www/vendor/hyperf/utils/src/Codec/Json.php:49 => [360]               Free Pre (Loop 5) : /opt/www/vendor/hyperf/rpc-client/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

--结束END--

本文标题: Hyperf下Swoole Tracker的使用

本文链接: https://www.lsjlt.com/news/393843.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Hyperf下Swoole Tracker的使用
    Hyperf下免费版Swoole Tracker使用 公司使用hyperf框架搭建的微服务平台,内存泄露问题十分严重,在排查期间也使用了gc_mem_caches回收内存,但是作用不大,所以后面还...
    99+
    2023-09-04
    swoole php
  • hyperf中使用w7corp/easywechat
    ​ EasyWeChat 是一个开源的微信非官方 SDK。安装非常简单,因为它是一个标准的Composer包,这意味着任何满足下列安装条件的 PHP 项目支持Composer都可以使用它。在php-f...
    99+
    2023-08-31
    php 微信
  • hyperf 自定义验证器的使用
    引入组件包 composer require hyperf/validation 添加中间键 您需要为使用到验证器组件的 Server 在 config/autoload/middlewares.php 配置文件加上一个全局中间件 Hype...
    99+
    2023-09-04
    php java 数据库
  • PHP微服务 hyperf+nacos使用
    PHP微服务 hyperf+nacos使用 这里简单说下微服务,及架构方面东西 1:微服务对php +fpm 模式意义不是很大,原因就是php+fpm 天生支持模块拆分,热更新,如果只是性能上的考虑,...
    99+
    2023-09-04
    微服务 php nacos hyperf
  • hyperf使用curl产生的超时问题
    业务场景 每天晚上系统需要同步第三方接口的数据,我们的系统要做的就是使用多个协程调用api接口获取数据(一批单号需要调用多个不同的接口),然后写入数据库。 出现的问题 在设置了超时时间为5分钟的情况...
    99+
    2023-09-11
    php
  • swoole框架的使用方法
    这篇文章将为大家详细讲解有关swoole框架的使用方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。swoole有两个部分。 一个是PHP扩展,用C开发的,这是核心。 另一个是框架,像yii、TP、Lar...
    99+
    2023-06-14
  • swoole框架的使用示例
    这篇文章将为大家详细讲解有关swoole框架的使用示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。正文swoole有两个部分。 一个是PHP扩展,用C开发的,这是核心。 另一个是框架,像yii、TP、L...
    99+
    2023-06-14
  • Swoole与HTTP的使用介绍
    这篇文章主要讲解了“Swoole与HTTP的使用介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Swoole与HTTP的使用介绍”吧!目标了解swoole的http_server的使用了解...
    99+
    2023-06-07
  • swoole-cli怎么使用
    今天小编给大家分享一下swoole-cli怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。最新的swoole-cli已...
    99+
    2023-06-29
  • Linux下怎么用php安装swoole扩展
    这篇文章主要介绍了Linux下怎么用php安装swoole扩展的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux下怎么用php安装swoole扩展文章都会有所收获,下面我们一起来看看吧。Swoole 使 ...
    99+
    2023-06-28
  • swoole如何安装和使用
    这篇文章主要讲解了“swoole如何安装和使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“swoole如何安装和使用”吧!一、安装SwooleSwoole支持的PHP版本是PHP5.3及以...
    99+
    2023-07-05
  • thinkphp6如何使用swoole服务
    安装thinkphp6 composer create-project topthink/think=6.0.x-dev tp 安装think-swoole的扩展库 composer require ...
    99+
    2023-09-07
    swoole php websocket
  • 一步一步教你在windows电脑是使用phpstorm配置,连接docker desktop,以达到开发swoole框架 hyperf的效果的完整教程!
    前言: 这是一篇php进阶的文档,可能不适合所有phper,但是如果你想学hyperf,又没有Mac,又不想拿电脑装个ubuntu桌面,而你又想学swoole最牛逼的框架hyperf,且你具备docker基础知识,那这篇文章将引导你使用ph...
    99+
    2023-09-05
    phpstorm docker swoole php
  • swoole中信号量怎么使用
    这篇文章主要介绍了swoole中信号量怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇swoole中信号量怎么使用文章都会有所收获,下面我们一起来看看吧。在swoole中,信号量主要用来保护共享资源,使得...
    99+
    2023-06-29
  • swoole中有没有使用协程
    这篇文章主要介绍“swoole中有没有使用协程”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“swoole中有没有使用协程”文章能帮助大家解决问题。swoole中有使用协程,协程主要用于将线程中的竞争...
    99+
    2023-07-02
  • Laravel 使用swoole 搭建 websocket 链接
    方案一  composer 安装配置安装 LaravelS 扩展包: composer require hhxsv5/laravel-s Laravel 5.5 以上版本可用,无需手动在 config/app.php 配置文件中注册,运行A...
    99+
    2023-08-31
    laravel swoole php
  • Swoole同步请求如何使用
    本篇内容主要讲解“Swoole同步请求如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Swoole同步请求如何使用”吧!一、什么是Swoole同步请求Swoole是一种针对PHP语言的网络...
    99+
    2023-07-05
  • 怎么在PHP项目中使用Swoole
    这篇“怎么在PHP项目中使用Swoole”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么在PHP项目中使用Swoole”文...
    99+
    2023-07-05
  • PHP Swoole的基本用法
    目录 【了解Swoole】 【PHP中使用Swoole案例演示】 安装Swoole扩展 Swoole实现TCP请求 Swoole实现UDP请求 Swoole实现HTTP请求 Swoole实现WebSocket聊天室功能 Swoole执行异步...
    99+
    2023-09-02
    php swoole 服务器 网络 http
  • 使用Swoole怎么提高Laravel性能
    使用Swoole怎么提高Laravel性能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。环境1:硬件: 1 CPU, 4 Cores, 16GB MemoryMacOS 1...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作