Oracleと互換性のあるPostgreSQLは、軽量のストレステストツールであるpgbenchを提供します。 pgbenchはPostgreSQLでベンチマークテストを実行できます。 ベンチマークテストは、複数の同時データベースセッションにわたって同じSQL文のシーケンスを繰り返し実行することによって実行されます。 このトピックでは、pgbenchを使用して クラスターのピークパフォーマンスをテストする方法について説明します。
テスト環境
すべてのテストは中国 (チンタオ) の地域で行なわれなければなりません。 PolarDBクラスターは、ECSインスタンスと同じゾーンにある必要があります。
ECSインスタンスタイプ: ecs.g5.16xlarge (64 vCPU、256 GiB)
ECSストレージ: 200 GiBローカルSSD
ネットワークタイプ: 仮想プライベートクラウド (VPC) 。 PolarDBクラスターとECSインスタンスは同じVPCにあります。
OS: CentOS 7.6の64ビットバージョン
PolarDBクラスター内のノード数: 1つのプライマリノードと1つの読み取り専用ノード
CentOS 6 は PostgreSQL 11 をサポートしていません。
テストメトリック
1 秒あたりの読み取り専用クエリ (QPS)
読み取り専用操作がデータベース上で実行されたときの、1 秒あたりの SELECT 文の実行数
読み書き QPS
データベースで読み取り /書き込み操作が実行されたときに1秒あたりに実行されるSELECT、INSERT、およびUPDATEステートメントの数。
始める前に
PostgreSQL 11 をインストールします。
次のコマンドを実行して、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クラスターのパラメーターを設定します。
PolarDBクラスターで、次のパラメーターを設定します。
log_statement = 'none' enable_hashjoin=off enable_mergejoin=off enable_bitmapscan=off
説明PolarDBコンソールでは、log_statementパラメーターのみを設定できます。 クラスターパラメーターの設定方法の詳細については、「 クラスターパラメーターの指定」をご参照ください。
パラメーターを設定した後、設定を有効にするためにPolarDBクラスターを再起動します。
テスト方法
次のコマンドを実行して環境変数を設定します。
export PGHOST=<The internal endpoint of your PolarDB cluster> export PGPORT=<The internal port number of your PolarDB cluster> export PGDATABASE=postgres export PGUSER=<The username used to log on to your PolarDB database> export PGPASSWORD=<The password of your PolarDB account>
説明クラスターのエンドポイントを表示する方法の詳細については、「エンドポイントとポートの表示」をご参照ください。
テストするデータベースのサイズに基づいて、テストデータを初期化します。
次のコマンドを実行して、10億個のデータレコードを初期化します。
/usr/pgsql-11/bin/pgbench -i -s 10000
次のコマンドを実行して、500万件のデータレコードを初期化します。
/usr/pgsql-11/bin/pgbench -i -s 5000
次のコマンドを実行して、100万件のデータレコードを初期化します。
/usr/pgsql-11/bin/pgbench -i -s 1000
読み取り専用操作および読み取り /書き込み操作用のテストスクリプトを作成します。
読み取り専用操作をテストするスクリプトを作成します。 このスクリプトの名前を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
と入力してファイルを保存し、エディターを終了します。
次のコマンドを実行して、操作をテストします。
次のコマンドを実行して、読み取り専用操作をテストします。
88C 710 GB(polar.o.x8.12xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 64C 512 GB(polar.o.x8.8xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 32C 256 GB(polar.o.x8.4xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 16cC 128 GB(polar.o.x8.2xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 8C 64 GB(polar.o.x8.xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 8C 32 GB(polar.o.x4.xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 4C 16 GB(polar.o.x4.large) Total data volume: 500 million records, hot data: 50 million records /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 records, hot data: 100 million records /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 2C 4 GB(polar.o.x4.medium) Total data volume: 100 million records, hot data: 50 million records /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 records, hot data: 100 million records /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
次のコマンドを実行して、読み取り /書き込み操作をテストします。
88C 710 GB(polar.o.x8.12xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 64C 512 GB(polar.o.x8.8xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 32C 256 GB(polar.o.x8.4xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 16C 128 GB(polar.o.x8.2xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 8C 64 GB(polar.o.x8.xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 8C 32 GB(polar.o.x4.xlarge) Total data volume: 1 billion records, hot data: 100 million records /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 records, hot data: 500 million records /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 records, hot data: 1 billion records /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 4C 16 GB(polar.o.x4.large) Total data volume: 500 million records, hot data: 50 million records /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 records, hot data: 100 million records /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 2C 8 GB(polar.o.x4.medium) Total data volume: 100 million records, hot data: 50 million records /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 records, hot data: 100 million records /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: scaleに100,000を掛けた値は、テストデータレコードの数を示します。
range: ホットデータレコードの数を指定します。
-c: テストの接続数を指定します。 このパラメーターの値は、このタイプのクラスターでサポートされる最大接続数を示していません。 詳細については、「計算ノードの仕様」をご参照ください。
テスト結果
仕様コード | テストデータレコード数 | ホット (アクティブ) データレコードの数 | 読み取り専用QPS | QPSの読み取りと書き込み |
polar.o.x8.12xlarge 88コア、710 GB | 10 億 | 1 億 | 630650.40 | 263746.37 |
500 万 | 601262.24 | 247352.76 | ||
10 億 | 589405.79 | 218788.92 | ||
polar.o.x8.8xlarge 64 コア 512 GB | 10 億 | 1 億 | 592064.65 | 227352.23 |
500 万 | 554777.11 | 213343.13 | ||
10 億 | 508404.07 | 203331.35 | ||
polar.o.x8.4xlarge 32 コア 256 GB | 10 億 | 1 億 | 522182.92 | 213212.34 |
500 万 | 509372.85 | 203322.34 | ||
10 億 | 489349.72 | 198531.37 | ||
polar.o.x8.2xlarge 16 コア 128 GB | 10 億 | 1 億 | 263893.72 | 152863.27 |
500 万 | 250221.62 | 129238.26 | ||
10 億 | 239832.62 | 106212.82 | ||
polar.o.x8.xlarge 8 コア 64 GB | 10 億 | 1 億 | 142836.56 | 69725.29 |
500 万 | 133931.69 | 55927.65 | ||
10 億 | 124151.02 | 50786.21 | ||
polar.o.x4.xlarge 8 コア 32 GB | 10 億 | 1 億 | 126748.07 | 59738.33 |
500 万 | 113432.32 | 48372.25 | ||
10 億 | 104232.84 | 49763.64 | ||
polar.o.x4.large 4 コア 16 GB | 500 万 | 5000 万 | 76238.89 | 47388.27 |
1 億 | 69892.83 | 43638.85 | ||
polar.o.x4.medium 2 コア 8 GB | 1 億 | 5000 万 | 28320.70 | 18152.63 |
1 億 | 30792.19 | 19111.15 |
仕様コード: 仕様のコード。
テストデータレコード数は、テストに使用されたデータレコードの数です。
ホット (アクティブ) データレコード数: テストでSQLコマンドを照会および更新するためのレコード数。
読み取り専用QPS: 1秒あたりに処理された読み取り専用リクエストの数。
読み書きQPS: 1秒あたりに処理された読み書き要求の数。