[pgsql-jp: 41132] Re: ■質問■PostgresSQLのディスク使用量の増える仕組みについて

MauMau maumau307 @ gmail.com
2012年 6月 14日 (木) 19:12:41 JST


渡辺さん


MauMauといいます。

> 2.または3.の時点でDBファイルに書込み領域が無い場合は即座に
> DBファイルのサイズを8kbの倍数サイズ増やしてデータが書き込まれるのでしょうか?

はい、それに近いです。
PostgreSQLは、追加しようとするタプルがデータファイルに入らない場合、
データファイルを8KBずつ拡張します。
そのとき、バックエンドが0で埋められた8KBのページを、
データファイルの末尾に書き出します。これが渡辺さんが経験されたことでしょう。
その後、共有バッファ上でその新しいページにタプルが追加されていきます。
そして、チェックポイントなどのタイミングでそのページがディスクに書き出され、
先ほど書き出したゼロ詰めページを上書きします。
このゼロ詰めされたページの書き出しは、PostgreSQLの(よくないかもしれない)特徴です。
この書き出しをなくすことはできません。
# Oracleなどのように、事前にデータファイルを拡張しておけるとよいのですが。

> だとすれば、WALログが実際にDBファイルに反映するデータはチェックポイント実行前の
> 8kb未満のデータしかないように思えるのですが。。。

すみません、こちらはわかりませんでした。

以上です。

----- Original Message ----- 
From: "S.Watanabe" <sywatanabe @ iwass.co.jp>
To: <pgsql-jp @ ml.postgresql.jp>
Sent: Thursday, June 14, 2012 4:21 PM
Subject: [pgsql-jp: 41131]■質問■PostgresSQLのディスク使用量の増える仕組みについて


> 渡辺と申します。
>
> PostgreSQL(Ver.8.3.1)のDBファイル(base/nnnnn/配下のテーブル等のデータを含む
> ファイル)が
> 何を契機に増えているのか調べています。
>
> 過去メール※は参照しましたが、いまひとつ理解できていません。
>
> 私の理解では、以下のようなものです。
> 1.クライアントからデータ追加要求を受信
> 2.PostgreSQLサーバの共有バッファにデータが追加
> 3.WALログにデータが追加
> 4.以下のいづれかでDBファイルが更新
>  1)CHECKPOINTコマンド実行時
>  2)サーバ停止時(pg_cnt -D DBクラスタパス stop)
>  3)checkpoint_timeoutで指定した時間が経過
>  4)WALログがcheckpoint_segmentsで指定した個数以上に達した時
>
> しかし、int型5つからなるレコードを1レコード追加した時は、
> 上記4.3)でDBファイルが更新されますが、100レコード追加した場合は、
> 即座にDBファイルの更新時刻とサイズが変化していました。
> 更新前後ではWALログは1つしかない状態でした。
> また設定は非同期書込みで、バックグラウンドライタやバキュームは停止させています。
>
> これはどういう要因で更新されているのでしょうか?
> 2.または3.の時点でDBファイルに書込み領域が無い場合は即座に
> DBファイルのサイズを8kbの倍数サイズ増やしてデータが書き込まれるのでしょうか?
> だとすれば、WALログが実際にDBファイルに反映するデータはチェックポイント実行前の
> 8kb未満のデータしかないように思えるのですが。。。
>
>
> 動作させた時の設定は以下の通りです。
> ■設定
>  fsync = off
>  synchronous_commit = off
>  full_page_writes = off
>  checkpoint_segments = 3
>  checkpoint_timeout = 1h
>  checkpoint_completion_target = 0.5
>  bgwriter_lru_maxpages = 0
>  autovacuum = off
>  track_counts = off
>  shared_buffers = 24MB
>



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