PostgreSQL には、PolarDB for PostgreSQL (Compatible with Oracle) でベンチマークテストを実行するための軽量ストレステストツールである pgbench が含まれています。このツールは、同時データベースセッションで同じ SQL コマンドを繰り返し実行します。このトピックでは、pgbench を使用して PolarDB for PostgreSQL (Compatible with Oracle) クラスターの最大パフォーマンスをテストする方法について説明します。
テスト環境
- すべてのテストは中国 (青島) リージョンで実施されました。PolarDB クラスターと ECS インスタンスは同じゾーンに配置されています。
- ECS インスタンスタイプ: ecs.g5.16xlarge (64 コア 256 GB)。
- ECS ストレージ仕様: 200 GB SSD ローカルディスク。
- ネットワークタイプ: Virtual Private Cloud (VPC)。PolarDB クラスターと ECS インスタンスは同じ VPC 内にあります。
- オペレーティングシステム: CentOS 7.6 x64。
- PolarDB クラスターノード: 1 つのプライマリノードと 1 つの読み取り専用ノード。
説明 CentOS 6 は PostgreSQL 11 をサポートしていません。
テスト項目
- 読み取り専用秒間クエリ数 (QPS)
1 秒あたりに実行される読み取り専用 SQL ステートメント (SELECT のみ) の数。
- 読み取り/書き込み QPS
1 秒あたりに実行される読み取り/書き込み SQL ステートメント (INSERT、SELECT、UPDATE) の数。
準備
- テストツールのインストール次のコマンドを実行して、ECS インスタンスに PostgreSQL 11 をインストールします。
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo yum install -y postgresql11 - クラスターパラメーターの変更PolarDB クラスターは次のように変更する必要があります:
log_statement = 'none' enable_hashjoin=off enable_mergejoin=off enable_bitmapscan=off説明 現在、コンソールで変更できるのは log_statement パラメーターのみです。クラスターパラメーターの設定方法の詳細については、「クラスターパラメーターの設定」をご参照ください。設定パラメーターを変更した後、クラスターを再起動して変更を有効にします。
テスト方法
- 次のコマンドを実行して環境変数を設定します:
export PGHOST=<Private endpoint of the PolarDB cluster> export PGPORT=<Private port of the PolarDB cluster> export PGDATABASE=postgres export PGUSER=<Username for the PolarDB database> export PGPASSWORD=<Password for the PolarDB user>説明 PolarDB for PostgreSQL (Compatible with Oracle) クラスターのエンドポイントの表示方法の詳細については、「エンドポイントとポートの表示」をご参照ください。 - ターゲットデータベースのサイズに基づいてテストデータを初期化します。コマンドは次のとおりです:
- 10 億件のデータを初期化:
/usr/pgsql-11/bin/pgbench -i -s 10000 - 5 億件のデータを初期化:
/usr/pgsql-11/bin/pgbench -i -s 5000 - 1 億件のデータを初期化:
/usr/pgsql-11/bin/pgbench -i -s 1000
- 10 億件のデータを初期化:
- 読み取り専用および読み取り/書き込みテストスクリプトを作成します。
- 読み取り専用スクリプト ro.sql を作成します:
vim ro.sqlコマンドを実行します。- I キーを押して編集モードに入ります。
- 次の内容を入力します:
\set aid random_gaussian(1, :range, 10.0) SELECT abalance FROM pgbench_accounts WHERE aid = :aid; - Esc キーを押して編集モードを終了し、
:wqと入力して保存し、終了します。
- 読み取り/書き込みスクリプト rw.sql を作成します:
vim rw.sqlコマンドを実行します。- I キーを押して編集モードに入ります。
- 次の内容を入力します:
\set aid random_gaussian(1, :range, 10.0) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-5000, 5000) BEGIN; UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; SELECT abalance FROM pgbench_accounts WHERE aid = :aid; UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); END; - Esc キーを押して編集モードを終了し、
:wqと入力して保存し、終了します。
- 読み取り専用スクリプト ro.sql を作成します:
- 次のコマンドを実行してテストを実施します:
- 読み取り専用テスト:
88-core 710 GB (polar.o.x8.12xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=1000000000 64-core 512 GB (polar.o.x8.8xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=1000000000 32-core 256 GB (polar.o.x8.4xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000 16-core 128 GB (polar.o.x8.2xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 8-core 64 GB (polar.o.x8.xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=1000000000 8-core 32 GB (polar.o.x4.xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=1000000000 4-core 16 GB (polar.o.x4.large) Total data volume: 500 million, Hot data: 50 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=5000 -D range=50000000 Total data volume: 500 million, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=5000 -D range=100000000 2-core 4 GB (polar.o.x4.medium) Total data volume: 100 million, Hot data: 50 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 16 -j 32 -T 120 -D scale=1000 -D range=50000000 Total data volume: 100 million, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 16 -j 32 -T 120 -D scale=1000 -D range=100000000 - 読み取り/書き込みテスト:
88-core 710 GB (polar.o.x8.12xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=1000000000 64-core 512 GB (polar.o.x8.8xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=1000000000 32-core 256 GB (polar.o.x8.4xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000 16-core 128 GB (polar.o.x8.2xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 8-core 64 GB (polar.o.x8.xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 8-core 32 GB (polar.o.x4.xlarge) Total data volume: 1 billion, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=100000000 Total data volume: 1 billion, Hot data: 500 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000 Total data volume: 1 billion, Hot data: 1 billion /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000 4-core 16 GB (polar.o.x4.large) Total data volume: 500 million, Hot data: 50 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=50000000 Total data volume: 500 million, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000 2-core 8 GB (polar.o.x4.medium) Total data volume: 100 million, Hot data: 50 million /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=50000000 Total data volume: 100 million, Hot data: 100 million /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=100000000
説明- scale: この値に 100,000 を掛けると、テストデータ量になります。
- range: アクティブなデータ量。
- -c: 同時テスト接続数。この値は、インスタンスタイプの最大接続数を表すものではありません。最大接続数の詳細については、「コンピュートノードの仕様」をご参照ください。
- 読み取り専用テスト:
テスト結果
| 仕様 | テストデータ量 | ホット (アクティブ) データ量 | 読み取り専用 QPS | 読み取り/書き込み QPS |
polar.o.x8.12xlarge 88 コア 710 GB | 10 億 | 1 億 | 630650.40 | 263746.37 |
| 5 億 | 601262.24 | 247352.76 | ||
| 10 億 | 589405.79 | 218788.92 | ||
polar.o.x8.8xlarge 64 コア 512 GB | 10 億 | 1 億 | 592064.65 | 227352.23 |
| 5 億 | 554777.11 | 213343.13 | ||
| 10 億 | 508404.07 | 203331.35 | ||
polar.o.x8.4xlarge 32 コア 256 GB | 10 億 | 1 億 | 522182.92 | 213212.34 |
| 5 億 | 509372.85 | 203322.34 | ||
| 10 億 | 489349.72 | 198531.37 | ||
polar.o.x8.2xlarge 16 コア 128 GB | 10 億 | 1 億 | 263893.72 | 152863.27 |
| 5 億 | 250221.62 | 129238.26 | ||
| 10 億 | 239832.62 | 106212.82 | ||
polar.o.x8.xlarge 8 コア 64 GB | 10 億 | 1 億 | 142836.56 | 69725.29 |
| 5 億 | 133931.69 | 55927.65 | ||
| 10 億 | 124151.02 | 50786.21 | ||
polar.o.x4.xlarge 8 コア 32 GB | 10 億 | 1 億 | 126748.07 | 59738.33 |
| 5 億 | 113432.32 | 48372.25 | ||
| 10 億 | 104232.84 | 49763.64 | ||
polar.o.x4.large 4 コア 16 GB | 5 億 | 5,000 万 | 76238.89 | 47388.27 |
| 1 億 | 69892.83 | 43638.85 | ||
polar.o.x4.medium 2 コア 8 GB | 1 億 | 5,000 万 | 28320.70 | 18152.63 |
| 1 億 | 30792.19 | 19111.15 |
説明
- 仕様: PolarDB for PostgreSQL (Compatible with Oracle) のインスタンスタイプコード。
- テストデータ量: このテストラウンドのレコード数。
- ホット (アクティブ) データ量: このテストラウンドでクエリおよび UPDATE SQL ステートメントによって使用されるレコード数。
- 読み取り専用 QPS: 1 秒あたりに実行される読み取り専用クエリの数。
- 読み取り/書き込み QPS: 1 秒あたりに実行される読み取り/書き込みクエリの数。







