Tracker的调试工具链目前有4种,分别是性能分析
、阻塞检测
、内存泄漏
、查看当前调用栈
。
经常有人问它们的适用场景以及区别,在此予以说明:
是用在 Swoole、Workerman 等常驻进程模式下的工具,在 FPM 下是不存在内存泄漏一说的,它能帮助你检查这种情况:
在请求开始后向某一个全局变量($GLOBALS
或者类的静态属性等)追加内容,并且在请求结束的时候追加在全局变量的内容没有被unset
掉,那么就认为有内存泄漏。
[info] 请求开始和请求结束可以通过调用
Tracker API
来指定,具体参考「调试器」章节手动埋点调试
。
阻塞检测工具的准确的来说应该叫做阻塞系统调用检测工具
,它的原理是拦截进程的所有系统调用,在开始和结束打点取时间差,如果大于配置的时间(默认10ms
)就把当前的 PHP 调用堆栈上报到 Tracker 的后台,可以方便的定位到调用栈阻塞在哪个系统调用,耗时多少毫秒,通过具体的系统调用我们能判断出进程是锁等待、还是磁盘 IO 问题、网络 IO 问题等。
但是这个工具无法检测出卡死的问题,具体可以参考微课程的这篇文章教你秒级定位PHP卡死问题
对于阻塞检测工具无法发现的卡死问题,需要用查看当前调用栈
工具来定位到底卡死在哪个 PHP 函数了,当前的调用堆栈是什么。
是最直观的一种性能分析方式,因为他可以生成一整张的调用图,他的原理是拦截所有的 PHP 函数调用,并且在开始和结束打点取时间差。
它是非常好的定位hot函数
的工具,方便的定位到最耗时的函数是哪个,但是无法看到调用栈,也不知道具体的系统调用,每次调用的耗时也不知道。
一般性能调优的话用性能分析
工具就够用,生产环境突然产生了性能问题最先用性能分析查看,先大概定位问题,如果请求阻塞非常久(也就是卡死)可以直接用查看当前调用栈
工具查看,如果请求只是变慢了就用阻塞检测工具
。
当然也可以挨个使用一遍,多维度发现问题。