gperftools应用

gperftools应用

需求

  • 因线上玩家反馈游戏存在卡顿问题,而当前可供分析的服务器性能相关的数据较少,故尝试引入gperftools中的CPU profiler来分析统计游戏服务的CPU性能

gperftools简介

  • gperftools是Google提供的一套工具包,其中的一个功能是CPU profiler,用于分析程序性能,找到程序的性能瓶颈;
  • 这个工具是用系统定时器定时产生信号的方式,在信号处理函数里面获取当前的调用堆栈来确定当前落在哪个函数里面的。获取频率默认是每10ms采样一次,参数是可调的,但是最大频率是4000,也就是支持的最小采样间隔是250微秒;
  • 这个工具获取到的性能数据是基于统计数据的,也就是他并不真正跟踪函数的每一次调用过程,而是均匀地采样并记录采样点所落在的函数调用位置,用这些统计数据来计算每个函数的执行时间占比。这个数据并不是准确的数据,但是只要运行时间相对比较长,统计数据还是能比较准确地说明问题的;
  • 工具不工作的时候,就会把系统定时器取消掉,不会定时产生中断信号,不会触发中断处理程序,所以对运行程序的影响真的是很小,运行效率上可以说完全没有影响。而对产品的影响只是多占用一些链接profiler库的内存而已(有待实测)

系统要求

  • linux系统

gperftools安装

  • 注意:工具编译对gcc有版本要求,不要太低

安装libunwind

  • 如果是64位系统,需要先下载安装libunwind
    libunwind-1.5.0.tar.gz
  • tar -xzvf libunwind-1.5.0.tar.gz
    cd libunwind-1.5.0
    ./configure
    make
    make install
    

安装gperftools

gperftools-2.9.1.tar.gz

tar -xzvf gperftools-2.9.1.tar.gz
cd gperftools-2.9.1
./configure
make
make install

CPU profiler使用

包含头文件

  • include <gperftools/profiler.h>

编译链接库

  • 编译时添加 -lprofiler

相关函数

开启监测

  • ProfilerStart(“test.prof”)
  • 参数为监测数据保存的文件

关闭监测

  • ProfilerStop()
  • 执行ProfilerStop()的时候就生成测试报告test.prof

使用方法

方案一

  • 在程序入口添加ProfilerStart和ProfilerStop,将执行内容包含起来,即分别添加在main函数的头尾处(return前),程序执行结束就生成测试报告;
  • 比较死板,必须等程序运行结束才能生成报告,不适用于持续运行的程序

方案二

  • 通过捕捉新号或其他方式来开启关闭监测,如给程序发送一个信号A,程序收到后执行ProfilerStart,并记录状态,下次再发送新号A,程序根据状态判断执行ProfilerStart还是ProfilerStop

结果查看

  • 使用gperftools提供的pprof工具转换.prof文件为可阅读的形式,支持多种形式

    文本形式

  • 执行 pprof proc test.prof —text > test.txt (proc为可执行程序)

每行包含6列数据,依次为:
1.分析样本数量(不包含其他函数调用)
2.分析样本百分比(不包含其他函数调用)
3.目前为止的分析样本百分比(不包含其他函数调用)
4.分析样本数量(包含其他函数调用, 相当于消耗的CPU时间)
5.分析样本百分比(包含其他函数调用)
6.函数名

pdf形式

  • 执行 pprof proc test.prof —pdf > test.pdf

三国杀海外测试服尝试

  • 通过发送信号SIGURE1来控制;