LoginSignup
7
2

More than 5 years have passed since last update.

PostgreSQLで優先制御

Posted at

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の測定結果を比較する。

  1. 優先度が同じであるユーザfoo1とfoo2のそれぞれで同時にpgbenchを実行する
    • foo1とfoo2の優先度が同じであることから、それぞれのpgbenchの測定結果は同程度となることが推測される。
  2. ユーザ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上での優先制御をある程度期待できる。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2