在PostgreSQL中进行优先控制
我們可以通過一種方法來控制PostgreSQL進程的執行優先級,即使用pg_cheat_funcs提供的scheduling_priority參數。本次旨在確認這個參數在PostgreSQL中對優先級控制的效果。
调度优先级是pg_cheat_funcs提供的一个参数,用于指定PostgreSQL进程的优先级(nice值)。可以在会话级别的SET语句或用户级别的ALTER ROLE SET语句中以不同的单位进行设置。有关scheduling_priority的详细信息,请参阅pg_cheat_funcs的README。
在确认优先控制效果时,需要比较以下两种测量模式下的pgbench测量结果。
-
- 只需要一种选择的释义:
在用户foo1和foo2的优先度相同的情况下同时运行pgbench。
由于foo1和foo2的优先度相同,可以推测出每个pgbench的测量结果应该是相同水平的。
通过降低用户foo2的优先度,同时在优先度不同的用户foo1和foo2之间运行pgbench。
由于foo1的优先度较高,可以推测出pgbench的测量结果中,foo1的性能应高于foo2。
引入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)foo10247,8700.4888,195.2foo20248,4600.4878,214.3
测量模式2
foo1的pgbench測試結果,優先度高於foo2,表現更出色。
ユーザ優先度トランザクション処理件数平均レイテンシ(ms)スループット(tps)foo10356,8370.33611,894.1foo219136,5640.8794,551.3
总结
如果遵循类似于这次测量模式的条件,可以通过使用pg_cheat_funcs的scheduling_priority参数,在PostgreSQL上实现一定程度的优先控制。