性能分析工具(一)——gprof

@(性能分析)

1.1 简介

gprof实际上只是一个用于读取profile结果文件的工具。gprof采用混合方法来收集程序的统计信息,他使用检测方法,在编译过程中在函数入口处插入计数器用于收集每个函数的被调用情况和被调用次数;也使用采样方法,在运行时按一定间隔去检查程序计数器并在分析时找出程序计数器对应的函数来统计函数占用的时间。

优点:
GNU工具,人手一个;
混合方法采集信息。

缺点:

  • 需要编译选项支持:
    • 使用gcc/cc编译和链接时需要加入-pg选项
    • 使用ld链接时需要用/lib/gcrt0.o代替crt0.o作为第一个input文件
    • 如果要调试libc库需要使用-lc_p代替-lc参数
  • 调试多线程程序只能统计主线程的信息(所以不能用于kingbase)。

1.2 使用方法

1.2.1 编译程序

  1. 使用gcc/cc编译和链接时需要加入-pg选项
  2. 使用ld链接时需要用/lib/gcrt0.o代替crt0.o作为第一个input文件
  3. 如果要调试libc库需要使用-lc_p代替-lc参数

1.2.2 运行程序生成统计信息

正常运行编译好的程序,程序正常结束后会在当前目录生成统计信息文件gmon.out。
程序必须正常退出(调用exit或从main中返回)才能生成统计信息。
当前目录下如果有另外叫gmon.out的文件,内容将被本次运行生成的统计信息覆盖,多次运行统一程序请将前一次的gmon.out改名。

1.2.3 使用gprof查看统计结果

命令格式:

1
gprof options [executable-file [profile-data-files...]] [> outfile]

常用参数介绍:
symspec表示需要加入或排除的函数名,和gdb指定断点时的格式相同。

1.2.4 gprof产生的信息解析

表格项 解释
%time 函数使用时间占所有时间的百分比。
cumulative seconds 函数和上列函数累计执行的时间。
self seconds 函数本身所执行的时间。
calls 函数被调用的次数
self ms/call 每一次调用花费在函数的时间microseconds。
total ms/call 每一次调用,花费在函数及其衍生函数的平均时间microseconds。
name 函数名

1.3 实践:使用gprof分析mysql性能

  1. cmake时候添加-DENABLE_GPROF=1(在5.6.6版本后支持,不要开启debug选项,会导致分析无效,且只用于linux版本的mysql)
  2. 收集gprof数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 在mysql server的目录下
    pwd
    ./bin/mysqld

    # 在mysql client的目录下
    pwd
    ./bin/mysql
    mysql> exit

    $ ./bin/mysqladmin shut -uroot

    # 正常关闭后会生成gmon.out文件
  3. 生成gprof data
    对于client:
    gprof data 生成在client启动的路径下

1
gprof ./bin/mysql gmon.out > gprof_client.data

对于server:
gprof data 生成在data路径下

1
gprof ./bin/mysqld ./data/gmon.out > gprof_server.data