本作品はCC-BYライセンスによって許諾されています。 ライセンスの内容を知りたい方は こちら でご確認ください。 文書の内容、表記に関する誤り、ご要望、感想等につきましては、PGEConsのサイト を通じてお寄せいただきますようお願いいたします。
PostgreSQLエンタープライズコンソーシアム(略称 PGECons)は、PostgreSQL本体および各種ツールの情報収集と提供、整備などの活動を通じて、ミッションクリティカル性の高いエンタープライズ領域へのPostgreSQLの普及を推進することを目的として設立された団体です。
PGECons 技術部会ではPostgreSQLの普及に資する課題を活動テーマとし、3つのワーキンググループで具体的な活動を行っています。
これら3つのワーキンググループのうち、WG1、WG3については 2015 年度まではそれぞれ、「性能ワーキンググループ」、「設計運用ワーキンググループ」という名称で活動してきました。2016年度は、従来の活動領域を広げる意図のもとでそれらを再定義し、上記のような名称に改めました。
これに伴い、WG3ではPostgreSQLの設計運用を中心としたさまざまな課題の解決のための調査検証を行い、PostgreSQLが広く活用される事を推進していくこととしました。
本資料はWG3の2019年度の活動として、機械学習の活用によりPostgreSQLパラメータチューニングの自動化が可能かを評価した結果についてまとめたものです。
本資料の読者は以下のような知識を有していることを想定しています。
PostgreSQLには利用するメモリ量やディスクへのデータ書き込み頻度などを制御する300以上のパラメータが存在し、利用用途に応じたチューニングが可能です。 数百以上のパラメータを適切に設定するため、PostgreSQLマニュアルの情報やPostgreSQL有識者の経験則などを活用し、パラメータチューニング(パラメータ最適化)を実施します。 しかしながら、PostgreSQLの動作環境やスキーマ、レコード数、ワークロードなどに依存し、最適なパラメータ設定値が変わるため、パラメータの設定値変更、測定、効果の確認を繰り返し行いながら、最適なパラメータ値を得る必要があります。このようにパラメータチューニング作業は時間とコストがかかる作業となっています。
機械学習の分野では予測精度の高いモデル開発のため、ハイパーパラメータ [1] のチューニングは課題として認識されており、 ハイパーパラメータを自動で最適化するアルゴリズムを実装したソフトウェアが開発されています。
[1] | パイパーパラメータ: 機械学習アルゴリズムが持つパラメータの中で利用者が調整する必要のあるもの。パイパーパラメータの値によってモデルの予測精度などが変化するため適切な値を設定する必要がある。 |
今回の検証では、ハイパーパラメータの自動最適化フレームワークの1つであるOptunaを活用し、PostgreSQLのパラメータチューニングが可能であるかを評価しました。 評価のためにOptunaを利用したPostgreSQLパラメータチューニングを行う実験的なプログラム(postgres_opttune)を利用しました。
ソフトウェア名 | postgres_opttune |
---|---|
ライセンス | Apache License 2.0 |
概要 | ハイパーパラメータの自動最適化フレームワークの1つであるOptunaを活用し、
PostgreSQLのパラメータチューニングを行うソフトウェア
|
URL | https://github.com/ssl-oyamata/postgres_opttune |
備考 | 現時点(2020/01/28)では検証用ソフトウェア |
PostgreSQLパラメータチューニングを行う主な既存ソフトウェアを下表に示します。
今回の検証では、PgTuneと機械学習を用いたチューニング手法(postgres_opttune)を比較することにしました。 OtterTuneはPostgreSQL 12に未対応のため、今回の検証では評価を見送りました。
ソフトウェア名 | PgTune |
---|---|
ライセンス | The MIT License (MIT) |
開発元 | Alexey Vasiliev氏など |
概要 | PostgreSQLが動作している環境(OS種別、搭載メモリ、CPU数)を元にパラメータ設定値を算出するソフトウェア
PostgreSQL対応バージョン : 9.2以降(最新版の12にも対応)
|
URL | https://github.com/le0pard/pgtune/blob/master/LICENSE |
備考 | Webサービス (https://pgtune.leopard.in.ua/#/) として公開されている。 |
ソフトウェア名 | OtterTune |
---|---|
ライセンス | Business Source License 1.1 |
開発元 | Carnegie Mellon Database Group |
概要 | 機械学習を活用し、DBMSのパラメータチューニングを自動化するをソフトウェア。
PostgreSQL,MySQL,Oracle Databaseなどのパラメータチューニングが可能で、
機械学習で利用する学習データはOtterTune自身が収集する。
|
URL | https://github.com/cmu-db/ottertune |
備考 | ー |
今回の評価ではベンチマークツールであるoltpbenchに実装されたtpccのベンチマークシナリオを実行し、 1秒毎の処理トランザクション数(TPS(Transactions Per Second))が最大になるPostgreSQLパラメータの値をpostgres_opttuneを用いて自動算出しました。 postgres_opttuneにより、算出されたPostgreSQLパラメータ値の性能評価を行うため、既存手法(PgTune)とTPSを比較しました。
この章では、postgres_opttuneでパラメータチューニングを行う際の環境や使用したソフトウェアについて紹介します。 今回の評価試験では、チューニング対象となるデータベースサーバと、 チューニングソフトウェアであるpostgres_opttuneとベンチマークツールであるoltpbenchが動作するクライアントサーバで構成されています。
評価に用いた環境は下表の通りです。
環境 | OS | CPUコア数 | メモリ(GiB) | ストレージの種類 |
---|---|---|---|---|
データベースサーバ | CentOS 7 | 4 | 8 | SSD |
クライアントサーバ | CentOS 7 | 4 | 8 | SSD |
評価で用いたソフトウェアは下表の通りです。
ソフトウェア | バージョン | 概要 | 関連サイト |
---|---|---|---|
postgres_opttune | - | 機械学習を用いたPostgreSQL用のパラメータチューニングツール | https://github.com/ssl-oyamata/postgres_opttune |
oltpbench | - | データベースベンチマークフレームワークであり、いくつかのベンチマークを標準で実装 | https://github.com/oltpbenchmark/oltpbench |
PostgreSQL | 12.1 | リレーショナルデータベース管理システム(RDBMS) | https://www.postgresql.org/ |
評価時に利用した各ソフトウェアの設定値を記載します。
postgres_opttuneは下記の処理を指定された試行回数分実行し、 ベンチマークのTPSが最大となる最適なPostgreSQLパラメータ値を探索します。
本件ではベンチマークに使用するソフトウェアと、パラメータチューニングに利用する最適化アルゴリズム、チューニングの試行回数を下表のように設定しました。
ベンチマークソフトウェア | 最適化アルゴリズム | 試行回数 |
---|---|---|
oltpbenchmark | TPE [1] | 200 |
[1] | TPE(Tree-structured Parzen Estimator): Optunaで用いられているハイパーパラメータを効率的に探索するためのアルゴリズムの一種。 観測点から確率的に良質な点を予測するベイス最適化と同じ考え方で探索を行うが、確率密度関数を用いた評価により、 結果のばらつきも少なく、コンスタントに最適なパラメータを探索できることが特徴。 |
oltpbenchで実行するベンチマークの設定値は下表の通りです。
データベースタイプ | ベンチマーク | トランザクション分離レベル | スケールファクタ | 接続数 | 実行時間(sec) |
---|---|---|---|---|---|
postgres | tpcc | TRANSACTION_READ_COMMITTED | 50 | 100 | 1800 |
postgres_opttuneのチューニング対象としたパラメータの情報を下表に記載しています。 postgres_opttuneは各パラメータの設定値を、最大値、最小値の範囲でチューニングします。
パラメータ | 最小値 | 最大値 | デフォルト値 | データ型 |
---|---|---|---|---|
bgwriter_lru_maxpages | 0 | 1000 | 100 | integer |
checkpoint_completion_target | 0.1 | 0.9 | 0.5 | float |
checkpoint_timeout | 1min | 30min | 5min | time |
default_statistics_target | 100 | 2048 | 100 | integer |
effective_cache_size | 4GB | 8GB | 4GB | bytes |
effective_io_concurrency | 1 | 1000 | 1 | integer |
max_parallel_maintenance_workers | 0 | 8 | 2 | integer |
max_parallel_workers_per_gather | 0 | 8 | 2 | integer |
max_wal_size | 256MB | 16GB | 1GB | bytes |
random_page_cost | 1 | 10 | 4.0 | float |
shared_buffers | 128MB | 6GB | 128MB | bytes |
temp_buffers | 8MB | 1GB | 8MB | bytes |
wal_buffers | 1MB | 256MB | 16MB | bytes |
wal_compression | on
off
|
on
off
|
off | boolean |
wal_writer_delay | 10ms | 10s | 200ms | time |
work_mem | 4MB | 1GB | 4MB | bytes |
postgres_opttuneを用いたパラメータチューニング結果を下図に記載します。 横軸は試行回数(#Trials)、縦軸はTPS(Objective Value)を示します。 試行回数を重ねることで、性能(TPS)が向上していることが確認できます。
注釈
Objective Value : ハイパーパラメータの自動最適化フレームワークであるOptunaは、ユーザが定義した目的値(Objective Value)が最大(もしくは最小)になるようにパラメータを最適化していきます。 本検証では、TPC-Cベンチマークシナリオ実行時のTPSが最大化されるよう実装しており、TPSがObjective Valueに該当します。
postgres_opttuneを用いて最適化したパラメータを下記に示します。 併せて既存の手法との比較を行うため、評価環境の情報を基にPGTuneによって算出されたパラメータとデフォルト状態でのパラメータ値を記載しています。
パラメータ | postgres_opttune | PGTune | default |
---|---|---|---|
bgwriter_lru_maxpages | 469 | (100) | (100) |
checkpoint_completion_target | 0.6589237936891297 | 0.9 | (0.5) |
checkpoint_timeout | 1740s | (5min) | (5min) |
default_statistics_target | 100 | 100 | (100) |
effective_cache_size | 6623MB | 6GB | (4GB) |
effective_io_concurrency | 613 | 200 | (1) |
maintenance_work_mem | (64MB) | 512MB | (64MB) |
max_parallel_maintenance_workers | 4 | (2) | (2) |
max_parallel_workers_per | (8) | 4 | (8) |
max_parallel_workers_per_gather | 5 | 2 | (2) |
max_wal_size | 12359MB | 4GB | (1GB) |
max_worker_process | (8) | 4 | (8) |
min_wal_size | (80MB) | 2GB | (80MB) |
random_page_cost | 7.477068166087535 | 1.1 | (4) |
shared_buffers | 5216MB | 2GB | (128MB) |
temp_buffers | 689MB | (8MB) | (8MB) |
wal_buffers | 95MB | 16MB | (4MB) |
wal_compression | on | (off) | (off) |
wal_writer_delay | 7s | (200ms) | (200ms) |
work_mem | 766MB | 10485kB | (4MB) |
※()内のパラメータはデフォルト値
postgres_opttuneにて最適化されたパラメータを用いてoltpbenchを実行し、性能測定を行いました。 併せてPGTuneによって算出されたパラメータとデフォルト状態でのパラメータでの性能測定も行いました。
データロード ./oltpbenchmark -b tpcc -c config/sample_tpcc_config.xml --create=true --load=true (データロード後) VACUUM ANALYZE psql -d <データベース> -c "VACUUM ANALYZE" PostgreSQL再起動 pg_ctl restart -D <データベースクラスタ> キャッシュクリア echo 1 > /proc/sys/vm/drop_caches ベンチマーク実行 ./oltpbenchmark -b tpcc -c config/sample_tpcc_config.xml --execute=true -s 5 -o outputfile
postgres_opttune | PGTune | default | |
---|---|---|---|
1回目 | 598.57 | 243.43 | 49.47 |
2回目 | 646.31 | 224.23 | 45.35 |
3回目 | 682.56 | 221.75 | 95.78 |
平均値 | 642.48 | 229.80 | 63.53 |
postgers_opttuneでは性能(TPS値)を基にパラメータチューニングを実施しているため、性能が低下するチェックポイント処理を極力行わないようにパラメータがチューニングされています。
パラメータ | postgres_opttune | PGTune | default |
---|---|---|---|
checkpoint_timeout | 1740s | (5min) | (5min) |
max_wal_size | 12359MB | 4GB | (1GB) |
そのため、算出されたパラメータではPostgreSQLクラッシュ時のリカバリ処理に時間を要することが推測されます。 postgres_opttuneを用いたパラメータチューニングには上記のような課題がありますので、使用する際には別途リカバリに要することができる最大許容時間を基にチェックポイントに関連するパラメータを算出する必要があります。
下記は、パラメータチューニングの際に試行されたパラメータの評価情報になります。左軸のObjective Valueが性能(TPS値)を表しており、その時の各パラメータ値が線で結ばれています。 線の色が濃い程、性能が高いことを表していますので、この評価情報から性能が向上した際の各パラメータの評価状況が確認できます。 今回の評価結果からはcheckpoint_timeoutおよびmax_wal_sizeを増やすことで性能が向上しているので、これらのパラメータを増やすことでpostgres_opttuneでの評価が高くなっていると判断できます。
性能測定結果からの考察より、チェックポイント処理による性能影響が大きいと判断し、postgres_opttuneのチューニング対象から除外することとしました。
postgres_opttuneによるチューニング試行回数を200->100に変更しました。
ベンチマークソフトウェア | アルゴリズム | 試行回数 |
---|---|---|
oltpbenchmark | TPE | 100 |
oltpbenchの項目では、上述の検証と同様の設定とします。
チェックポイント処理に影響するパラメータ(checkpoint_timeout, max_wal_size)を postgres_opttuneのチューニング対象から除外しました。
パラメータ | 最小値 | 最大値 | デフォルト値 | データ型 |
---|---|---|---|---|
bgwriter_lru_maxpages | 0 | 1000 | 100 | integer |
checkpoint_completion_target | 0.1 | 0.9 | 0.5 | float |
default_statistics_target | 100 | 2048 | 100 | integer |
effective_cache_size | 4GB | 8GB | 4GB | bytes |
effective_io_concurrency | 1 | 1000 | 1 | integer |
max_parallel_maintenance_workers | 0 | 8 | 2 | integer |
max_parallel_workers_per_gather | 0 | 8 | 2 | integer |
random_page_cost | 1 | 10 | 4.0 | float |
shared_buffers | 128MB | 6GB | 128MB | bytes |
temp_buffers | 8MB | 1GB | 8MB | bytes |
wal_buffers | 1MB | 256MB | 16MB | bytes |
wal_compression | on
off
|
on
off
|
off | boolean |
wal_writer_delay | 10ms | 10s | 200ms | time |
work_mem | 4MB | 1GB | 4MB | bytes |
パラメータ | postgres_opttune | PGTune | default |
---|---|---|---|
bgwriter_lru_maxpages | 122 | (100) | (100) |
checkpoint_completion_target | 0.6933055737323116 | 0.9 | (0.5) |
checkpoint_timeout | (5min) | (5min) | (5min) |
default_statistics_target | 120 | 100 | (100) |
effective_cache_size | 4621MB | 6GB | (4GB) |
effective_io_concurrency | 951 | 200 | (1) |
maintenance_work_mem | (64MB) | 512MB | (64MB) |
max_parallel_maintenance_workers | 1 | (2) | (2) |
max_parallel_workers_per | (8) | 4 | (8) |
max_parallel_workers_per_gather | 8 | 2 | (2) |
max_wal_size | 4GB | 4GB | (1GB) |
max_worker_process | (8) | 4 | (8) |
min_wal_size | (80MB) | 2GB | (80MB) |
random_page_cost | 1.2290242340087807 | 1.1 | (4) |
shared_buffers | 4252MB | 2GB | (128MB) |
temp_buffers | 704MB | (8MB) | (8MB) |
wal_buffers | 224MB | 16MB | (4MB) |
wal_compression | on | (off) | (off) |
wal_writer_delay | 8s | (200ms) | (200ms) |
work_mem | 173MB | 10485kB | (4MB) |
※()内のパラメータはデフォルト値
同様にpostgres_opttuneで最適化されたパラメータでoltpbenchを実行し、性能測定を行います。 性能測定では、postgres_opttuneで最適化されたパラメータに加えてチェックポイント処理に関連するパラメータをPGTuneと同じ値(checkpoint_timeout=5min, max_wal_size=4GB)に設定し、 チェックポイントの発生頻度をPGTuneと同程度としました。
postgres_opttune | PGTune | default | |
---|---|---|---|
1回目 | 287.58 | 243.43 | 49.47 |
2回目 | 250.40 | 224.23 | 45.35 |
3回目 | 323.63 | 221.75 | 95.78 |
平均値 | 287.20 | 229.80 | 63.53 |
チェックポイント処理に関連するパラメータをpostgres_opttuneのチューニング対象から除外したことで、チェックポイント処理を回避することで得られていた性能の優位性がなくなり、 最初に行った検証結果のような性能差は見られなくなりました。それでもPGTuneと比べて若干の性能向上を確認することができました。 今回の追加検証で確認できたようにチェックポイント処理は性能とPostgreSQLクラッシュ時のリカバリ時間とのトレードオフとなるため、これらを考慮したパラメータチューニングが今後の課題だと考えています。
今年度検証した機械学習を用いたPostgreSQLパラメータチューニングの活動において、次のことを確認することができました。
今年度検証した特定のベンチマークにおけるトランザクション処理数(TPS)を改善するなど、 最適化対象の処理を定義できれば、PostgreSQLのパラメータチューニング作業を自動化することができ、 パラメータチューニングにかかる作業時間や人的コストを削減可能と考えている。 ただし、機械学習を用いてパラメータの最適化を行うためにある程度のチューニング時間が必要です。
また、単位時間当たりのトランザクション処理数を改善するにあたり、次のPostgreSQLパラメータの設定値の影響が大きいことを再確認することができました。
今年度の検証時に上述したチェックポイントの実行頻度を制御するパラメータチューニングの課題以外にも複数の課題が見つかっており、 来年度以降も機械学習を用いたPostgreSQLパラメータチューニングを検討し、パラメータチューニングの自動化を目指したいと考えております。
項番 | 課題 | 概要 | 備考 |
---|---|---|---|
1 | PostgreSQLクラッシュ時のリカバリ時間を考慮したパラメータチューニング | チェックポイントの実行頻度に影響するcheckpoint_timeoutパラメータ、max_wal_sizeパラメータの設定値を、PostgreSQLクラッシュ時のリカバリに要する時間を基に決定する。
まずは、checkpoint_timeoutパラメータ、max_wal_sizeパラメータの設定値とクラッシュリカバリ時間の関係を明らかにする必要がある。
|
postgres_opttuneによる自動チューニングでは、利用者が指定した最大リカバリ許容時間を基にcheckpoint_timeoutパラメータ、max_wal_sizeパラメータの、最大値を決定し、パラメータの自動チューニングを行う仕組みを検討する。 |
2 | データベース初期化時に決定されるパラメータのチューニング | 今年度の検証ではinitdbを実行する際に決定されるblock_sizeパラメータ(ブロックサイズ)、wal_segment_size(WALファイルのサイズ)はチューニング対象外としている。上記パラメータを含む形で検討を行いたい。 | -
|
3 | その他最適化アルゴリズムとの比較検証 | 今年度の検証ではOptunaに搭載されたTPE(Tree-structured Parzen Estimator)を最適化アルゴリズムとして利用したが、Optunaにて利用可能なSkopt(ガウス過程等を使った最適化ライブラリ)やニューラルネットワーク、強化学習など別のアルゴリズムなどの評価は実施できていない。 | アルゴリズム毎に必要となるサンプル数(学習データ数)や処理性能の比較を行う。 |
4 | 別ワークロードでのチューニング評価 | 今年度の検証ではoltpbench (https://github.com/oltpbenchmark/oltpbench) のtpccシナリオを利用して、評価したが別のワークロードでの評価を行う。 | -
|
5 | SQLの最適化検討 | SQLの処理時間を機械学習を用いて最適化する手法について検討したい。
SQL処理時間の最適化に必要な環境情報(インデックス定義やPostgreSQLのコスト調整パラメータなど)を整理し、SQLの処理時間が短縮できるか否かを検討したいと考えている。
|
-
|
(企業・団体名順)
版 | 所属企業・団体名 | 部署名 | 氏名 |
---|---|---|---|
第1.0版
(2019年度WG3)
|
株式会社富士通ソーシアルサイエンスラボラトリ | ソリューション開発センター ソリューション開発部 | 小山田 政紀 |
株式会社富士通ソーシアルサイエンスラボラトリ | ソリューション開発センター ソリューション開発部 | 汪 キン垠 | |
株式会社富士通ソーシアルサイエンスラボラトリ | ソリューション開発センター ソリューション開発部 | 樊 小楚 |