Greenplum PostgreSQL –enable-profiling 产生gprof性能诊断代码

1 minute read

背景

为了诊断软件的性能瓶颈,在GCC编译的代码中,有-pg开关可以用来产生额外的性能诊断数据,例如每个FUNC的调用次数,时间等。

用来判断软件的性能瓶颈在什么地方最好不过了。

除此之外,我们还可以使用perf top命令来观察整个系统当时的瓶颈。

gprof使用方法

Greenplum或PostgreSQL的编译配置文件中有一个选项是 –enable-profiling,这个选项会打开GCC的-pg参数。产生可以被gprof用于分析进程的代码。

如下:

less configure  
# enable profiling if --enable-profiling  
if test "$enable_profiling" = yes && test "$ac_cv_prog_cc_g" = yes; then  
  if test "$GCC" = yes; then  
  
$as_echo "#define PROFILE_PID_DIR 1" >>confdefs.h  
  
    CFLAGS="$CFLAGS -pg $PLATFORM_PROFILE_FLAGS"  
  else  
    as_fn_error $? "--enable-profiling is supported only when using GCC" "$LINENO" 5  
  fi  
fi  
  
less src/template/linux  
# If --enable-profiling is specified, we need -DLINUX_PROFILE  
PLATFORM_PROFILE_FLAGS="-DLINUX_PROFILE"  

man gcc

  -pg 
       Generate extra code to write profile information suitable for the analysis program gprof.  
       You must use this option when compiling the source files you want data about, and you must also use it when linking.  

诊断代码被放在$PGDATA/gprof目录中,每个进程结束后,都会产生一个子目录,里面会有一个gmon.out文件。

查看gmon.out文件的信息:

#gprof -b /home/digoal/gpdb/bin/postgres gmon.out  

Flat profile:  
Each sample counts as 0.01 seconds.  
  %   cumulative   self              self     total             
 time   seconds   seconds    calls  ms/call  ms/call  name      
 80.00      0.04     0.04       91     0.44     0.44  FileRepVerify_ComputeFileHash  
 20.00      0.05     0.01        1    10.00    10.00  ChangeTracking_WriteBuffer  
  0.00      0.05     0.00   750562     0.00     0.00  ChangeTracking_GetRelationChangeInfoFromXlog  
  0.00      0.05     0.00   670756     0.00     0.00  cdbpullup_colIdx  
  0.00      0.05     0.00   253200     0.00     0.00  cdbpullup_isExprCoveredByTargetlist  
  0.00      0.05     0.00   239413     0.00     0.00  cdbpullup_targetlist  
......  

有点类似oprofile的输出。

gprof的用法可以参考man gprof。

例子

1. 使用–enable-profiling开关编译PostgreSQL

2. 启动数据库

3. 开启benchmark

4. 停库

5. 到$PGDATA/gprof对应进程目录查看

gprof -b /home/digoal/pgsql9.6/bin/postgres gmon.out |less

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 78.74      7.74     7.74                             WalSndLastCycleHandler
  2.44      7.98     0.24  2191663     0.00     0.00  SetLatch
  1.53      8.13     0.15  2945948     0.00     0.00  SyncRepWakeQueue
  1.42      8.27     0.14  1672294     0.00     0.00  LWLockRelease
  1.32      8.40     0.13  1190773     0.00     0.00  ProcessRepliesIfAny
  1.22      8.52     0.12  1672294     0.00     0.00  LWLockAcquire
  1.22      8.64     0.12  1672211     0.00     0.00  SyncRepReleaseWaiters
  1.02      8.74     0.10  1190741     0.00     0.00  GetFlushRecPtr
  0.92      8.83     0.09  1190739     0.00     0.00  XLogSendPhysical

Flag Counter

digoal’s 大量PostgreSQL文章入口