sql >> データベース >  >> RDS >> PostgreSQL

Sysbenchを使用してPostgreSQLのパフォーマンスをベンチマークする方法

    ベンチマークは、インフラストラクチャのパフォーマンスを検出する方法です。 Sysbenchは、PostgreSQLサーバーのベンチマークを行うための優れたツールです。このブログ投稿では、sysbenchを使用してテストロードを生成する方法を紹介します。 ClusterControlによる2ノードのマスタースレーブストリーミングレプリケーションセットアップを利用します。これは、クラスター上でいくつかのアクティビティを生成し、レプリケーションが期待どおりに機能していることを確認するのにも役立ちます。

    現在ここで管理されている最新バージョンのsysbenchをインストールします。 sysbenchのインストールには、Githubの公式ページで提供されているより更新されたパッケージを使用します。また、PostgreSQLダウンロードページから標準のPostgreSQL9.6バイナリを使用します。このブログ投稿で使用されているパスは、インストールしているPostgreSQLのバージョンとベンダーによって異なる場合があることに注意してください。

    補足として、このブログ投稿「PostgreSQLパフォーマンスをベンチマークする方法」でpgbenchを使用したPostgreSQLのベンチマークに関する同様のブログ投稿を取り上げました。

    Sysbenchのインストール

    sysbenchのインストールは簡単です。 Debian / Ubuntuの場合:

    $ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
    $ sudo apt -y install sysbench

    RHEL / CentOSの場合:

    $ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
    $ sudo yum -y install sysbench

    sysbenchパッケージをインストールします:

    $ yum install sysbench

    バージョンを確認します:

    $ sysbench --version
    sysbench 1.0.15

    これでsysbenchがインストールされました。

    テストデータの初期化

    sysbenchに精通している場合は、PostgreSQLパラメータに次のデフォルトを使用します。

    • pgsql-host =localhost
    • pgsql-port =5432
    • pgsql-user =sbtest
    • pgsql-password =password
    • pgsql-db =sbtest

    まず、PostgreSQL内にデータベースとユーザーを作成します:

    $ su - postgres
    $ psql
    > CREATE USER sbtest WITH PASSWORD 'password';
    > CREATE DATABASE sbtest;
    > GRANT ALL PRIVILEGES ON DATABASE sbtest TO sbtest;

    次に、ホストベースのアクセスファイル pg_hba.confを編集します。 :

    $ vim /var/lib/pgsql/9.6/data/pg_hba.conf

    そして、次の行を追加して、ユーザーsbtestが、192.168.55.0ネットワーク下のすべてのホストからデータベースsbtestに接続できるようにします。

    host    sbtest          sbtest          192.168.55.0/24         md5

    サーバーをリロードして変更を適用します:

    $ /usr/pgsql-9.6/bin/pg_ctl --reload

    ユーザー認証が正しく機能するかどうかをpsqlコマンドラインクライアントから確認します。

    $ psql -U sbtest -h 192.168.55.61 -p 5432 -d sbtest -W

    sbtestデータベースの下のサーバーにアクセスできるはずです:

    $ psql -U sbtest -h 192.168.55.61 -p 5432 -W
    Password for user sbtest:
    Type "help" for help.
    
    sbtest=>

    「\q」を実行してターミナルを終了します。これで、次のコマンドでsysbenchを使用してデータベースを初期化できます。

    $ sysbench \
    --db-driver=pgsql \
    --oltp-table-size=100000 \
    --oltp-tables-count=24 \
    --threads=1 \
    --pgsql-host=192.168.55.61 \
    --pgsql-port=5432 \
    --pgsql-user=sbtest \
    --pgsql-password=password \
    --pgsql-db=sbtest \
    /usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua \
    run

    上記のコマンドは、データベース'sbtest'内の24個のテーブル(sbtest1からsbtest24)に対してテーブルごとに100,000行を生成します。スキーマ名は「public」で、これがデフォルトです。データは、 parallel_prepare.luaというスクリプトによって準備されます。 / usr / share / sysbench / tests / include/oltp_legacyで利用できます。

    次のコマンドを使用して、生成されたテーブルを確認します。

    $ psql -U sbtest -h 192.168.55.61 -p 5432 -W -c '\dt+\'
    Password for user sbtest:
                        List of relations
     Schema |   Name   | Type  | Owner  | Size  | Description
    --------+----------+-------+--------+-------+-------------
     public | sbtest1  | table | sbtest | 21 MB |
     public | sbtest10 | table | sbtest | 21 MB |
     public | sbtest11 | table | sbtest | 21 MB |
     public | sbtest12 | table | sbtest | 21 MB |
     public | sbtest13 | table | sbtest | 21 MB |
     public | sbtest14 | table | sbtest | 21 MB |
     public | sbtest15 | table | sbtest | 21 MB |
     public | sbtest16 | table | sbtest | 21 MB |
     public | sbtest17 | table | sbtest | 21 MB |
     public | sbtest18 | table | sbtest | 21 MB |
     public | sbtest19 | table | sbtest | 21 MB |
     public | sbtest2  | table | sbtest | 21 MB |
     public | sbtest20 | table | sbtest | 21 MB |
     public | sbtest21 | table | sbtest | 21 MB |
     public | sbtest22 | table | sbtest | 21 MB |
     public | sbtest23 | table | sbtest | 21 MB |
     public | sbtest24 | table | sbtest | 21 MB |
     public | sbtest3  | table | sbtest | 21 MB |
     public | sbtest4  | table | sbtest | 21 MB |
     public | sbtest5  | table | sbtest | 21 MB |
     public | sbtest6  | table | sbtest | 21 MB |
     public | sbtest7  | table | sbtest | 21 MB |
     public | sbtest8  | table | sbtest | 21 MB |
     public | sbtest9  | table | sbtest | 21 MB |
    (24 rows)

    これでテストデータが読み込まれました。

    今日のホワイトペーパーをダウンロードするClusterControlを使用したPostgreSQLの管理と自動化PostgreSQLの導入、監視、管理、スケーリングを行うために知っておくべきことについて学ぶホワイトペーパーをダウンロードする

    テストロードの生成

    次のセクションに示すように、sysbenchで実行できるデータベースワークロードにはさまざまな種類があります。

    読み取り/書き込みロード

    このコマンドは、MySQLのバージョンのsysbenchに似ています。 PostgreSQL関連のパラメータを除いて同様のパラメータを使用できます:

    $ sysbench \
    --db-driver=pgsql \
    --report-interval=2 \
    --oltp-table-size=100000 \
    --oltp-tables-count=24 \
    --threads=64 \
    --time=60 \
    --pgsql-host=192.168.55.61 \
    --pgsql-port=5432 \
    --pgsql-user=sbtest \
    --pgsql-password=password \
    --pgsql-db=sbtest \
    /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
    run

    上記のコマンドは、/ usr / share / sysbench / tests / include / oltp_legacy / oltp.luaというLUAスクリプトから、ホスト192.168.55.61(マスター)。 2秒ごとに、sysbenchは中間統計を報告します(-report-interval =2

    実行すると、次のようになります。

    sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)
    
    Running the test with following options:
    Number of threads: 16
    Report intermediate results every 2 second(s)
    Initializing random number generator from current time
    
    Initializing worker threads...
    
    Threads started!
    
    [ 2s ] thds: 64 tps: 0.00 qps: 466.69 (r/w/o: 406.55/28.33/31.81) lat (ms,95%): 0.00 err/s: 0.00 reconn/s: 0.00
    [ 4s ] thds: 64 tps: 30.55 qps: 525.38 (r/w/o: 335.56/128.72/61.10) lat (ms,95%): 3639.94 err/s: 0.00 reconn/s: 0.00
    [ 6s ] thds: 64 tps: 39.55 qps: 718.41 (r/w/o: 496.13/142.68/79.60) lat (ms,95%): 4128.91 err/s: 0.00 reconn/s: 0.00
    [ 8s ] thds: 64 tps: 35.98 qps: 840.95 (r/w/o: 604.11/163.89/72.95) lat (ms,95%): 2198.52 err/s: 0.50 reconn/s: 0.00
    [ 10s ] thds: 64 tps: 65.57 qps: 1314.94 (r/w/o: 912.00/271.80/131.14) lat (ms,95%): 3040.14 err/s: 0.00 reconn/s: 0.00
    ...

    テストが進行中の場合、 pg_activityを使用してPostgreSQLアクティビティを監視できます。 またはpg_top 、sysbenchによって報告された中間統計を確認します。別の端末で、次の操作を行います。

    $ su - postgres
    $ pg_activity
     PostgreSQL 9.6.9 - postgres1.local - [email protected]:5432/postgres - Ref.: 2s
      Size:  654.62M -     7.67K/s        | TPS:          74
      Mem.:   39.10% -   382.72M/979.68M  | IO Max:     3395/s
      Swap:    0.20% -     3.57M/2.00G    | Read :      8.36M/s -   2141/s
      Load:    20.20 6.02 2.44            | Write:      2.54M/s -    650/s
                                                                       RUNNING QUERIES
    PID    DATABASE              USER           CLIENT   CPU% MEM%   READ/s  WRITE/s     TIME+  W  IOW              state   Query
    5130   sbtest              sbtest    192.168.55.61    1.0  2.8  791.57K    3.84K  0.788732  N    N             active   SELECT c FROM sbtest7 WHERE id BETWEEN 33195
     AND 33294
    ...

    pg_stat_replication を確認することにより、レプリケーションストリームと同様に マスターサーバー上のテーブル:

    $ su - postgres
    $ watch -n1 'psql -xc "select * from pg_stat_replication"'
    Every 1.0s: psql -xc "select * from pg_stat_replication"      Tue Jul 31 13:12:08 2018
    -[ RECORD 1 ]----+------------------------------
    pid              | 3792
    usesysid         | 16448
    usename          | slave
    application_name | walreceiver
    client_addr      | 192.168.55.62
    client_hostname  |
    client_port      | 44654
    backend_start    | 2018-07-30 13:41:41.707514+08
    backend_xmin     |
    state            | streaming
    sent_location    | 0/60933D78
    write_location   | 0/60933D78
    flush_location   | 0/60933D78
    replay_location  | 0/60933D78
    sync_priority    | 0
    sync_state       | async

    上記の「watch」コマンドは、1秒ごとにpsqlコマンドを実行します。レプリケーションが発生すると、それに応じて「*_location」列が更新されるはずです。

    テストの最後に、概要が表示されます。

    SQL statistics:
        queries performed:
            read:                            67704
            write:                           19322
            other:                           9682
            total:                           96708
        transactions:                        4830   (79.34 per sec.)
        queries:                             96708  (1588.53 per sec.)
        ignored errors:                      6      (0.10 per sec.)
        reconnects:                          0      (0.00 per sec.)
    
    General statistics:
        total time:                          60.8723s
        total number of events:              4830
    
    Latency (ms):
             min:                                    4.52
             avg:                                  799.70
             max:                                 8082.70
             95th percentile:                     2279.14
             sum:                              3862532.62
    
    Threads fairness:
        events (avg/stddev):           75.4688/7.39
        execution time (avg/stddev):   60.3521/0.20

    上記の要約は、PostgreSQLデータベースサーバーが64のワーカースレッドで平均して1秒あたり約80トランザクション、1秒あたり約1588クエリを処理できることを示しています。

    読み取り専用ロード

    読み取り専用テストの場合、同じコマンドを使用できますが、LUAスクリプトを select.luaに変更します。 、 select_random_points.lua select_random_ranges.lua またはoltp_simple.lua

    $ sysbench \
    --db-driver=pgsql \
    --report-interval=2 \
    --oltp-table-size=100000 \
    --oltp-tables-count=24 \
    --threads=64 \
    --time=60 \
    --pgsql-host=192.168.55.62 \
    --pgsql-port=5432 \
    --pgsql-user=sbtest \
    --pgsql-password=password \
    --pgsql-db=sbtest \
    /usr/share/sysbench/tests/include/oltp_legacy/select.lua \
    run

    上記のコマンドは、 select.luaという読み取り専用のワークロードを実行します PostgreSQLスレーブサーバー(ストリーミングレプリケーション)に対して、64個のワーカースレッドを持つ192.168.55.62。

    その他の負荷

    このディレクトリ/usr / share / sysbench / tests / include / oltp_legacy の下にリストされているように、sysbenchで生成できる他の多くのOLTPワークロードがあります。 :

    $ ls -1 /usr/share/sysbench/tests/include/oltp_legacy/
    bulk_insert.lua
    common.lua
    delete.lua
    insert.lua
    oltp.lua
    oltp_simple.lua
    parallel_prepare.lua
    select.lua
    select_random_points.lua
    select_random_ranges.lua
    update_index.lua
    update_non_index.lua

    同様のコマンドを使用し、LUAスクリプトへのパスを変更してロードすることができます。

    最終的な考え

    sysbenchを使用して、PostgreSQLサーバー(およびMySQL)のテストロードを生成できます。最良のベンチマークは実際のデータとアプリケーションを使用することですが、それが常に可能であるとは限らないことに注意してください。また、急速に進化する新しいアプリケーションになる可能性もあります。 sysbenchによって生成される負荷は、実際のOLTPワークロードを表していない可能性がありますが、それで十分な場合があります。


    1. Mavericksを使用してMacにPGgemをインストールできません

    2. SQL Server2019の新機能

    3. PostgreSQLは部分インデックスを使用しません

    4. ロックされた行を待たないようにするためのアドバイザリロックまたはNOWAIT?