-
2023-03-13 PostgreSQLPostgreSQL パラメータ
wal_buffers の効果を検証(1)
本記事では、PostgreSQL パラメータの wal_buffers について、その効果を検証いたしましたので、その結果をご報告したいと思います。
wal_buffers とは
PostgreSQL では、更新や削除などが発生した際に WAL レコードを WAL バッファと呼ばれるメモリ領域に書き込みます。
その後、コミットが行われると WAL バッファの内容を WAL ファイルに出力する仕組みとなっています。
共有バッファのサイズは wal_buffers というパラメータで制御されます。
公式ドキュメント( https://www.postgresql.jp/document/14/html/runtime-config-wal.html#GUC-WAL-BUFFERS )に
WALバッファの内容はトランザクションのコミット毎にディスクに書き込まれます。 したがって、極端に大きな値は有意な効果を期待できません。 しかし、この値を数メガバイトに設定することにより、多くのクライアントが同時にコミットするトラフィック量の多いサーバでは書き込み性能が向上します。 デフォルト設定の-1で選択される自動チューニングによると、ほとんどの場合妥当な結果が得られます。
と書いてあるとおり、wal_buffers には PostgreSQL が良しなにしてくれるという -1 を設定するのが一般的です。
実際に検証してみます
基本的には wal_buffers には -1 を設定するのがよいということですが、「-1 以外の設定値をした場合の性能への影響はどんな感じになるのか」という疑問が出てきました。
ということで実際に検証してみました。
環境は
- Ubuntu 22.04.1 LTS
- PostgreSQL 14.6
です。
検証手順
wal_buffers に -1, 2 MB, 4 MB, 8 MB, 16 MB, 32 MB, 64 MB, 128 MB, 512 MB をそれぞれ設定し、pgbench のテストスクリプトを実行しました。
pgbench のテストスクリプトを、クライアント数 1, 2, 10, 50 の 4 パターン実行して、その結果のレイテンシを比較しました。
具体的な pgbench のコマンドは下記のとおりです。
pgbench -t 10000 -c <クライアント数数>
※<コネクション数> には、1, 2, 10, 50 のいずれかが入ります。
また、クライアント数に比例してテストされるトランザクション数も増加します。
検証結果
検証結果は下記のとおりです。
- クライアント数ごとに wal_buffers を増加させたときのレイテンシの値を表しています。
- 横軸が wal_buffers です。
- 縦軸がレイテンシです。
- レイテンシなので、小さいほど性能がよいことを表します。
検証の結果から分かること
検証の結果から、wal_buffers の設定値によって、レイテンシ(性能)への影響は見られないということが分かりました。
また、テストのクライアント数(並列数)を上げても、wal_buffers による影響はなさそうです。
若干、意外な結果となりましたが、wal_buffers の設定値が性能へ影響を与えていない理由としては、pgbench テストスクリプトで発生する WAL レコードが少ないことが原因ではないかと推測しています。
以下が 公式ドキュメント( https://www.postgresql.jp/document/14/html/pgbench.html )の「pgbenchで実際に実行される「トランザクション」は何か?」に記載されている、pgbench のテストスクリプトで実行されるトランザクションの内容です。
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
END;
今回の検証で、「更新量の少ない UPDATE などでは、wal_buffers の影響は小さいため、wal_buffers には -1 を設定しておけば問題ない」ということが分かりました。
次回は、トランザクションの内容を変更して、WAL レコードの出力量と wal_buffers の効果の関係を検証してみたいと思います。
[2023/04/27]検証しました → wal_buffers の効果を検証(2)