[TOC] ## 进程列表 统计客户端机器`fpm`和`cli`进程内存占用和CPU占用,操作开启关闭远程调试,可批量开启全部 ![](https://img.kancloud.cn/41/f1/41f1a5bb4041f339e15c61614e820f71_3184x1682.png) ## 远程调试 对于以下四种工具,可以直接在服务端点击按钮远程开启后进行调试,无需修改代码,重启服务。开启后发生请求,日志自动上传服务端后台进行分析展示。 >[danger] 对性能有所影响,开启调试完毕后请及时关闭。 ## 手动埋点调试 >[info] **远程调试和手动埋点二选一即可,不可重复开启;** > 性能分析、内存泄漏、阻塞检测都比较影响性能,建议在开发/测试环境中使用; > 如需在生产环境中使用,在使用后请尽快移除; > 注意不要同时开启多个工具,例如代码中同时 startXhprof() 和 startBlockCheck() 这样会相互影响导致结果都不准确。 ### 性能分析 ![](https://img.kancloud.cn/ff/4d/ff4de64aefd3441814a44e1156c2e95a_4952x1864.png) 在客户端需要进行性能分析的代码中进行手动埋点 * 在代码开头添加 ```php startXhprof(); ``` * 在代码结束添加 ```php endXhprof(); ``` 实例: ```php <?php // 开始 startXhprof(); function a($arg){ echo $arg; } a(123); // 结束 endXhprof(); ``` #### 分层分析表 ![](https://img.kancloud.cn/9d/88/9d883be828e608579246ca67e0cb5a28_4930x2602.png) #### 调用图 客户端会自动上报生成的日志信息,在后台就可以看到所生成的性能瓶颈图 ![](https://img.kancloud.cn/d5/5e/d55ee573db6833df80901d37e8ed6da0_3692x1604.png) 图中会指出:函数;`Inc`函数运行时间,包括子函数;`Excl`函数运行时间,不包括子函数;`total calls`总调用次数; #### 火焰图 ![](https://img.kancloud.cn/1d/c4/1dc4eb0b00b1d4c79777122cfab1cefd_2402x758.png) 增加了查看火焰图的功能,火焰图是性能分析的利器,并可以与用户互动。 * 鼠标悬浮 火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。 下面是一个例子: ![](https://img.kancloud.cn/53/97/5397c2bcdc00d27739a787aad04217e4_2398x752.png) * 点击放大 在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。 ![](https://img.kancloud.cn/b9/fa/b9fa2d8399f674bc35ebd431bdaca8ac_2394x746.png) 左上角会同时显示"Reset Zoom",点击该链接,图片就会恢复原样。 * 搜索 按下 `Ctrl + F` 或者点击图中右上角的 `Search` 会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。 ![](https://img.kancloud.cn/3c/07/3c07d078068216101b8dea1623beda4d_2396x748.png) ![](https://img.kancloud.cn/1b/76/1b76b35d80715fecf3e11ea8948e1d70_2380x750.png) ### 内存泄漏 >[danger] ⚠️此功能仅支持 PHP71+ 版本,即PHP71、PHP72、PHP73 在客户端需要进行内存泄漏检测的代码中进行手动埋点 * 在代码开头添加 ```php startMemleakCheck(); ``` * 在代码结束添加 ```php endMemleakCheck(); ``` 实例: ```php <?php // 开始 startMemleakCheck(); $redis; function a(){ global $redis; $redis = new \redis(); $result = $redis->connect('127.0.0.1', 6379); $redis->set("dasda",123123); var_dump($redis->get("dasda")); } a(); // 结束 endMemleakCheck(); ``` 会说明存在内存泄漏到文件行数,对应到键名,此处可能需要进行修改或者进行 `unset` ![](https://img.kancloud.cn/69/e6/69e697665455c5da2c58fb48cf37fc8c_4648x686.png) ### 阻塞检测 >[warning] ⚠️该检测不追踪fork的子进程。 在客户端需要进行阻塞检测的代码中进行手动埋点 ![](https://img.kancloud.cn/37/06/3706c5b7b0197e1d37b82f686387e739_3344x1572.png) >[info] 反应堆解释: > 如果使用swoole会产生较多的的epoll_wait、epoll_wait_old、epoll_pwait,等待事件发生。可选择检测时列表是否将此类信息过滤不进行展示。 * 在代码开头添加 ```php startBlockCheck(); ``` * 在代码结束添加 ```php endBlockCheck(); ``` 默认检测阻塞10ms的数据,大于这个值的系统调用就认为是阻塞的,如果要修改请编辑文件 `/opt/swoole/config/config_common.conf` ```json {"protocol":"TCP","block_time_out":"10"} ``` 修改 `block_time_out` 的值,修改后需要重启NodeAgent ### 查看调用栈 方便定位 PHP 卡死问题,包括但不限于`死循环`、`sesstion_start函数导致卡死`、`flock函数导致卡死`、`TCP超时时间为-1`、`swoole协程的lock`等 ![](https://img.kancloud.cn/bf/07/bf07ab05d4edd90b9e8f7067eec9b1e9_2896x1234.png) 增加了调用栈的页面,**开启并且发生请求后**就会上报 ![](https://img.kancloud.cn/13/cd/13cd7e8a5f9d0cbaffb9c118776acc17_2658x1292.png)