PostgreSQLの採用が拡大するにつれて、データベース管理者(DBA)や開発者は、さまざまなワークロード下で効率的にアプリケーションを実行するためにそのパフォーマンスを評価する必要があります。パフォーマンスベンチマークは、PostgreSQLがさまざまな負荷をどのように処理するかを測定する重要なプロセスであり、ボトルネックや最適化のための領域を特定するのに役立ちます。この記事では、ツール、メトリクス、およびテストシナリオを探求し、あなたがプロのようにPostgreSQLをベンチマークするのを支援します。
PostgreSQLをベンチマークする理由
ベンチマークを行うことで、以下のことができます:
- 特定のワークロード下でデータベースのスループットとレイテンシを測定します。
- ハードウェアや構成のボトルネックを特定します。
- インデックスの変更やクエリの書き換えなどの最適化の影響を比較します。
- 高同時ユーザーアクティビティや大量のデータ書き込みなど、実世界のシナリオをシミュレートします。
追跡すべき主要なメトリクス
PostgreSQLをベンチマークする際には、以下のメトリクスに焦点を当ててください:
- TPS(1秒間あたりのトランザクション数):データベースが1秒間に完了するトランザクション数を測定します。
- IOPS(1秒間あたりの入出力操作数):ディスクのアクティビティを追跡します。
- レイテンシ:クエリの実行にかかる時間を測定し、ユーザーエクスペリエンスに影響を与えます。
- リソース利用状況:ベンチマーク中のCPU、メモリ、およびディスク使用状況を追跡します。
PostgreSQLベンチマークツール
1. pgbench
pgbenchとは何ですか?
pgbench
はPostgreSQLに組み込まれたベンチマークツールです。複数のクライアントがトランザクションを実行し、データベースのパフォーマンスを計測します。
インストール
PostgreSQLのインストールにバンドルされています。確認するには、次のコマンドを実行してください:
bash
pgbench --version
はじめに
1. ベンチマークデータベースを初期化します:
bash
pgbench -i -s 50 mydb
ここで、-s
はデータセットのサイズを決定するスケーリングファクターを設定します。
2. 簡単なベンチマークを実行します:
bash
pgbench -c 10 -j 2 -T 60 mydb
-c 10
:クライアント接続数。-j 2
:スレッド数。-T 60
:ベンチマークの継続時間(秒)。
サンプル出力:
transaction type: TPC-B (sort of)
scaling factor: 50
number of clients: 10
number of threads: 2
duration: 60 s
tps = 1420.123 (excluding connections establishing)
2. Sysbench
Sysbenchを使用する理由
Sysbenchはデータベースやシステム向けの多目的ベンチマークツールです。カスタムワークロードに対して、pgbench
よりも柔軟性を提供します。
インストール
Sysbenchを以下のコマンドを使用してインストールします:
bash
sudo apt-get install sysbench
はじめに
1. ベンチマークを準備します:
bash
sysbench --db-driver=pgsql --pgsql-db=mydb \
--pgsql-user=postgres --tables=10 --table-size=1000000 \
oltp_read_write prepare
2. ベンチマークを実行します:
bash
sysbench --db-driver=pgsql --pgsql-db=mydb \
--pgsql-user=postgres --threads=4 \
--time=60 oltp_read_write run
3. pg_stat_statements
pg_stat_statementsとは何ですか?
PostgreSQLの拡張機能は、クエリのパフォーマンスと実行統計を追跡します。ワークロードをシミュレートするわけではありませんが、ベンチマーク中に遅いクエリを分析するのに役立ちます。
セットアップ
1. postgresql.conf
で拡張機能を有効にします:
shared_preload_libraries = 'pg_stat_statements'
2. 構成をリロードして拡張機能を作成します:
CREATE EXTENSION pg_stat_statements;
使用法
長時間実行されるステートメントを特定するには、次のクエリを実行します:
SELECT query, total_exec_time, calls
FROM pg_stat_statements
ORDER BY total_exec_time DESC;
ベンチマークシナリオ
以下は、3つのシナリオ(読み取り重視、書き込み重視、およびミックスワークロード)のベンチマーク結果の視覚的表現です。 秒間トランザクション数(TPS)の図は、PostgreSQLが効率的に同時トランザクションを処理する能力を示し、遅延の図はクエリの実行にかかる時間をミリ秒単位で示しています。
PostgreSQLの秒間トランザクション数(TPS)
PostgreSQLクエリ遅延
ワークロードの種類
1. 読み取り重視のワークロード
目的: 高い読み取りアクティビティ下でのデータベースパフォーマンスをテストします。
セットアップ: デフォルトの読み取り専用トランザクションを使用してpgbench
を実行します:
bash
pgbench -c 50 -T 120 -S mydb
-S
: SELECTクエリのみを実行します。-c 50
: 50の同時クライアントをシミュレートします。
2. 書き込み重視のワークロード
目的: 頻繁な挿入または更新によるデータベースパフォーマンスを測定します。
セットアップ: ベンチマークを書き込みを含めるように変更します。
bash
pgbench -c 20 -j 4 -T 120 -N mydb
-N
: 非SELECTクエリを実行します。
3. 読み書き混合のワークロード
目的: 読み込みと書き込みを混在させた実世界のワークロードをシミュレートします。
セットアップ: バランスのとれた構成を使用します:
bash
pgbench -c 30 -j 4 -T 180 mydb
ベンチマーク結果を向上させるためのPostgreSQLの最適化
メモリ設定の調整
postgresql.conf
内のこれらのパラメータを調整します:
shared_buffers = 25% of system memory
work_mem = 4MB
maintenance_work_mem = 64MB
並列クエリ実行を有効にする
postgresql.conf
内のこれらのパラメータを調整します:
max_parallel_workers_per_gather = 4
ディスクI/Oの最適化
WALファイルにSSDを使用し、これらの設定を調整します:
wal_buffers = 16MB
synchronous_commit = off
結果の例と解釈
シナリオ: 60秒間、50の並行クライアントが読み込み重視のワークロードを実行します。
出力:
tps = 2500.456 (excluding connections establishing)
解釈: このワークロード下でデータベースは1秒あたり2500トランザクションを処理できる能力があります。
期待よりもTPSが低い場合は、パフォーマンスのボトルネックを特定するためにEXPLAIN ANALYZE
を使用してクエリプランを分析してください。
結論
PostgreSQLのベンチマークテストは、パフォーマンスの制限を特定し、さまざまなワークロードに最適化する強力な方法です。 pgbench
やsysbench
などのツールを使用し、pg_stat_statements
からの洞察を組み合わせることで、実世界のシナリオをシミュレートし、PostgreSQLの設定を微調整できます。
これらのツールとテクニックを習得することで、PostgreSQLインスタンスが読み取り集中型および書き込み重視のアプリケーションの両方で高いパフォーマンスを提供することができます。
Source:
https://dzone.com/articles/how-to-benchmark-postgresql-for-optimal-performance