使用 OProfile 进行性能分析

来自 PostgreSQL 维基
跳转到导航跳转到搜索

OProfile 是一个适用于 Linux 的操作系统级性能分析器,它可以给出对 PostgreSQL 进行性能分析的有用结果。

初始设置

这只需要在每次系统启动时完成一次

 sudo opcontrol --init
 sudo opcontrol --setup --no-vmlinux

虽然您可以重新发出 --setup 命令来更改性能分析选项。

如果您需要了解内核正在做什么的详细信息,请获取内核的调试符号;然后设置命令看起来像这样

sudo opcontrol --setup --vmlinux=/usr/lib/debug/lib/modules/`uname -r`/vmlinux

--setup 命令还有许多其他选项,但在一般情况下您不需要它们。

虚拟机设置

如果您使用的是虚拟机,您可能需要让 oprofile 使用计时器,而不是尝试使用可能不可用的硬件性能计数器。您可以通过关闭正在运行的 oprofile 并执行以下操作来动态地做到这一点

 sudo opcontrol --deinit
 sudo modprobe oprofile timer=1

您可以通过向 /etc/modprobe.d(至少在 Fedora 上)添加一个名为 oprofile.conf 的文件来使此设置永久生效,该文件包含以下内容

 options oprofile timer=1

启动/停止性能分析

 sudo opcontrol --start
 sudo opcontrol --reset
 ... exercise your debug-enabled program here ...
 sudo opcontrol --dump ; sudo opcontrol --shutdown

测试用例至少应该运行一两分钟,才能获得具有合理精度的数字。

分析

 opreport --long-filenames | more
 opreport -l image:/path/to/postgres | more

如果您真的需要详细信息

 opannotate --source /path/to/postgres >someplace

--reset 命令会将这些程序报告的统计信息归零,因此请确保在运行另一个测试用例之前保存您想要的结果。此外,修改要分析的程序会使它的统计信息失效。

其他分析

从 oprofile 获取调用图信息可以提供有关正在使用的库的更多详细信息,包括使用常见的 libc 库调用。虽然它不会直接告诉你正在调用 libc 中的哪个函数,但你会看到这些调用的来源,这通常足以猜测 libc 函数是什么。

重要:要获取有用的调用图信息,您必须使用 -fno-omit-frame-pointer 编译。

您还可以使用像 http://roberts.vorpus.org/~njs/op2calltree.py 这样的脚本将包括调用图在内的 oprofile 数据导入到 kcachegrind 中,这 *非常* 有帮助。

解释结果

一个很好的例子展示了如何使用 oprofile 的结果来帮助做出与性能相关的编码决策,请参阅 oprofile 结果用于统计收集器测试

其他替代方案

由于 gprof 的一些限制,OProfile 比 gprof 更受欢迎。

另一种可能性是使用 valgrind 进行性能分析;示例用法

较新的 Linux 系统(内核 2.6.31 及更高版本)可以使用 perf 工具。

安装软件

OProfile 是否正常工作,很大程度上取决于您的 Linux 发行版是如何打包的。根据 Unladen-swallow 项目,"Debian Sid 和 Ubuntu Hardy、Jaunty、Karmic 和 Lucid 中的 oProfile 包都存在问题",并在那里建议了一个备用包,可以用来替换系统包。Debian Squeeze 应该有一个可用的版本,如使用该程序的良好 Ceph 教程 所示。您需要 linux-image-debug 包来追踪到内核,当该包可用时,您就可以在没有 "--no-vmlinux" 标志的情况下启动程序。