« Fillfactorの設定値 | トップページ | で、fillfactor、autovacuumパラメータの設定方法 »

2014.02.03

autovacuum関連のパラメータ設定

連投でPostgreSQL関連のエントリー。
Autovacuumが実装されて以来、PostgreSQLについては定時VACUUMはあまり頭を悩まさなくて良いことになってきている。
実際、PostgreSQLのオフィシャル布告としてはAUTO推奨で、定期実行などはあまりすべきではない、という推奨状態になっている。
これは正しいのだが、すべてをデフォルトのまま利用していいかというと、必ずしもそういうわけではない。

AUTOVACUUMが稼動するのは次の条件に当てはまった場合。
-Dead Tupleがデータ領域の一定割合を超えた場合(autovacuum_vacuum_scale_factor)
-Dead Tupleが各テーブルで定められた閾値を超えた場合(autovacuum_vacuum_threshold)
AUTOVACUUMデーモンが一定間隔でこれらの状況を監視し、ロック競合が発生しない限り、一定数量のAUTOVACUUM処理が実行される。

まずはautovacuum_vacuum_scale_factorから考えてみる。
こちらのデフォルトは20%になっている。乱暴に書けば10万行のテーブルの場合2万行以上が回収必要になった場合に、自動バキュームが実行される。
HOT更新が多ければ、Dead Tupleになる量も減るので、HOTの回数が大きければ、バキュームの必要性も減少する算段だ。(HOT更新の設定については→[fillfactorの設定値]もご参照のこと)
この20%というパラメータが不適切なのは下記の場合。

  • すでにテーブル内の行数が多すぎて、数日間のDead Tupleの発生量に対して、AUTOVACUUMの実行頻度が低すぎる

  • なんでこんなことが発生するかの一例として、システム移行をしたケースが該当した。
    1日あたりのDead Tupleの発生件数は数万行というテーブルであったが、最初に構築した時点で3000万行のデータが格納されており、こちらの期待値としては毎日VACUUMして欲しかったのだが、1ヶ月に1回程度しかVACUUMされない状況になっていて、容量は食うは、たまにVACUUMが走ると時間がかかるわで「想定外」といった状況になってしまった。

    続いてautovacuum_vacuum_thresholdについて。
    実際にVACUUM対象となるのは
     threshold行数 + (scall_factor * 行数)
    になるので、こちらの閾値行数は特にテーブルの行数が少ない場合に発動する可能性がある。
    というかscale_factorだけに任せていると、5行しかないテーブルは1行更新しただけでバキューム対象となるという忙しいこととなるため、最低でもこの行数発生しないとバキュームしないよ。というのがautovacuum_vacuum_thresholdの役割である。

    こちらのパラメータを調整する必要があるのは次のケース。

  • Tuple数が多くないのに、1日に何回もAuto Vacuumされている

  • 行数が少ないテーブルであればHOT更新が充分機能しているのか、というのを確認したうえで必要に応じてこちらのautovacuum_vacuum_thresholdの値を大きくする、という措置が必要になる。
    極端なケースであるが10分ごとにバキューム処理が走るテーブルというものも、設定によっては発生しうる。
    もちろん、上記のようなケースであれば回収しなくてはいけないDead Tupleは少ないので、処理時間としては短いのであるが、要はバランスである。あんまり頻繁にAUTO VACUUMするのもよろしくない。
    そこでこのthoresholdの値を大きくして、50%以上のdead tuple発生でもバキュームしないように、といった調整を行うような感じだろうか。

    VACUUM処理は闇雲に実行すればいいというものでもないので、基本は自動実行に任せる、という方針が間違いなく正しいだろう。
    人為的に設定したバキューム周期は、ビジネス変化などによって初期のトランザクション挙動から逸脱していった場合に、思わぬトラブルの種になりうるからだ。
    とはいえ自動設定ももちろん万能ではないので、この辺注意が必要ということで。

    |

    « Fillfactorの設定値 | トップページ | で、fillfactor、autovacuumパラメータの設定方法 »

    コメント

    コメントを書く



    (ウェブ上には掲載しません)




    トラックバック

    この記事のトラックバックURL:
    http://app.cocolog-nifty.com/t/trackback/2022/59063052

    この記事へのトラックバック一覧です: autovacuum関連のパラメータ設定:

    « Fillfactorの設定値 | トップページ | で、fillfactor、autovacuumパラメータの設定方法 »