[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,在`Swoole Tracker 3.0+`版本推荐使用[此工具](leak.md)检测泄漏
在客户端需要进行内存泄漏检测的代码中进行手动埋点
* 在代码开头添加
```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)