我找到了两个很棒的分析器:
有没有人试过他们两个?哪个更好?
oprofile 更准确;它使用 CPU 性能监控(内置硬件监控,包含 100 多个性能事件);
和 google-perftools libprofiler.so 使用setitimer
- 操作系统内核的 intreval 计时器:
$ nm -D libprofiler.so | grep timer
U getitimer
U setitimer
间隔计时器由操作系统模拟,它不能超过HZ
,据我所知(每秒 100 次或每秒 1000 次或 300 或 250)。我刚刚尝试了 10000 和 100000,但有效率为 1000(程序的运行时间为 2 秒,cpu profiler 从谷歌收集的样本只有约 2000 个)。这是我的HZ:
$ zgrep HZ= /proc/config.gz
CONFIG_HZ=1000
不知道这将如何在无滴答内核上工作。
反过来,oprofile 使用 CPU 中的特殊硬件,该硬件可以精确到几个刻度。它可以在每 100000 或 1000000 个 CPU 滴答声中测量您的程序所在的位置,并且该值与 OS HZ 设置无关。此外,它不仅可以分析 CPU 的每 N 个滴答声,还可以分析每 N 个 L2 缓存未命中或每 N 个jmp
错误预测等等......在 Pentium Pro 之后的任何 CPU 中都有数百个硬件性能事件.
oprofile 另一个更好的方面是它可以分析任何东西,任何用户应用程序或所有用户应用程序或内核以及每个应用程序。
但是 oprofile 需要 root 才能使用它(AFAIK),它可以用错误的用法冻结你的系统;它需要在内核中启用(构建内核时)。
google-perftools 更好的一面是:易于使用;良好的绘图和分析能力;无需root即可工作。此外,google-perftools 中有一个很好的堆分析器。
oprofile 和 google-perftools/cpuprofiler: