osg*_*sgx 5

oprofile更准确;它使用 CPU 性能监控(内置硬件监控,具有 100 个性能事件);

和 google-perftools libprofiler.so 使用setitimer- 操作系统内核的 intreval 计时器:

$ nm -D libprofiler.so | grep timer
     U getitimer
     U setitimer
Run Code Online (Sandbox Code Playgroud)

间隔计时器是由操作系统模拟的,据我所知,它不能超过HZ(每秒100次或每秒1000次或300或250)。我刚刚尝试了 10000 和 100000,但有效率为 1000(程序运行时间为 2 秒,并且 cpu profiler 从 google 收集到的样本只有约 2000 个)。这是我的HZ:

$ zgrep HZ= /proc/config.gz
CONFIG_HZ=1000
Run Code Online (Sandbox Code Playgroud)

不知道这在无滴答内核上如何工作。

反过来,oprofile 使用 CPU 中的特殊硬件,该硬件的精确度可达几个刻度。它可以在 CPU 每 100000 次或 1000000 次滴答时测量程序的位置,并且该值与操作系统 HZ 设置无关。此外,它不仅可以分析 CPU 的每个 N 个时钟周期,还可以分析每个 N 个 L2 缓存未命中或每个 N 个jmp错误预测等等......在 Pentium Pro 之后的任何 CPU 中都有数百个硬件性能事件。

oprofile 的另一个更好的方面是它可以分析任何内容,任何用户应用程序或所有用户应用程序或内核和每个应用程序。

但 oprofile 需要 root 才能使用它(AFAIK),如果使用错误,它可能会冻结您的系统;它需要在内核中启用(当内核构建时)。

google-perftools 更好的一面是:易于使用;良好的绘图和分析能力;无需 root 即可工作。另外,google-perftools 中有一个很好的堆分析器。

oprofile 和 google-perftools/cpuprofiler:

  • 不需要重新编译应用程序(就像 gprof/gcov 需要的那样)
  • 可以绘制部分调用图(就像在 kcachegind 中完成的那样,例如1 2;pprof 甚至可以通过 kcachegrind 使用callgrindcommand 进行绘制)
  • 将测量真实的配置文件(不是像 kcachegrind/callgrind/其他基于 valgrind 的模拟配置文件)
  • 便携式(oprofile 需要 CPU 的支持,但它适用于 intel/amd/via/manyarms;perftools 将在任何可以获取调用堆栈并要求操作系统安装 setitimer 的地方工作)

  • 而 `perf` (perf_events) linux profiler 与 oprofile 一样准确(但更方便),并且也使用硬件性能监控单元:https://perf.wiki.kernel.org/index.php/Tutorial http://www.perf.wiki.kernel.org/index.php/Tutorial brendangregg.com/perf.html (2认同)