SlideShare a Scribd company logo
10
Most read
12
Most read
13
Most read
© 2025 NTT DATA Group Corporation
© 2025 NTT DATA Group Corporation 1
第51回 PostgreSQLアンカンファレンス
pgbenchのスレッドとクライアント
2025年1月31日 NTTデータグループ 技術革新統括本部 笠原辰仁
© 2025 NTT DATA Group Corporation 2
自己紹介
笠原辰仁
NTTデータグループ所属
長年PostgreSQLのサポート、技術支援、性能検証や周辺ツールの開発などをしてきました。
最近はYugabyteDBなどの分散SQLデータベースなども取り扱っています。
© 2025 NTT DATA Group Corporation 3
はじめに
PostgreSQLに付随するpgbenchを使ったことがある人も多いと思います。
本日はこのpgbenchがどのようにして大量のクライアント(コネクション)を生成し、PostgreSQLに
対して並列で負荷をかけているのか?を解説します。
特に-jオプション(スレッド数)と-cオプション(クライアント数)の関係性について悩まれる方も多いと
思うので、そこにスコープをあてた内容にしています。
資料は後日に https://www.slideshare.net/nttdata-tech で公開します。
© 2025 NTT DATA Group Corporation 4
pgbenchとは
もともとはPostgreSQLのcontribにあったベンチマークツールで、PostgreSQL9.5(2016年リリース)から
はPostgreSQL本体に取り込まれています。
TPC-Bのワークロードをデフォルトで実施するほか、ユーザ定義のカスタムスクリプトによる柔軟なワークロー
ドをシミュレート可能です。同実行数、試験時間、実行トランザクション総数、スロットル調整(スループット
の指定)などベンチマークツールに必要とされる機能は一通り持っています。
その他、変数の設定/生成(ランダム値、ハッシュ値など)/演算などを行うpgbench組み込みの関数や演
算子、メタコマンドが揃っており高度なシナリオを実施することができます。ベンチマーク結果の詳細なログや
サマリレポート機能なども備えているため使い勝手はとても良いです。
注意点としてはDBに対するSELECT結果などを利用することができない、などです。
(参考:pgbenchのマニュアル)
https://www.postgresql.jp/document/16/html/pgbench.html
© 2025 NTT DATA Group Corporation 5
【参考】 pgbenchの実行例
$ pgbench -c 10 -T 10 -r
pgbench (17.2)
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 1
maximum number of tries: 1
duration: 10 s
number of transactions actually processed: 1823
number of failed transactions: 0 (0.000%)
latency average = 55.008 ms
initial connection time = 17.557 ms
tps = 181.791874 (without initial connection time)
statement latencies in milliseconds and failures:
0.004 0 ¥set aid random(1, 100000 * :scale)
0.001 0 ¥set bid random(1, 1 * :scale)
0.001 0 ¥set tid random(1, 10 * :scale)
0.001 0 ¥set delta random(-5000, 5000)
0.284 0 BEGIN;
0.440 0 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
0.279 0 SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
21.981 0 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
26.402 0 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
0.333 0 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
5.128 0 END;
© 2025 NTT DATA Group Corporation 6
pgbenchのスレッド数とクライアント数のオプション
pgbenchにはスレッド数とクライアント数を指定するオプションがあります。以下はマニュアルの記載
をそのまま持ってきたものです。
-c/--client
模擬するクライアント数、つまり、同時に実行されるデータベースセッション数です。 デフォルトは
1です。
-j/--jobs
pgbench内のワーカースレッド数です。 複数のスレッドを使用することはマルチCPUマシンで
有用になります。 クライアントは利用可能なスレッドの間でできる限り均等に分散されます。 デ
フォルトは1です。
(補足:ちなみにクライアント数より大きい数値をスレッド数に指定するとスレッド数はクライアント
数と同じとなります。)
© 2025 NTT DATA Group Corporation 7
pgbenchのスレッドとクライアント
ワーカースレッドは指定したクライアント数を均等に分担します。
Thread
Conn
Conn
Conn
Conn
Conn
Conn
Thread
Conn
Conn
Conn
Conn
Conn
Conn
Thread
Conn
Conn
Conn
Conn
Conn
Conn
Thread
Thread
Thread
-j 1 –c 6の場合 -j 2 –c 6の場合 -j 3 –c 6の場合
© 2025 NTT DATA Group Corporation 8
pgbenchはどのようにして多数のクライアントを制御しているか?
pgbenchのワーカースレッドがクライアントを制御していますが、以下にして数百ものクライアントを
さばいているのか?ポイントはlibpqの非同期コマンドの利用です。
pgbenchはC言語で書かれており、PostgreSQLへの接続やクエリの実施にPostgreSQLのC
クライアントライブラリであるlibpqを使っています。libpqにはPostgreSQLへクエリを発行した際、
その結果を待たない(発行の成功可否だけ確認する)非同期処理用のAPIがあります。
この処理を使って高速に多数の接続の処理をさばいています。
非同期処理のAPI例
int PQsendQuery(Conn1 *conn, const char *command);
結果を待つことなく、サーバにコマンドを発行します。 コマンドの登録に成功した場合1が、失敗した場合0が返されま
す。 (後者の場合、PQerrorMessageを使用して失敗についてのより多くの情報を取り出してください。)
参考:非同期コマンドの処理
https://www.postgresql.jp/document/16/html/libpq-async.html
© 2025 NTT DATA Group Corporation 9
pgbenchによる内部処理の概要
pgbenchのスレッドにおける処理概要は以下の通りです。
• 事前処理
• これはスクリプト内のコマンドのパースや事前のVACUUMなど
• スレッド生成
• 規定数の接続生成
• 処理実施 (以下の処理高速に繰り返す)
• 各接続ごとに: 非同期クエリの実施 or (未完了)クエリ完了の待機 or (完了後)次のクエリ準備
• クエリやトランザクション単位レスポンスを計算しログに書いたりスレッド単位の性能情報を記録
• メインスレッドは他スレッドの性能情報を集約し、定期レポートを表示
• 規定の時間/Tx数に達したら完了
• メインスレッドは各スレッドの性能情報を集計しレポート
基本的にこの流れとなります。スレッドでは各接続ごとに状態をステートマシンとして管理しており、ステートを
どんどん遷移させています。
© 2025 NTT DATA Group Corporation 10
pgbenchによる内部処理の概要
pgbenchのスレッドにおける処理概要を簡単に図示すると以下の通りです。
Thread
Conn1
Conn2
Conn3
Thread
Conn1
Conn2
Conn3
Thread
Conn1
Conn2
Conn3
①Conn1へ非同期でクエリ実施。
結果を待たず次の接続へ。
Thread
Conn1
Conn2
Conn3
Thread
Conn1
Conn2
Conn3
Thread
Conn1
Conn2
Conn3
②Conn2へ非同期でクエリ実施。
結果を待たず次の接続へ。
Send
Send
Send
③Conn3へ非同期でクエリ実施。
結果を待たず次の接続へ。
この間にConn1の結果受領完了。
Result
④Conn1のクエリ完了を確認し次のクエリを実施。
結果を待たず次の接続へ。
Send
⑤Conn2のクエリの未完了を
確認し次の接続へ。
この間にConn3の結果受領
Result Send
⑥ Conn3のクエリ完了を確認し次のクエリを実施。
結果を待たず次の接続へ。
© 2025 NTT DATA Group Corporation 11
【参考】 pgbenchの各接続のステート
正常系の代表的なステート遷移。(異常系やスロットルの処理などは除いて抜粋しています)
前述の処理はかなり簡素化して表現しており、実際には多様なステートを持っています。接続毎にステート
をひとつずつ進めながら(遷移させながら)処理を行っています。
CSTATE_CHOOSE_SCRIPT
CSTATE_START_TX
CSTATE_FINISHED
CSTATE_START_COMMAND
CSTATE_WAIT_RESULT
CSTATE_END_COMMAND
CSTATE_END_TX
実行するスクリプト選択からスタート
トランザクション開始
次のコマンドがない
コマンド送付成功
(非同期処理)
コマンド結果全受領
(非同期処理)
次のコマンドの実施へ
実施時間/Txが規定に達した
トランザクション完了
次のスクリプトへ
FINISHEDで完了
スクリプトを選択
© 2025 NTT DATA Group Corporation 12
スレッド数の指定方針
1スレッドで多数の接続を受け持つ場合、暇になるクライアントが増える可能性がある。特にDBサーバが高
スペックな場合にはその傾向が出やすい。
つまりPostgreSQLに十分に負荷をかけきれずpgbenchネックになる可能性がある。厄介なことにマルチコ
ア環境だと見た目でpgbenchネックかどうか分かりにくい・・
そのため、スレッド数を調整するのがおススメ・・だが、スレッド数はどれくらいにしておくのが良いのか?
• 軽量なクエリかつ接続数が多い場合はスレッド数を増やすことを検討
• pgbenchを動かす負荷クライアントマシンのコア数が目安
• スレッド数が多すぎるとコアの競合が顕在化したり、ログが増えて集計が面倒なので注意
ちなみにpgbenchのマルチスレッドはPostgreSQL9.0でサポートされました。
https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=3da0dfb4b1460c3701abc
8ed5f516d138dc4654c
2009年の当時では8core(物理4core HT on)でスレッド数8にすると最も良いスループットを叩き出せ
たようです。おそらく現在でも同様の傾向ではないかと思います。
© 2025 NTT DATA Group Corporation 13
おわりに
pgbenchのスレッドとクライアントについて解説している資料があまり見当たらなかったため、本日
紹介してみました。
ベンチマークは諸条件を適切に理解し設定しないと、正しく性能を測ることができません。
スレッド数指定以外にも、十分な時間を測定できているか?(チェックポイントやauto vacuumの
発生を意識しているか)、スケールファクタは適切か?(小さすぎるとロック待ち、大きすぎるとIOネッ
ク)などなど、注意することが多いです。
オプションの意味や作用を意識して適切な測定を心掛けましょう。
その他、記載されている会社名、商品名、又はサービス名は、各
社の登録商標又は商標です。

More Related Content

PDF
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQL: XID周回問題に潜む別の問題
PPTX
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
PDF
pg_stat_activityの不可解な観測結果の謎 (第47回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
NTT DATA と PostgreSQL が挑んだ総力戦
PDF
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
オンライン物理バックアップの排他モードと非排他モードについて(第15回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL: XID周回問題に潜む別の問題
PostgreSQLのfull_page_writesについて(第24回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
pg_stat_activityの不可解な観測結果の謎 (第47回 PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA と PostgreSQL が挑んだ総力戦
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)

What's hot (20)

PDF
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
PDF
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
PDF
PostgreSQL 13でのpg_stat_statementsの改善について(第12回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQL 15の新機能を徹底解説
PPTX
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PDF
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQL 15 開発最新情報
PDF
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
PPTX
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PPTX
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PPTX
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
auto_explainのススメ (第48回 PostgreSQLアンカンファレンス 発表資料)
PDF
PostgreSQL13でのpg_basebackupの改善について(第13回PostgreSQLアンカンファレンス@オンライン)
PDF
DBスキーマもバージョン管理したい!
PPTX
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
Vacuum徹底解説
PDF
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLレプリケーション10周年!徹底紹介!(PostgreSQL Conference Japan 2019講演資料)
レプリケーション遅延の監視について(第40回PostgreSQLアンカンファレンス@オンライン 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
PostgreSQL 13でのpg_stat_statementsの改善について(第12回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL 15の新機能を徹底解説
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
Memoizeの仕組み(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL 15 開発最新情報
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
コンテナセキュリティにおける権限制御(OCHaCafe5 #3 Kubernetes のセキュリティ 発表資料)
PostgreSQLモニタリング機能の現状とこれから(Open Developers Conference 2020 Online 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLの統計情報について(第26回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16でのロールに関する変更点(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
auto_explainのススメ (第48回 PostgreSQLアンカンファレンス 発表資料)
PostgreSQL13でのpg_basebackupの改善について(第13回PostgreSQLアンカンファレンス@オンライン)
DBスキーマもバージョン管理したい!
pg_bigmで全文検索するときに気を付けたい5つのポイント(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
Vacuum徹底解説
pg_hint_planを知る(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
Ad

Similar to pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料) (20)

PDF
Kof2016 postgresql-9.6
PPTX
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
PDF
Chugoku db 17th-postgresql-9.6
PDF
[db tech showcase Tokyo 2015] B15:最新PostgreSQLはパフォーマンスが飛躍的に向上する!? - PostgreSQ...
PDF
Hackers Champloo 2016 postgresql-9.6
PDF
PostgreSQL 9.6 新機能紹介
PDF
並列クエリを実行するPostgreSQLのアーキテクチャ
PDF
PostgreSQL9.3新機能紹介
PPTX
PostgreSQLのソース・ターゲットエンドポイントとしての利用
PPTX
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PDF
PostgreSQLによるデータ分析ことはじめ
PDF
[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe
PDF
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
PDF
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
PDF
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PDF
PostgreSQL10徹底解説
PDF
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PDF
PostgreSQL開発コミュニティに参加しよう! (オープンデベロッパーズカンファレンス(ODC)2024 発表資料)
Kof2016 postgresql-9.6
Postgres Playground で pgbench を走らせよう!(第35回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会
Chugoku db 17th-postgresql-9.6
[db tech showcase Tokyo 2015] B15:最新PostgreSQLはパフォーマンスが飛躍的に向上する!? - PostgreSQ...
Hackers Champloo 2016 postgresql-9.6
PostgreSQL 9.6 新機能紹介
並列クエリを実行するPostgreSQLのアーキテクチャ
PostgreSQL9.3新機能紹介
PostgreSQLのソース・ターゲットエンドポイントとしての利用
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLによるデータ分析ことはじめ
[C31] OSS-DB Exam Silver 技術解説セミナー by Ryota Watabe
[よくわかるクラウドデータベース] Amazon RDS for PostgreSQL検証報告
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
アナリティクスをPostgreSQLで始めるべき10の理由@第6回 関西DB勉強会
PostgreSQL10を導入!大規模データ分析事例からみるDWHとしてのPostgreSQL活用のポイント
PostgreSQL10徹底解説
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQL開発コミュニティに参加しよう! (オープンデベロッパーズカンファレンス(ODC)2024 発表資料)
Ad

More from NTT DATA Technology & Innovation (20)

PDF
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
PDF
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
PDF
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
2025年現在のNewSQL (最強DB講義 #36 発表資料)
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)

pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)

  • 1. © 2025 NTT DATA Group Corporation © 2025 NTT DATA Group Corporation 1 第51回 PostgreSQLアンカンファレンス pgbenchのスレッドとクライアント 2025年1月31日 NTTデータグループ 技術革新統括本部 笠原辰仁
  • 2. © 2025 NTT DATA Group Corporation 2 自己紹介 笠原辰仁 NTTデータグループ所属 長年PostgreSQLのサポート、技術支援、性能検証や周辺ツールの開発などをしてきました。 最近はYugabyteDBなどの分散SQLデータベースなども取り扱っています。
  • 3. © 2025 NTT DATA Group Corporation 3 はじめに PostgreSQLに付随するpgbenchを使ったことがある人も多いと思います。 本日はこのpgbenchがどのようにして大量のクライアント(コネクション)を生成し、PostgreSQLに 対して並列で負荷をかけているのか?を解説します。 特に-jオプション(スレッド数)と-cオプション(クライアント数)の関係性について悩まれる方も多いと 思うので、そこにスコープをあてた内容にしています。 資料は後日に https://www.slideshare.net/nttdata-tech で公開します。
  • 4. © 2025 NTT DATA Group Corporation 4 pgbenchとは もともとはPostgreSQLのcontribにあったベンチマークツールで、PostgreSQL9.5(2016年リリース)から はPostgreSQL本体に取り込まれています。 TPC-Bのワークロードをデフォルトで実施するほか、ユーザ定義のカスタムスクリプトによる柔軟なワークロー ドをシミュレート可能です。同実行数、試験時間、実行トランザクション総数、スロットル調整(スループット の指定)などベンチマークツールに必要とされる機能は一通り持っています。 その他、変数の設定/生成(ランダム値、ハッシュ値など)/演算などを行うpgbench組み込みの関数や演 算子、メタコマンドが揃っており高度なシナリオを実施することができます。ベンチマーク結果の詳細なログや サマリレポート機能なども備えているため使い勝手はとても良いです。 注意点としてはDBに対するSELECT結果などを利用することができない、などです。 (参考:pgbenchのマニュアル) https://www.postgresql.jp/document/16/html/pgbench.html
  • 5. © 2025 NTT DATA Group Corporation 5 【参考】 pgbenchの実行例 $ pgbench -c 10 -T 10 -r pgbench (17.2) starting vacuum...end. transaction type: <builtin: TPC-B (sort of)> scaling factor: 1 query mode: simple number of clients: 10 number of threads: 1 maximum number of tries: 1 duration: 10 s number of transactions actually processed: 1823 number of failed transactions: 0 (0.000%) latency average = 55.008 ms initial connection time = 17.557 ms tps = 181.791874 (without initial connection time) statement latencies in milliseconds and failures: 0.004 0 ¥set aid random(1, 100000 * :scale) 0.001 0 ¥set bid random(1, 1 * :scale) 0.001 0 ¥set tid random(1, 10 * :scale) 0.001 0 ¥set delta random(-5000, 5000) 0.284 0 BEGIN; 0.440 0 UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid; 0.279 0 SELECT abalance FROM pgbench_accounts WHERE aid = :aid; 21.981 0 UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid; 26.402 0 UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid; 0.333 0 INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP); 5.128 0 END;
  • 6. © 2025 NTT DATA Group Corporation 6 pgbenchのスレッド数とクライアント数のオプション pgbenchにはスレッド数とクライアント数を指定するオプションがあります。以下はマニュアルの記載 をそのまま持ってきたものです。 -c/--client 模擬するクライアント数、つまり、同時に実行されるデータベースセッション数です。 デフォルトは 1です。 -j/--jobs pgbench内のワーカースレッド数です。 複数のスレッドを使用することはマルチCPUマシンで 有用になります。 クライアントは利用可能なスレッドの間でできる限り均等に分散されます。 デ フォルトは1です。 (補足:ちなみにクライアント数より大きい数値をスレッド数に指定するとスレッド数はクライアント 数と同じとなります。)
  • 7. © 2025 NTT DATA Group Corporation 7 pgbenchのスレッドとクライアント ワーカースレッドは指定したクライアント数を均等に分担します。 Thread Conn Conn Conn Conn Conn Conn Thread Conn Conn Conn Conn Conn Conn Thread Conn Conn Conn Conn Conn Conn Thread Thread Thread -j 1 –c 6の場合 -j 2 –c 6の場合 -j 3 –c 6の場合
  • 8. © 2025 NTT DATA Group Corporation 8 pgbenchはどのようにして多数のクライアントを制御しているか? pgbenchのワーカースレッドがクライアントを制御していますが、以下にして数百ものクライアントを さばいているのか?ポイントはlibpqの非同期コマンドの利用です。 pgbenchはC言語で書かれており、PostgreSQLへの接続やクエリの実施にPostgreSQLのC クライアントライブラリであるlibpqを使っています。libpqにはPostgreSQLへクエリを発行した際、 その結果を待たない(発行の成功可否だけ確認する)非同期処理用のAPIがあります。 この処理を使って高速に多数の接続の処理をさばいています。 非同期処理のAPI例 int PQsendQuery(Conn1 *conn, const char *command); 結果を待つことなく、サーバにコマンドを発行します。 コマンドの登録に成功した場合1が、失敗した場合0が返されま す。 (後者の場合、PQerrorMessageを使用して失敗についてのより多くの情報を取り出してください。) 参考:非同期コマンドの処理 https://www.postgresql.jp/document/16/html/libpq-async.html
  • 9. © 2025 NTT DATA Group Corporation 9 pgbenchによる内部処理の概要 pgbenchのスレッドにおける処理概要は以下の通りです。 • 事前処理 • これはスクリプト内のコマンドのパースや事前のVACUUMなど • スレッド生成 • 規定数の接続生成 • 処理実施 (以下の処理高速に繰り返す) • 各接続ごとに: 非同期クエリの実施 or (未完了)クエリ完了の待機 or (完了後)次のクエリ準備 • クエリやトランザクション単位レスポンスを計算しログに書いたりスレッド単位の性能情報を記録 • メインスレッドは他スレッドの性能情報を集約し、定期レポートを表示 • 規定の時間/Tx数に達したら完了 • メインスレッドは各スレッドの性能情報を集計しレポート 基本的にこの流れとなります。スレッドでは各接続ごとに状態をステートマシンとして管理しており、ステートを どんどん遷移させています。
  • 10. © 2025 NTT DATA Group Corporation 10 pgbenchによる内部処理の概要 pgbenchのスレッドにおける処理概要を簡単に図示すると以下の通りです。 Thread Conn1 Conn2 Conn3 Thread Conn1 Conn2 Conn3 Thread Conn1 Conn2 Conn3 ①Conn1へ非同期でクエリ実施。 結果を待たず次の接続へ。 Thread Conn1 Conn2 Conn3 Thread Conn1 Conn2 Conn3 Thread Conn1 Conn2 Conn3 ②Conn2へ非同期でクエリ実施。 結果を待たず次の接続へ。 Send Send Send ③Conn3へ非同期でクエリ実施。 結果を待たず次の接続へ。 この間にConn1の結果受領完了。 Result ④Conn1のクエリ完了を確認し次のクエリを実施。 結果を待たず次の接続へ。 Send ⑤Conn2のクエリの未完了を 確認し次の接続へ。 この間にConn3の結果受領 Result Send ⑥ Conn3のクエリ完了を確認し次のクエリを実施。 結果を待たず次の接続へ。
  • 11. © 2025 NTT DATA Group Corporation 11 【参考】 pgbenchの各接続のステート 正常系の代表的なステート遷移。(異常系やスロットルの処理などは除いて抜粋しています) 前述の処理はかなり簡素化して表現しており、実際には多様なステートを持っています。接続毎にステート をひとつずつ進めながら(遷移させながら)処理を行っています。 CSTATE_CHOOSE_SCRIPT CSTATE_START_TX CSTATE_FINISHED CSTATE_START_COMMAND CSTATE_WAIT_RESULT CSTATE_END_COMMAND CSTATE_END_TX 実行するスクリプト選択からスタート トランザクション開始 次のコマンドがない コマンド送付成功 (非同期処理) コマンド結果全受領 (非同期処理) 次のコマンドの実施へ 実施時間/Txが規定に達した トランザクション完了 次のスクリプトへ FINISHEDで完了 スクリプトを選択
  • 12. © 2025 NTT DATA Group Corporation 12 スレッド数の指定方針 1スレッドで多数の接続を受け持つ場合、暇になるクライアントが増える可能性がある。特にDBサーバが高 スペックな場合にはその傾向が出やすい。 つまりPostgreSQLに十分に負荷をかけきれずpgbenchネックになる可能性がある。厄介なことにマルチコ ア環境だと見た目でpgbenchネックかどうか分かりにくい・・ そのため、スレッド数を調整するのがおススメ・・だが、スレッド数はどれくらいにしておくのが良いのか? • 軽量なクエリかつ接続数が多い場合はスレッド数を増やすことを検討 • pgbenchを動かす負荷クライアントマシンのコア数が目安 • スレッド数が多すぎるとコアの競合が顕在化したり、ログが増えて集計が面倒なので注意 ちなみにpgbenchのマルチスレッドはPostgreSQL9.0でサポートされました。 https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=3da0dfb4b1460c3701abc 8ed5f516d138dc4654c 2009年の当時では8core(物理4core HT on)でスレッド数8にすると最も良いスループットを叩き出せ たようです。おそらく現在でも同様の傾向ではないかと思います。
  • 13. © 2025 NTT DATA Group Corporation 13 おわりに pgbenchのスレッドとクライアントについて解説している資料があまり見当たらなかったため、本日 紹介してみました。 ベンチマークは諸条件を適切に理解し設定しないと、正しく性能を測ることができません。 スレッド数指定以外にも、十分な時間を測定できているか?(チェックポイントやauto vacuumの 発生を意識しているか)、スケールファクタは適切か?(小さすぎるとロック待ち、大きすぎるとIOネッ ク)などなど、注意することが多いです。 オプションの意味や作用を意識して適切な測定を心掛けましょう。