19. valgrind で PostgreSQL のメモリリークをみつけよう - PostgreSQL のソースコードを読む

再インストール

apt-get で入れた valgrind は古かったのでソースから入れ直した。

余計なメッセージの抑制

PostgreSQL の起動時に

==27617== 32 bytes in 1 blocks are still reachable in loss record 3 of 15
==27617==    at 0x4C265AE: malloc (vg_replace_malloc.c:207)
==27617==    by 0x724982: save_ps_display_args (ps_status.c:188)
==27617==    by 0x59369D: main (main.c:79)

というエラー報告がでる。今回の調査ではこれは許容範囲として出力して欲しくないので抑制しよう。


$PREFIX/lib/valgrind/default.supp に抑制ファイルのお手本があるので、postgres.supp を作る。

{
   Ignore save_ps_display_args's leak
   Memcheck:Leak
   fun:malloc
   fun:save_ps_display_args
}

このファイルを valgrind 起動時に --suppressions= オプションで指定してやれば良い。

% valgrind --leak-check=full \
     --suppressions=/home/taro/higepon/valgrind/postgres.supp \
     /tmp/local/bin/postgres -D /tmp/data 2>&1|less

準備

テストでは

  1. PostgreSQL 起動
  2. psqlで接続
  3. コマンドを発行(*)
  4. psql exit
  5. PostgreSQL 停止

を繰り返す。
(*) でマークされた所以外は、毎テストで共通。その共通箇所で吐かれる valgrind のメッセージは無視したい。
postgres.supp は以下のようになった。 ... というワイルドカードがうまく効かないので少し冗長。

{  
   Ignore save_ps_display_args's leak
   Memcheck:Leak
   fun:malloc
   fun:save_ps_display_args
}   
{  
   Ignore on start up 1
   Memcheck:Leak
   fun:malloc
   obj:/lib*/libc-*.so
   fun:set_pglocale_pgservice
}   
{  
   psql just connect
   Memcheck:Param
   write(buf)
   fun:write
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   fun:*
   fun:write_relcache_init_file
}   
{  
   psql just connect2
   Memcheck:Param
   write(buf)
   fun:write
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   fun:*
   fun:*
   fun:write_relcache_init_file
}   
{  
   psql just connect3
   Memcheck:Param
   socketcall.sendto(msg)
   fun:send
   fun:pgstat_send
   fun:*
}   
{  
   psql shutdown1
   Memcheck:Value8
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   fun:XLogInsert
}   
{  
   psql shutdown2
   Memcheck:Cond
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   fun:XLogInsert
}   
{  
   psql shutdown3
   Memcheck:Cond
   obj:/lib*/libc-*.so
   obj:/lib*/libc-*.so
   fun:XLogInsert
}