PostgreSQLプロセスの実行優先度を制御する方法のひとつに、pg_cheat_funcsが提供するscheduling_priorityパラメータがある。今回は、このパラメータによるPostgreSQL上での優先制御の効果を確認する。
scheduling_priorityは、pg_cheat_funcsが提供するパラメータで、PostgreSQLプロセスの優先度(nice値)を指定する。この優先度は、SET文でセッション単位やALTER ROLE SET文でユーザ単位など、様々な単位で設定できる。scheduling_priorityの詳細については、pg_cheat_funcsのREADMEを参照すること。
優先制御の効果の確認では、以下2つの測定パターンにおけるpgbenchの測定結果を比較する。
- 優先度が同じであるユーザfoo1とfoo2のそれぞれで同時にpgbenchを実行する
- foo1とfoo2の優先度が同じであることから、それぞれのpgbenchの測定結果は同程度となることが推測される。
- ユーザfoo2の優先度を下げて、優先度が異なるユーザfoo1とfoo2のそれぞれで同時にpgbenchを実行する
- foo1がfoo2より優先度が高いことから、pgbenchの測定結果は、foo2よりfoo1のほうが高性能となることが推測される。
pg_cheat_funcsの導入
## pg_cheat_funcsをインストール
$ wget --no-check-certificate https://github.com/MasaoFujii/pg_cheat_funcs/archive/master.zip
$ unzip master
$ rm -f master
$ cd pg_cheat_funcs-master
$ make USE_PGXS=1 PG_CONFIG=/opt/pgsql-X.Y.Z/bin/pg_config
$ make USE_PGXS=1 PG_CONFIG=/opt/pgsql-X.Y.Z/bin/pg_config install
## pg_cheat_funcsをPostgreSQLがロードするようにパラメータ設定
$ emacs $PGDATA/postgresql.conf
shared_preload_libraries = 'pg_cheat_funcs'
## 設定変更を有効化するためPostgreSQL再起動
$ pg_ctl -D $PGDATA restart
測定準備
## ユーザfoo1とfoo2の作成
$ createuser -s foo1
$ createuser -s foo2
## pgbench初期データの作成
$ pgbench -i -s100
$ psql -c "VACUUM ANALYZE"
$ psql -c "CHECKPOINT"
測定パターン1の実施
## ユーザfoo1とfoo2で同時にpgbenchを実行
### foo1とfoo2の優先度はデフォルトの0のまま
$ pgbench -c 4 -j 4 -T 30 -n -S -U foo1 postgres &
$ pgbench -c 4 -j 4 -T 30 -n -S -U foo2 postgres &
測定パターン2の実施
## ユーザfoo2の優先度を最低の19に設定
### foo1の優先度はデフォルトの0のまま
$ psql -c "ALTER ROLE foo2 SET pg_cheat_funcs.scheduling_priority TO 19"
## ユーザfoo1とfoo2で同時にpgbenchを実行
$ pgbench -c 4 -j 4 -T 30 -n -S -U foo1 postgres &
$ pgbench -c 4 -j 4 -T 30 -n -S -U foo2 postgres &
測定結果
測定パターン1
優先度が同じであるfoo1とfoo2では、pgbenchの測定結果が同程度となった。
ユーザ | 優先度 | トランザクション処理件数 | 平均レイテンシ(ms) | スループット(tps) |
---|---|---|---|---|
foo1 | 0 | 247,870 | 0.488 | 8,195.2 |
foo2 | 0 | 248,460 | 0.487 | 8,214.3 |
測定パターン2
優先度が高いfoo1のpgbenchの測定結果のほうがfoo2より高性能となった。
ユーザ | 優先度 | トランザクション処理件数 | 平均レイテンシ(ms) | スループット(tps) |
---|---|---|---|---|
foo1 | 0 | 356,837 | 0.336 | 11,894.1 |
foo2 | 19 | 136,564 | 0.879 | 4,551.3 |
まとめ
今回の測定パターンのような条件であれば、pg_cheat_funcsのscheduling_priorityパラメータを使うことで、PostgreSQL上での優先制御をある程度期待できる。