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 }