为了分析服务性能瓶颈,今次我们计划用 gperftools 当中的 CPU Profiler 来打印服务当中的性能热点。按官网介绍,以下三种方式之一,可开启 CPU Profiler。
- 运行时,用
LD_PRELOAD环境变量加载 CPU Profiler 的共享对象(动态库)。例如env LD_PRELOAD="/usr/lib/libprofiler.so" /path/to/elf_bin。 - 链接时,加上
-lprofiler(或者-ltcmalloc_and_profiler,如果还需要 TCMalloc 的话),而后在运行时通过env CPUPROFILE=foo.prof /path/to/elf_bin将性能分析文件写入foo.prof。 - 在加上链接参数
-lprofiler的基础上,在代码内引入头文件#include <gperftools/profiler.h>,而后在需要分析性能的代码块前后加上ProfilerStart("/path/to/foo.prof")及ProfilerStop()。
这里 (1) 不需要重新编译,但是一看就很山寨;(3) 在分析特定代码片块的性能时很有效,但在意图分析整个程序的性能时就很鸡肋。目光集中在 (2) 上面。
尝试 (2) 时,遇到一个问题。不管如何设置 CPUPROFILE,程序都不会将性能分析文件转储出来。