Tracker的調試工具鏈目前有4種,分別是`性能分析`、`阻塞檢測`、`內存泄漏`、`查看當前調用棧`。
經常有人問它們的適用場景以及區別,在此予以說明:
## 內存泄漏
是用在 Swoole、Workerman 等常駐進程模式下的工具,在 FPM 下是不存在內存泄漏一說的,它能幫助你檢查這種情況:
在請求開始后向某一個全局變量(`$GLOBALS`或者類的靜態屬性等)追加內容,并且在請求結束的時候追加在全局變量的內容沒有被`unset`掉,那么就認為有內存泄漏。
>[info] 請求開始和請求結束可以通過調用`Tracker API`來指定,具體參考「[調試器](debuger.md)」章節`手動埋點調試`。
## 阻塞檢測
阻塞檢測工具的準確的來說應該叫做`阻塞系統調用檢測工具`,它的原理是攔截進程的所有系統調用,在開始和結束打點取時間差,如果大于配置的時間(默認`10ms`)就把當前的 PHP 調用堆棧上報到 Tracker 的后臺,可以方便的定位到調用棧阻塞在哪個系統調用,耗時多少毫秒,通過具體的系統調用我們能判斷出進程是鎖等待、還是磁盤 IO 問題、網絡 IO 問題等。
但是這個工具無法檢測出卡死的問題,具體可以參考微課程的這篇文章[教你秒級定位PHP卡死問題](https://course.swoole-cloud.com/article/2)
## 查看當前調用棧
對于阻塞檢測工具無法發現的卡死問題,需要用`查看當前調用棧`工具來定位到底卡死在哪個 PHP 函數了,當前的調用堆棧是什么。
## 性能分析
是最直觀的一種性能分析方式,因為他可以生成一整張的調用圖,他的原理是攔截所有的 PHP 函數調用,并且在開始和結束打點取時間差。
它是非常好的`定位hot函數`的工具,方便的定位到最耗時的函數是哪個,但是無法看到調用棧,也不知道具體的系統調用,每次調用的耗時也不知道。
## 到底該用哪個工具
一般性能調優的話用`性能分析`工具就夠用,生產環境突然產生了性能問題最先用性能分析查看,先大概定位問題,如果請求阻塞非常久(也就是卡死)可以直接用`查看當前調用棧`工具查看,如果請求只是變慢了就用`阻塞檢測工具`。
當然也可以挨個使用一遍,多維度發現問題。