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
準備
テストでは
- PostgreSQL 起動
- psqlで接続
- コマンドを発行(*)
- psql exit
- 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
}