すべてのプロダクト
Search
ドキュメントセンター

PolarDB:パフォーマンスホワイトペーパー

最終更新日:Aug 07, 2024

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クラスターを再起動します。

テスト方法

  1. 次のコマンドを実行して環境変数を設定します。

    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>
    説明

    クラスターのエンドポイントを表示する方法の詳細については、「エンドポイントとポートの表示」をご参照ください。

  2. テストするデータベースのサイズに基づいて、テストデータを初期化します。

    • 次のコマンドを実行して、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
  3. 読み取り専用操作および読み取り /書き込み操作用のテストスクリプトを作成します。

    • 読み取り専用操作をテストするスクリプトを作成します。 このスクリプトの名前をro.sqlに設定します。

      1. vim ro.sqlコマンドを実行します。

      2. Iキーを押して編集モードに入ります。

      3. エディターで、次の内容を指定します。

        \set aid random_gaussian(1, :range, 10.0)
        SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
      4. Escキーを押して編集モードを終了し、:wqと入力してファイルを保存し、エディターを終了します。

    • 読み取り /書き込み操作をテストするスクリプトを作成します。 このスクリプトの名前をrw.sqlに設定します。

      1. vim rw.sqlコマンドを実行します。

      2. Iキーを押して編集モードに入ります。

      3. エディターで、次の内容を指定します。

        \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;
      4. Escキーを押して編集モードを終了し、:wqと入力してファイルを保存し、エディターを終了します。

  4. 次のコマンドを実行して、操作をテストします。

    • 次のコマンドを実行して、読み取り専用操作をテストします。

      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秒あたりに処理された読み書き要求の数。

2c8g4c16g8c32g8c64g16c128g32c256g64c512g88c710g