2012年6月14日

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

渡辺さん


MauMauといいます。

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

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

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

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

以上です。

----- Original Message -----
From: "S.Watanabe" <sywatanabe@xxxxx>
To: <pgsql-jp@xxxxx>
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
>


投稿者 xml-rpc : 2012年6月14日 19:12
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/110828
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。