Skip to content

pt-pmp

聚合 GDB 堆栈跟踪,汇总选定程序的调用栈——一个简易的"穷人版"性能剖析器。

语法

bash
pt-pmp [OPTIONS] [FILES]

pt-pmp 的灵感来自 poormansprofiler.org,可以在 Linux 上创建并汇总进程的完整堆栈跟踪。 堆栈汇总是诊断进程"在等待什么"的利器。

注意

收集 GDB 堆栈需要把 GDB 附加到程序并打印所有线程的堆栈,这会冻结程序一段时间 (从一秒左右到更长,取决于系统繁忙程度与内存/线程数)。作为 MySQL 剖析工具使用时, 工具运行期间 MySQL 将无响应——但如果你正是在诊断一台无响应的服务器,这样做并无不妥。 此外 GDB 分离后也存在服务器崩溃或性能变差的风险。

用法示例

pt-pmp 是纯本机工具,通过 gdb / eu-stack 附加到进程来抓取堆栈,不连接数据库。命令可直接复制运行。注意:默认用 gdb 采集会短暂冻结目标进程(见上方警告),生产环境建议优先用 -d eu

场景:剖析 mysqld 在做什么

服务器卡顿或无响应时,抓取并汇总 mysqld 各线程的调用栈,看大量线程卡在哪个函数:

bash
pt-pmp

场景:用 eu-stack 低开销剖析

不想让 MySQL 因 gdb 附加而冻结,改用 elfutils 的 eu-stack(开销极小,推荐):

bash
pt-pmp -d eu

场景:剖析指定进程

要剖析某个具体 PID(如另一个 mysqld 实例或派生进程),用 -p 指定,覆盖默认的 --binary

bash
pt-pmp -p 12345

场景:聚合已有的堆栈文件

已有一份 gdb 导出的堆栈文本,直接交给 pt-pmp 做聚合汇总(跳过采集步骤):

bash
pt-pmp /tmp/gdb-trace.txt

功能说明

pt-pmp 做两件事:获取堆栈跟踪,以及汇总堆栈跟踪。命令行给了文件时跳过第一步,直接聚合文件。

汇总时,工具从堆栈的每一层提取函数名(符号),用逗号连接;对输出的每个线程都这样处理, 然后把相似的线程排在一起计数,并按出现频率从高到低排序。

dumpers eupteu 使用 eu-stack(elfutils)代替 GDB,开销极小,不会有 GDB 的上述问题。 推荐使用它们代替 GDB,未来其中一个将成为默认 dumper。

选项

选项说明
-b, --binary类型:string;默认:mysqld。要跟踪的二进制程序
-d, --dumper类型:string;默认:gdb。获取堆栈的 dumper:gdbeu(eu-stack)、pteu(pt-eustack-resolver)
--help显示帮助并退出
-s, --interval类型:int;默认:0。各次 --iterations 之间的睡眠秒数
-i, --iterations类型:int;默认:1。收集并聚合的堆栈次数
-l, --lines类型:int;默认:0。只聚合每栈前 N 个函数;0 表示不限
-p, --pid类型:int。要跟踪的进程 ID,优先于 --binary
--readnever给 gdb 传 --readnever:不读符号文件,堆栈生成快得多,但信息可能不足以诊断
-k, --save-samples类型:string。聚合后保留原始堆栈到该文件
-t, --tids类型:string;默认:*。只提取指定 tid 的堆栈(用正则匹配线程),如 -t 21-t 21201,23846-t 21201,237.8
--version显示版本并退出

其他信息

  • 系统要求:需要 Bash v3 或更新版本;不给定 backtrace 文件时还需要 gdb。

  • 环境变量:本工具不使用环境变量(所有 Percona Toolkit 工具均支持 PTDEBUG=1 调试,注意调试输出会暴露命令行中的密码)

  • 通用说明:已知问题的反馈方式、PTDEBUG 调试安全提示、系统要求基线,见 通用说明

更多细节请阅读 官方文档

Percona Toolkit 中文文档 · 社区维护的第三方学习站