pt-pmp
聚合 GDB 堆栈跟踪,汇总选定程序的调用栈——一个简易的"穷人版"性能剖析器。
语法
pt-pmp [OPTIONS] [FILES]pt-pmp 的灵感来自 poormansprofiler.org,可以在 Linux 上创建并汇总进程的完整堆栈跟踪。 堆栈汇总是诊断进程"在等待什么"的利器。
注意
收集 GDB 堆栈需要把 GDB 附加到程序并打印所有线程的堆栈,这会冻结程序一段时间 (从一秒左右到更长,取决于系统繁忙程度与内存/线程数)。作为 MySQL 剖析工具使用时, 工具运行期间 MySQL 将无响应——但如果你正是在诊断一台无响应的服务器,这样做并无不妥。 此外 GDB 分离后也存在服务器崩溃或性能变差的风险。
用法示例
pt-pmp 是纯本机工具,通过 gdb / eu-stack 附加到进程来抓取堆栈,不连接数据库。命令可直接复制运行。注意:默认用 gdb 采集会短暂冻结目标进程(见上方警告),生产环境建议优先用 -d eu。
场景:剖析 mysqld 在做什么
服务器卡顿或无响应时,抓取并汇总 mysqld 各线程的调用栈,看大量线程卡在哪个函数:
pt-pmp场景:用 eu-stack 低开销剖析
不想让 MySQL 因 gdb 附加而冻结,改用 elfutils 的 eu-stack(开销极小,推荐):
pt-pmp -d eu场景:剖析指定进程
要剖析某个具体 PID(如另一个 mysqld 实例或派生进程),用 -p 指定,覆盖默认的 --binary:
pt-pmp -p 12345场景:聚合已有的堆栈文件
已有一份 gdb 导出的堆栈文本,直接交给 pt-pmp 做聚合汇总(跳过采集步骤):
pt-pmp /tmp/gdb-trace.txt功能说明
pt-pmp 做两件事:获取堆栈跟踪,以及汇总堆栈跟踪。命令行给了文件时跳过第一步,直接聚合文件。
汇总时,工具从堆栈的每一层提取函数名(符号),用逗号连接;对输出的每个线程都这样处理, 然后把相似的线程排在一起计数,并按出现频率从高到低排序。
dumpers eu 和 pteu 使用 eu-stack(elfutils)代替 GDB,开销极小,不会有 GDB 的上述问题。 推荐使用它们代替 GDB,未来其中一个将成为默认 dumper。
选项
| 选项 | 说明 |
|---|---|
-b, --binary | 类型:string;默认:mysqld。要跟踪的二进制程序 |
-d, --dumper | 类型:string;默认:gdb。获取堆栈的 dumper:gdb、eu(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 调试安全提示、系统要求基线,见 通用说明。
更多细节请阅读 官方文档。