Postgresのログに下記のようにcheckpoint_segmentsに関するものが出ていたので checkpoint_segmentsの値をデフォルトの3から64に増やしたところ
データベースへの書き込みが含まれるベンチマークでは10倍以上のパフォーマンスアップが確認できました。
書き込みの発生しないselect文のみのベンチマークでは変わりはありませんでした。これはメモリに全部乗っかっている為だと思われます。
更新が多く、I/Owaitが発生するような環境では、checkpoint_segmentsの値を増やしてやると劇的にパフォーマンスが改善する事が期待できるかと思います。
[2015-07-17 16:17:33 JST][1991][][] LOG: checkpoints are occurring too frequently (27 seconds apart)
[2015-07-17 16:17:33 JST][1991][][] HINT: Consider increasing the configuration parameter “checkpoint_segments”.
環境
OS:Centos6.4
PostgreSQL9.1.18
CPU:Intel Xeon E5-2609V3 1.9G(6Core)
memory:32GB
試験方法
pgbench用に1000万件のレコードを作成して初期化
createdb test
pgbench -i -s100 test -s100が1000万件指定
同時接続10且つ1000トランザクションで試験。各5回計測
$ pgbench -c 10 -t 1000 test
TPS | リソース状態 | ||||||||
1 | 2 | 3 | 4 | 5 | avg | CPU | I/O wait | %util | |
(shared_buffers = 8GB) checkpoint_segments = 3 (default) | 220 | 208 | 234 | 220 | 218 | 220 | 1% | 30%前後 | 100% |
(shared_buffers = 2GB) checkpoint_segments = 64 | 3685 | 3749 | 3751 | 3734 | 3786 | 3741 | 18% | 1%前後 | 40% |
(shared_buffers = 8GB) checkpoint_segments = 64 | 3647 | 3661 | 3712 | 3754 | 3726 | 3700 | 30% | 1%前後 | 38% |
selectのみ実行した場合(同時接続数100且つ10000トランザクションで試験)
$ pgbench -c 100 -t 10000 -S test
TPS | リソース状態 | ||||||||
1 | 2 | 3 | 4 | 5 | avg | CPU | I/O wait | %util | |
(shared_buffers = 8GB) checkpoint_segments = 3 (default) | 39094 | 38450 | 38649 | 38492 | 38633 | 38664 | 75% | 5%前後 | 0.1% |
(shared_buffers = 2GB) checkpoint_segments = 64 | 38544 | 38580 | 38847 | 38601 | 38172 | 38549 | 75% | 0%前後 | 0.1% |
(shared_buffers = 8GB) checkpoint_segments = 64 | 39111 | 38698 | 38136 | 38704 | 38612 | 38652 | 75% | 0%前後 | 0.1% |