[pgsql-jp: 27895] メモリリークについて

I26391_Sugiura @ aisin-aw.co.jp I26391_Sugiura @ aisin-aw.co.jp
2002年 11月 8日 (金) 10:05:41 JST


はじめまして。
杉浦と申します。

最新案定版7.2.3を用いて、メモリリークの検証を行いました。
更新系のSQLを実行する度に、1M程度のメモリリークが発生し、
やがてフリーメモリを食いつぶす事がわかりました。
メモリリークの問題に対応する良い方法をご存知の方がいらっしゃいましたら
教えていただけないでしょうか?

postgres-7.2.3 メモリリーク検証

1.検証内容
レコード追加、レコード更新、レコード参照、レコード削除処理について
psqlを用いてSQLを実行し、サーバーリソース状況を確認する

2.検証環境
OS:  RedHat7.2
CPU: 1GHz(Pentium4)
Mem: 512M
HD:   30GHz
DB :  postgres-7.2.3tar.gz

3.検証方法

(1)下記SQLを実行してテーブルを作成
create table schedule (
        UNIQUECODE      serial,
        USER_NAME       text,
        USES            text,
        EFFECT          text,
        START_TIME      timestamp,
        END_TIME        timestamp
);

(2)レコード挿入
 (1)で作成したテーブルにレコード3000件を挿入し"vacuum schedule"を実行する
 レコード挿入+バキューム”の前後でサーバーリソースを確認する

(3)レコード更新
 (2)で挿入したレコードを3000件更新し"vacuum schedule"を実行する
 レコード更新+バキューム”の前後でサーバーリソースを確認する

(4)レコード参照
 (3)で更新したレコードの検索を実行する
 レコード参照の前後でサーバーリソースを確認する

(5)レコード削除
 (3)で更新したレコードを3000件削除し、"vacuum schedule"を実行する
 レコード削除+バキュームの前後でサーバーリソースを確認する

(6)上記(2)〜(5)を1000回連続して行い、処理前後のサーバーリソースを確認する

3.検証結果

(1).データ挿入時(insert)の検証結果

a.挿入前のサーバーリソース
1秒毎のリソースを5分間取得(vmstat 1)し、平均した値

   procs                    memory    swap          io     system
cpu
 r  b  w    swpd   free      buff     cache  si  so    bi    bo   in    cs
us  sy  id
 0  0  0      0    420136   3904   37912   0   0     0     0  127     8   0
0 100

b.SQL実行10分後のサーバーリソース
1秒毎のリソースを5分間取得(vmstat 1)し、平均した値

   procs                      memory    swap          io     system
cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy
id
 0  0  0      0 419028   3908  38992   0   0     0     0  127     6   0   0
92

◆約1Mバイトリークする

(2).データ更新時(update)の検証結果

a.挿入前のサーバーリソース
1秒毎のリソースを5分間取得(vmstat 1)し、平均した値

   procs                      memory    swap          io     system
cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy
id
 0  0  0      0 419028   3908  38992   0   0     0     0  127     6   0   0
100

b.SQL実行10分後のサーバーリソース
1秒毎のリソースを5分間取得(vmstat 1)し、平均した値

 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy
id
 0  0  0      0 417756   3908  40232   0   0     0     0  127     6   0   0
83

◆約1.5Mバイトリークする

(3).データ参照時(select)の検証結果

a.挿入前のサーバーリソース
1秒毎のリソースを5分間取得(vmstat 1)し、平均した値

   procs                      memory    swap          io     system
cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy
id
 0  0  0      0 417756   3908  40232   0   0     0     0  128    12   0   0
100

b.SQL実行10分後のサーバーリソース
1秒毎のリソースを5分間取得(vmstat 1)し、平均した値

   procs                      memory    swap          io     system
cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy
id
 0  0  0      0 417752   3908  40236   0   0     1     0  136    40   1   3
96

◆データ参照ではリークは見られない

(4).データ削除時(delete)の検証結果
1秒毎のリソースを5分間取得(vmstat 1)し、平均した値

   procs                      memory    swap          io     system
cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy
id
 0  0  0      0 417752   3908  40236   0   0     0     0  128    14   0   0
100

b.SQL実行10分後のサーバーリソース
1秒毎のリソースを5分間取得(vmstat 1)し、平均した値

   procs                      memory    swap          io     system
cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy
id
 0  0  0      0 417576   3908  40388   0   0     0     0  127    12   0   0
95

◆約200Kバイトリークする

(5).データの挿入、更新、参照、削除処理を1回とし、これを連続1000回行った場合
の検証結果
1秒毎のリソースを5分間取得(vmstat 1)し、平均した値

   procs                      memory    swap          io     system
cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy
id
 0  0  0      0 425164   3752  33276   0   0     0     0  130     7   0   0
100

b.SQL実行10分後のサーバーリソース
1秒毎のリソースを5分間取得(vmstat 1)し、平均した値

   procs                      memory    swap          io     system
cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy
id
 0  0  0      0  86532  46264 243432   0   0     0     0  127     8   0   0
100

◆約338Mバイトリークする


4.検証結果から

insert,update,select,deleteの一連の操作の中で、おおよそ2.7Kバイトのメモ
リリークが発生した。
また、挿入、更新、参照、削除の一連の処理を連続1000回行った結果、
338Mバイトのメモリリークが確認された。

データを更新するタイプのデータベースでは、insert,update,delete処理を行うた
びに
メモリリークが発生し、やがてサーバーのフリーメモリを全て使ってしまう。
postgres-7.2.3を用いたデータベースシステムでは、定期的にサーバーのリブート
を行わないと
サーバーのフリーメモリがなくなる為、DBサーバーに障害が発生すると予想され
る。

----
Hiroaki Sugiura







pgsql-jp メーリングリストの案内