[TOC]
## 進程列表
統計客戶端機器`fpm`和`cli`進程內存占用和CPU占用,操作開啟關閉遠程調試,可批量開啟全部

## 遠程調試
對于以下四種工具,可以直接在服務端點擊按鈕遠程開啟后進行調試,無需修改代碼,重啟服務。開啟后發生請求,日志自動上傳服務端后臺進行分析展示。
>[danger] 對性能有所影響,開啟調試完畢后請及時關閉。
## 手動埋點調試
>[info] **遠程調試和手動埋點二選一即可,不可重復開啟;**
> 性能分析、內存泄漏、阻塞檢測都比較影響性能,建議在開發/測試環境中使用;
> 如需在生產環境中使用,在使用后請盡快移除;
> 注意不要同時開啟多個工具,例如代碼中同時 startXhprof() 和 startBlockCheck() 這樣會相互影響導致結果都不準確。
### 性能分析

在客戶端需要進行性能分析的代碼中進行手動埋點
* 在代碼開頭添加
```php
startXhprof();
```
* 在代碼結束添加
```php
endXhprof();
```
實例:
```php
<?php
// 開始
startXhprof();
function a($arg){
echo $arg;
}
a(123);
// 結束
endXhprof();
```
#### 分層分析表

#### 調用圖
客戶端會自動上報生成的日志信息,在后臺就可以看到所生成的性能瓶頸圖

圖中會指出:函數;`Inc`函數運行時間,包括子函數;`Excl`函數運行時間,不包括子函數;`total calls`總調用次數;
#### 火焰圖

增加了查看火焰圖的功能,火焰圖是性能分析的利器,并可以與用戶互動。
* 鼠標懸浮
火焰的每一層都會標注函數名,鼠標懸浮時會顯示完整的函數名、抽樣抽中的次數、占據總抽樣次數的百分比。
下面是一個例子:

* 點擊放大
在某一層點擊,火焰圖會水平放大,該層會占據所有寬度,顯示詳細信息。

左上角會同時顯示"Reset Zoom",點擊該鏈接,圖片就會恢復原樣。
* 搜索
按下 `Ctrl + F` 或者點擊圖中右上角的 `Search` 會顯示一個搜索框,用戶可以輸入關鍵詞或正則表達式,所有符合條件的函數名會高亮顯示。


### 內存泄漏
>[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`

### 阻塞檢測
>[warning] ??該檢測不追蹤fork的子進程。
在客戶端需要進行阻塞檢測的代碼中進行手動埋點

>[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`等

增加了調用棧的頁面,**開啟并且發生請求后**就會上報
