SlideShare a Scribd company logo
1 of 47
Download to read offline
PostgreSQLの 
パラレル化に向けた取り組み 
2014.10.11 
(仮名)PostgreSQL勉強会 
株式会社メトロシステムズ 
花田茂
Who am I? 
• 氏名:花田茂 
• 所属:株式会社メトロシステムズ 
• 連絡:@s87 
• 経歴: 
• PostgreSQLは7.4から 
• 周辺ツール開発(pg_bulkload/pg_rman/pg_lesslog/Etc.) 
• 最近は外部テーブル関連で本体開発 
• 勉強会やOCSなどで講演 
2
パラレル化って?
パラレル化って? 
• definition of Parallel 
• (of lines, planes, surfaces, or objects) side by side 
and having the same distance continuously between 
them: parallel lines never meet | the road runs parallel 
to the Ottawa River. 
• definition of Concurrent 
• existing, happening, or done at the same time: there 
are three concurrent art fairs around the city. 
出典:アメリカ英英辞典 on OS X Mavericks 
4
パラレル化って? 
• parallel=パラレル=並列 
! 
! 
! 
• concurrent=コンカレント=並行 
5
難しいことは 
置いといて
パラレル=高速化 
• 一人でやるよりみんなでやる方が早いよね! 
• ただし… 
• 誰が何をやれば良い? 
• いつから始められる? 
• 終わったらどうすればいい? 
当然、一筋縄では 
行きません 
7
どのあたりが難しいのか? 
• 対象の決定 
• どの処理を高速化するか? 
• 問題の分割 
• どの部分をパラレルに分けるか? 
• 動作の協調 
• 処理主体(=プロセス)をどのように起動するか? 
• どうやって、各自が何をすべきか知るか? 
• 情報の受け渡し 
• 入力・出力をどのように受け渡すか? 
8
対象の決定 
• 性能改善の基本は「ボトルネック解消」 
• ボトルネック以外を速くしても効果は薄い 
• 「クリティカルパス」を明確に 
• 例)データロードの場合 
• 最大テーブルのロード 
• 例)PostgreSQLのクエリ 
• SQLパース+プラン生成+最大テーブルのスキャン 
9
対象の決定 
• パラレル化で早くなるか? 
• ボトルネックの原因がパラレル化で解消されるか? 
• リソースさえあれば分割可能な処理か? 
• 処理単位の依存関係が整理されているか? 
10
対象の決定 
• PostgreSQLでいうと? 
• クエリ実行の要素 
• プラン生成 
• テーブルスキャン 
• 結合 
• ソート 
• Etc. 
• クエリ実行要素間 
• 結合の片側をソート中にもう片方をスキャン、など 
11
対象の決定 
• PostgreSQLでいうと? 
• その他 
• WAL書き込み 
• チェックポイント 
• テーブルメンテナンス 
• VACUUM、ANALYZE、REINDEX 
• ALTER TABLE 
• バックアップ取得 
12
問題の分割 
• どう分割したら早くなるか? 
• まじめに考えると論文書けるレベルの問題がてんこ盛り 
• スーパーコンピュータの超並列処理はここを頑張ってる? 
• PostgreSQLの中の人たちの腕の見せ所 
例題:100人分のカレーを作る 
13
問題の分割 
• カレーの調理手順 
• 米を研ぐ 
• 米を炊く 
• 肉を切る 
• 肉を炒める 
• 野菜を切る 
• 野菜を炒める 
14 
! 
• 鍋に入れる 
• 煮込む 
• カレールーを入れる 
• 皿にご飯を盛る 
• 皿にカレーを盛る 
• 配膳
問題の分割 
野菜を切る 
15 
肉を切る 
野菜を炒める肉を炒める 
鍋に入れる 
米を研ぐ 
米を炊く 
煮込む 
カレールーを入れる 
皿にご飯を盛る皿にカレーを盛る配膳
問題の分割 
Seq Scan 
16 
Seq Scan 
Sort Sort 
Merge Join 
Index Scan 
Aggregate 
Sort 
Aggregate 
Limit Append Limit
PostgreSQLの 
アーキテクチャ 
17
動作の協調 
• PostgreSQLはプロセスベース 
• セッション障害がインスタンス全体に波及しない 
• オーバーヘッドはスレッドより大きい 
• インスタンスに所属するプロセスの一覧を管理 
• PGPROCという構造体の配列を共有メモリ上に配置 
• postmaster(≒インスタンス)起動時に初期化 
• PGPROCは同期機構のラッチを持つ 
18
動作の協調 
• プロセス間のやりとり 
• 共有メモリ 
• シグナル 
• プロセス間の同期 
• スピンロック:超短期間(数十命令程度)用 
• 軽量ロック:共有メモリ資源の保護 
• ラッチ:複数プロセスからセットできる真偽値 
19
動作の協調 
• MVCC 
• 概要 
• Multi Version Concurrency Control 
• 更新時に古いバージョンを残したまま新しいバージョン 
を追加することで、特定タプルの可視性を効率的に判断 
する仕組み 
• 判断材料 
• 自TXのID(XID) 
• スナップショット(アクティブなTXのリスト) 
• タプルの作成/削除TX(xmin/xmax/cmin/cmax) 
20
情報の受け渡し 
• 基本的には共有メモリを使用 
• 既存の仕組みをそのまま共有メモリに展開すれば…と思い 
ますが、一筋縄(ry 
• PostgreSQLはヒープメモリの管理に独自アロケータを 
使用 
• 細かく確保した後に「コンテキスト」という単位で一括 
解放が可能 
• 共有メモリには非対応 
• 既存ルーチンで扱うには「ヒープ→共有→ヒープ」というメ 
モリコピーが必要 
21
パラレル化への 
取り組み
パラレル化への取り組み 
• 9.2 
• スナップショットエクスポート 
• 9.3 
• pg_dumpの--jobsオプションサポート 
• pg_upgradeの--jobsオプションサポート 
23
パラレル化への取り組み 
• 9.4(予定) 
• 動的バックグラウンドワーカー 
• Allow background worker processes to be 
dynamically registered, started and terminated 
(Robert Haas) 
• 動的共有メモリ 
• Allow dynamic allocation of shared memory 
segments (Robert Haas, Amit Kapila) 
• 共有メッセージキュー 
• Add single-reader, single-writer, lightweight shared 
message queue (Robert Haas) 
24
パラレル化への取り組み 
• 9.5(予定) 
• On partitioning (Alvaro Herrera) 
• 1st class objectとしてのパーティション 
• 議論/開発継続中 
• Introducing coarse grain parallelism by 
postgres_fdw(Kyotaro Horiguchi) 
• postgres_fdwでリモートクエリを非同期実行して待機 
時間を節約 
• 設計見直しが必要 
25
スナップショットの共有 
• pg_export_snapshot()関数 
• 現在のトランザクションのスナップショットを$PGDATA/ 
pg_snapshotsに書き出すし、スナップショットIDを返す 
• ファイル名=スナップショットID 
• SET TRANSACTION SNAPSHOT ‘スナップ 
ショットID’; 
• 指定したIDのスナップショットを現在のトランザクション 
で使用する 
26
動的バックグラウンドワーカー 
• 概要 
• 9.3で導入されたカスタムバックグラウンドワーカーの拡張 
• 9.3ではインスタンス起動時にのみ起動できたが、9.4から 
は、バックエンドからのAPI呼び出しで任意のタイミングで 
起動可能 
• 動的に起動したバックグラウンドワーカーの終了は 
SIGUSR1で通知可能 
• 起動数はmax_worker_processesで制御可能 
• つまり… 
• クエリ内容に応じて特定処理のバックグラウンドワーカー 
を起動し、その終了を起動したバックエンド側で検知可能 
27
動的バックグラウンドワーカー 
• API(バックエンド用) 
• RegisterDynamicBackgroundWorker() 
• バックエンドから動的BGWorkerを登録 
• WaitForBackgroundWorkerStartup() 
• 動的BGWorkerの起動を待機 
• GetBackgroundWorkerPid() 
• BGWorkerのPIDと状態を取得 
• TerminateBackgroundWorker() 
• PostmasterにBGWorkerの停止を依頼 
28
動的バックグラウンドワーカー 
• API(BGWorker用) 
• BackgroundWorkerInitializeConnection() 
• ローカルデータベースに接続 
• BackgroundWorkerUnblockSignals() 
• BGWorkerプロセスへのシグナルブロックを解除 
29
共有メッセージキュー 
• 概要 
• 共有メモリ上に配置したプロセス間メッセージキュー 
• 書き込み一人、読み込み一人の制限 
• 書き込み/読み込みはロックフリー 
• 読み書きはそれぞれPGPROCにエントリのあるプロセス 
• 読みと書きの間はプロセスラッチで同期 
• メッセージ長は任意 
• キューは固定長でリングバッファ構造 
30
共有メッセージキュー 
• API 
• shm_mq_create() 
• メッセージキューを生成 
• shm_mq_set_receiver()/shm_mq_set_sender() 
• 読み出し/書き込みプロセスを設定 
• shm_mq_get_receiver()/shm_mq_get_sender() 
• 読み出し/書き込みプロセスのPGPROCを取得 
31
共有メッセージキュー 
• API 
• shm_mq_attach() 
• メッセージキューにアタッチしてハンドルを取得 
• shm_mq_wait_for_attach() 
• メッセージキューへのアタッチを待機 
• shm_mq_detach() 
• メッセージキューからデタッチ 
32
共有メッセージキュー 
• API 
• shm_mq_send()/shm_mq_receive() 
• 可変長のメッセージを書き込む/読み出す 
• ラッチでキューの空き/メッセージの到着を待機すること 
も可能 
33
こんなことが 
できるようになる(仮)
スキャンの分割 
• あるテーブルのスキャンを複数プロセスで分担 
• ページで分割 
• テーブルで分割(パーティション/シャーディング) 
• 課題点 
• 複数プロセスでのタプル可視性の共有 
• 結果のとりまとめ 
35
スキャンの分割 
ワーカーが 
スキャン 
36 
ページ1 
ページ2 
ページ3 
ページ4 
ページ5 
ページ6 
ページ7 
ページ8 
ワーカー 
ワーカー 
バック 
エンド 
起動 
起動 
キュー経由で 
結果を渡す
ソートの分割 
• ある結果セットのソートを複数プロセスで分担 
• ページで分割 
• テーブルで分割(パーティション/シャーディング) 
• 課題点 
• 入力の分配(HadoopでいうMap処理) 
• 結果のとりまとめ 
37
ソートの分割 
ワーカーが 
部分ソート 
38 
ワーカー 
ワーカー 
バック 
エンド 
起動 
起動 
キュー経由で 
結果を渡す 
バックエンド 
で最終ソート
集約の分割 
• 概要 
• ある結果セットの集約を複数プロセスで分担 
• MAX()/MIN()やCOUNT()は多段集約が容易 
• AVG()などはやや困難? 
• 課題点 
• 入力の分配 
• 結果のとりまとめ 
39
集約の分割 
ワーカーが 
部分集約 
40 
ワーカー 
ワーカー 
バック 
エンド 
起動 
起動 
キュー経由で 
結果を渡す 
バックエンド 
で最終集約
データロードの分割 
• 概要 
• バルクINSERTやCOPYを複数プロセスで分担 
• 文字列→内部表現変換もパラレル化できると効果大 
• 複数セッションでのINSERT/COPYと異なり1トランザ 
クションで完結 
• 課題点 
• 追加先の衝突回避 
• WALバッファのボトルネック化 
41
もう少しローレベルに
I/OとCPUの分割 
• 概要 
• I/O待ちってもったいないよね? 
• その間にCPU使う処理できるんじゃない? 
• スキャン開始時にfadvise()などでread ahead 
• postgres_fdwなどで非同期クエリ 
• 課題点 
• 先読み(投機的実行)はパイプライニングと相性が悪い? 
• effective_io_concurrencyで十分? 
• スピンドル数に基づいて同時I/O発行数を制御 
43
CPU処理の分割 
• 概要 
• スキャン結果のフィルタリング(WHERE句適用)などは 
CPU処理 
• 対象行数が多い場合はCPUでの並列処理にも限界 
• GPUでSIMDしちゃえば? 
• 課題点 
• 任意のコードをGPU側でコンパイル・実行する機能が必要 
• pg_stromが開発中 
44
残っている課題 
• パラレル実行のプラン生成 
• パラレル実行のコストを正しく見積もれるか? 
• コスト算出を現実的な時間で完了できるか? 
45
残っている課題 
• リソース制御 
• プロセス数やメモリ量、CPU使用率といったリソースを核 
処理がどこまで使用してよいか?をクラスタ全体よりも細 
かい粒度で制御する仕組みが必要 
• これがないと、リソース枯渇でシステムダウンも 
• work_memなども意味を変える必要あり? 
46
ご清聴ありがとうございました。 
Questions?

More Related Content

What's hot

バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
Ryota Watabe
 

What's hot (20)

PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
 
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatib...
 
PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
PGCon 2023 参加報告(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
ZOZOTOWNのマルチクラウドへの挑戦と挫折、そして未来
ZOZOTOWNのマルチクラウドへの挑戦と挫折、そして未来ZOZOTOWNのマルチクラウドへの挑戦と挫折、そして未来
ZOZOTOWNのマルチクラウドへの挑戦と挫折、そして未来
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
[Postgre sql9.4新機能]レプリケーション・スロットの活用
[Postgre sql9.4新機能]レプリケーション・スロットの活用[Postgre sql9.4新機能]レプリケーション・スロットの活用
[Postgre sql9.4新機能]レプリケーション・スロットの活用
 
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
オンライン物理バックアップの排他モードと非排他モードについて ~PostgreSQLバージョン15対応版~(第34回PostgreSQLアンカンファレンス...
 
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するかSQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL16新機能紹介 - libpq接続ロード・バランシング(第41回PostgreSQLアンカンファレンス@オンライン 発表資料)
 
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
 
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
 
PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説PostgreSQL 15の新機能を徹底解説
PostgreSQL 15の新機能を徹底解説
 
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
速習!論理レプリケーション ~基礎から最新動向まで~(PostgreSQL Conference Japan 2022 発表資料)
 
まずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニングまずやっとくPostgreSQLチューニング
まずやっとくPostgreSQLチューニング
 
Google Cloud で実践する SRE
Google Cloud で実践する SRE  Google Cloud で実践する SRE
Google Cloud で実践する SRE
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
AWS Batch Fargate対応は何をもたらすか
AWS Batch Fargate対応は何をもたらすかAWS Batch Fargate対応は何をもたらすか
AWS Batch Fargate対応は何をもたらすか
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 

Viewers also liked

Viewers also liked (20)

PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介PostgreSQL 9.6 新機能紹介
PostgreSQL 9.6 新機能紹介
 
並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ並列クエリを実行するPostgreSQLのアーキテクチャ
並列クエリを実行するPostgreSQLのアーキテクチャ
 
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
PostgreSQL 9.5 新機能紹介
PostgreSQL 9.5 新機能紹介PostgreSQL 9.5 新機能紹介
PostgreSQL 9.5 新機能紹介
 
Djangoで業務改善したい
Djangoで業務改善したいDjangoで業務改善したい
Djangoで業務改善したい
 
pgconfasia2016 plcuda en
pgconfasia2016 plcuda enpgconfasia2016 plcuda en
pgconfasia2016 plcuda en
 
PostgreSQL実行計画入門@関西PostgreSQL勉強会
PostgreSQL実行計画入門@関西PostgreSQL勉強会PostgreSQL実行計画入門@関西PostgreSQL勉強会
PostgreSQL実行計画入門@関西PostgreSQL勉強会
 
[OSC2016沖縄]商用DBからPostgreSQLへの移行入門
[OSC2016沖縄]商用DBからPostgreSQLへの移行入門[OSC2016沖縄]商用DBからPostgreSQLへの移行入門
[OSC2016沖縄]商用DBからPostgreSQLへの移行入門
 
20170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#820170127 JAWS HPC-UG#8
20170127 JAWS HPC-UG#8
 
PostgreSQLとPythonとSQL
PostgreSQLとPythonとSQLPostgreSQLとPythonとSQL
PostgreSQLとPythonとSQL
 
bottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアルbottle.pyをつかったチャットアプリ作成チュートリアル
bottle.pyをつかったチャットアプリ作成チュートリアル
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
 
DeNAでのverticaを活用したアナリスト業務のご紹介
DeNAでのverticaを活用したアナリスト業務のご紹介DeNAでのverticaを活用したアナリスト業務のご紹介
DeNAでのverticaを活用したアナリスト業務のご紹介
 
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database AnalyticsPL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
 
bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩bottleで始めるWEBアプリの最初の一歩
bottleで始めるWEBアプリの最初の一歩
 
性能測定道 実践編
性能測定道 実践編性能測定道 実践編
性能測定道 実践編
 
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
PostgreSQLアーキテクチャ入門(INSIGHT OUT 2011)
 
(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する(JP) GPGPUがPostgreSQLを加速する
(JP) GPGPUがPostgreSQLを加速する
 
PostgreSQLアンチパターン
PostgreSQLアンチパターンPostgreSQLアンチパターン
PostgreSQLアンチパターン
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 

Similar to PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会

Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセス
Makoto Kato
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
Insight Technology, Inc.
 

Similar to PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会 (20)

PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
PostgreSQLアーキテクチャ入門(PostgreSQL Conference 2012)
 
いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理いまさら聞けないPostgreSQL運用管理
いまさら聞けないPostgreSQL運用管理
 
PostgreSQLバックアップの基本
PostgreSQLバックアップの基本PostgreSQLバックアップの基本
PostgreSQLバックアップの基本
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門PostgreSQLアーキテクチャ入門
PostgreSQLアーキテクチャ入門
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code reading
 
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
PostgreSQLのトラブルシューティング@第5回中国地方DB勉強会
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセス
 
Pythonの非同期処理を始める前に
Pythonの非同期処理を始める前にPythonの非同期処理を始める前に
Pythonの非同期処理を始める前に
 
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web serviceYAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
 
Jubatusでマルウェア分類
Jubatusでマルウェア分類Jubatusでマルウェア分類
Jubatusでマルウェア分類
 
Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011 Code Reading at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011
 
Ossで作成するチーム開発環境
Ossで作成するチーム開発環境Ossで作成するチーム開発環境
Ossで作成するチーム開発環境
 
Hadoop Summit 2016 San Jose ストリーム処理関連の報告 #streamctjp
Hadoop Summit 2016 San Jose ストリーム処理関連の報告 #streamctjpHadoop Summit 2016 San Jose ストリーム処理関連の報告 #streamctjp
Hadoop Summit 2016 San Jose ストリーム処理関連の報告 #streamctjp
 
C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努C16 45分でわかるPostgreSQLの仕組み by 山田努
C16 45分でわかるPostgreSQLの仕組み by 山田努
 
Apache Auroraの始めかた
Apache Auroraの始めかたApache Auroraの始めかた
Apache Auroraの始めかた
 
生物データベース論(並列分散計算フレームワーク)
生物データベース論(並列分散計算フレームワーク)生物データベース論(並列分散計算フレームワーク)
生物データベース論(並列分散計算フレームワーク)
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
 

More from Shigeru Hanada

More from Shigeru Hanada (12)

PostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 FukuokaPostgreSQL 10 新機能 @OSC 2017 Fukuoka
PostgreSQL 10 新機能 @OSC 2017 Fukuoka
 
PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017PostgreSQL 10 新機能 @オープンセミナー香川 2017
PostgreSQL 10 新機能 @オープンセミナー香川 2017
 
Foreign Data Wrapper Enhancements
Foreign Data Wrapper EnhancementsForeign Data Wrapper Enhancements
Foreign Data Wrapper Enhancements
 
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
OSS-DB Gold技術解説セミナー@db tech showcase 東京 2014
 
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 HiroshimaPostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
 
OSS-DB Goldへの第一歩~実践!運用管理~
OSS-DB Goldへの第一歩~実践!運用管理~OSS-DB Goldへの第一歩~実践!運用管理~
OSS-DB Goldへの第一歩~実践!運用管理~
 
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
PostgreSQL開発ことはじめ - 第27回しくみ+アプリケーション勉強会
 
9.3で進化した外部テーブル
9.3で進化した外部テーブル9.3で進化した外部テーブル
9.3で進化した外部テーブル
 
Extending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanExtending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 Japan
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
 
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@KyotoPostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
PostgreSQL 9.2 新機能 - OSC 2012 Kansai@Kyoto
 
外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張
 

Recently uploaded

Recently uploaded (11)

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

PostgreSQLのパラレル化に向けた取り組み@第30回(仮名)PostgreSQL勉強会

  • 1. PostgreSQLの パラレル化に向けた取り組み 2014.10.11 (仮名)PostgreSQL勉強会 株式会社メトロシステムズ 花田茂
  • 2. Who am I? • 氏名:花田茂 • 所属:株式会社メトロシステムズ • 連絡:@s87 • 経歴: • PostgreSQLは7.4から • 周辺ツール開発(pg_bulkload/pg_rman/pg_lesslog/Etc.) • 最近は外部テーブル関連で本体開発 • 勉強会やOCSなどで講演 2
  • 4. パラレル化って? • definition of Parallel • (of lines, planes, surfaces, or objects) side by side and having the same distance continuously between them: parallel lines never meet | the road runs parallel to the Ottawa River. • definition of Concurrent • existing, happening, or done at the same time: there are three concurrent art fairs around the city. 出典:アメリカ英英辞典 on OS X Mavericks 4
  • 5. パラレル化って? • parallel=パラレル=並列 ! ! ! • concurrent=コンカレント=並行 5
  • 7. パラレル=高速化 • 一人でやるよりみんなでやる方が早いよね! • ただし… • 誰が何をやれば良い? • いつから始められる? • 終わったらどうすればいい? 当然、一筋縄では 行きません 7
  • 8. どのあたりが難しいのか? • 対象の決定 • どの処理を高速化するか? • 問題の分割 • どの部分をパラレルに分けるか? • 動作の協調 • 処理主体(=プロセス)をどのように起動するか? • どうやって、各自が何をすべきか知るか? • 情報の受け渡し • 入力・出力をどのように受け渡すか? 8
  • 9. 対象の決定 • 性能改善の基本は「ボトルネック解消」 • ボトルネック以外を速くしても効果は薄い • 「クリティカルパス」を明確に • 例)データロードの場合 • 最大テーブルのロード • 例)PostgreSQLのクエリ • SQLパース+プラン生成+最大テーブルのスキャン 9
  • 10. 対象の決定 • パラレル化で早くなるか? • ボトルネックの原因がパラレル化で解消されるか? • リソースさえあれば分割可能な処理か? • 処理単位の依存関係が整理されているか? 10
  • 11. 対象の決定 • PostgreSQLでいうと? • クエリ実行の要素 • プラン生成 • テーブルスキャン • 結合 • ソート • Etc. • クエリ実行要素間 • 結合の片側をソート中にもう片方をスキャン、など 11
  • 12. 対象の決定 • PostgreSQLでいうと? • その他 • WAL書き込み • チェックポイント • テーブルメンテナンス • VACUUM、ANALYZE、REINDEX • ALTER TABLE • バックアップ取得 12
  • 13. 問題の分割 • どう分割したら早くなるか? • まじめに考えると論文書けるレベルの問題がてんこ盛り • スーパーコンピュータの超並列処理はここを頑張ってる? • PostgreSQLの中の人たちの腕の見せ所 例題:100人分のカレーを作る 13
  • 14. 問題の分割 • カレーの調理手順 • 米を研ぐ • 米を炊く • 肉を切る • 肉を炒める • 野菜を切る • 野菜を炒める 14 ! • 鍋に入れる • 煮込む • カレールーを入れる • 皿にご飯を盛る • 皿にカレーを盛る • 配膳
  • 15. 問題の分割 野菜を切る 15 肉を切る 野菜を炒める肉を炒める 鍋に入れる 米を研ぐ 米を炊く 煮込む カレールーを入れる 皿にご飯を盛る皿にカレーを盛る配膳
  • 16. 問題の分割 Seq Scan 16 Seq Scan Sort Sort Merge Join Index Scan Aggregate Sort Aggregate Limit Append Limit
  • 18. 動作の協調 • PostgreSQLはプロセスベース • セッション障害がインスタンス全体に波及しない • オーバーヘッドはスレッドより大きい • インスタンスに所属するプロセスの一覧を管理 • PGPROCという構造体の配列を共有メモリ上に配置 • postmaster(≒インスタンス)起動時に初期化 • PGPROCは同期機構のラッチを持つ 18
  • 19. 動作の協調 • プロセス間のやりとり • 共有メモリ • シグナル • プロセス間の同期 • スピンロック:超短期間(数十命令程度)用 • 軽量ロック:共有メモリ資源の保護 • ラッチ:複数プロセスからセットできる真偽値 19
  • 20. 動作の協調 • MVCC • 概要 • Multi Version Concurrency Control • 更新時に古いバージョンを残したまま新しいバージョン を追加することで、特定タプルの可視性を効率的に判断 する仕組み • 判断材料 • 自TXのID(XID) • スナップショット(アクティブなTXのリスト) • タプルの作成/削除TX(xmin/xmax/cmin/cmax) 20
  • 21. 情報の受け渡し • 基本的には共有メモリを使用 • 既存の仕組みをそのまま共有メモリに展開すれば…と思い ますが、一筋縄(ry • PostgreSQLはヒープメモリの管理に独自アロケータを 使用 • 細かく確保した後に「コンテキスト」という単位で一括 解放が可能 • 共有メモリには非対応 • 既存ルーチンで扱うには「ヒープ→共有→ヒープ」というメ モリコピーが必要 21
  • 23. パラレル化への取り組み • 9.2 • スナップショットエクスポート • 9.3 • pg_dumpの--jobsオプションサポート • pg_upgradeの--jobsオプションサポート 23
  • 24. パラレル化への取り組み • 9.4(予定) • 動的バックグラウンドワーカー • Allow background worker processes to be dynamically registered, started and terminated (Robert Haas) • 動的共有メモリ • Allow dynamic allocation of shared memory segments (Robert Haas, Amit Kapila) • 共有メッセージキュー • Add single-reader, single-writer, lightweight shared message queue (Robert Haas) 24
  • 25. パラレル化への取り組み • 9.5(予定) • On partitioning (Alvaro Herrera) • 1st class objectとしてのパーティション • 議論/開発継続中 • Introducing coarse grain parallelism by postgres_fdw(Kyotaro Horiguchi) • postgres_fdwでリモートクエリを非同期実行して待機 時間を節約 • 設計見直しが必要 25
  • 26. スナップショットの共有 • pg_export_snapshot()関数 • 現在のトランザクションのスナップショットを$PGDATA/ pg_snapshotsに書き出すし、スナップショットIDを返す • ファイル名=スナップショットID • SET TRANSACTION SNAPSHOT ‘スナップ ショットID’; • 指定したIDのスナップショットを現在のトランザクション で使用する 26
  • 27. 動的バックグラウンドワーカー • 概要 • 9.3で導入されたカスタムバックグラウンドワーカーの拡張 • 9.3ではインスタンス起動時にのみ起動できたが、9.4から は、バックエンドからのAPI呼び出しで任意のタイミングで 起動可能 • 動的に起動したバックグラウンドワーカーの終了は SIGUSR1で通知可能 • 起動数はmax_worker_processesで制御可能 • つまり… • クエリ内容に応じて特定処理のバックグラウンドワーカー を起動し、その終了を起動したバックエンド側で検知可能 27
  • 28. 動的バックグラウンドワーカー • API(バックエンド用) • RegisterDynamicBackgroundWorker() • バックエンドから動的BGWorkerを登録 • WaitForBackgroundWorkerStartup() • 動的BGWorkerの起動を待機 • GetBackgroundWorkerPid() • BGWorkerのPIDと状態を取得 • TerminateBackgroundWorker() • PostmasterにBGWorkerの停止を依頼 28
  • 29. 動的バックグラウンドワーカー • API(BGWorker用) • BackgroundWorkerInitializeConnection() • ローカルデータベースに接続 • BackgroundWorkerUnblockSignals() • BGWorkerプロセスへのシグナルブロックを解除 29
  • 30. 共有メッセージキュー • 概要 • 共有メモリ上に配置したプロセス間メッセージキュー • 書き込み一人、読み込み一人の制限 • 書き込み/読み込みはロックフリー • 読み書きはそれぞれPGPROCにエントリのあるプロセス • 読みと書きの間はプロセスラッチで同期 • メッセージ長は任意 • キューは固定長でリングバッファ構造 30
  • 31. 共有メッセージキュー • API • shm_mq_create() • メッセージキューを生成 • shm_mq_set_receiver()/shm_mq_set_sender() • 読み出し/書き込みプロセスを設定 • shm_mq_get_receiver()/shm_mq_get_sender() • 読み出し/書き込みプロセスのPGPROCを取得 31
  • 32. 共有メッセージキュー • API • shm_mq_attach() • メッセージキューにアタッチしてハンドルを取得 • shm_mq_wait_for_attach() • メッセージキューへのアタッチを待機 • shm_mq_detach() • メッセージキューからデタッチ 32
  • 33. 共有メッセージキュー • API • shm_mq_send()/shm_mq_receive() • 可変長のメッセージを書き込む/読み出す • ラッチでキューの空き/メッセージの到着を待機すること も可能 33
  • 35. スキャンの分割 • あるテーブルのスキャンを複数プロセスで分担 • ページで分割 • テーブルで分割(パーティション/シャーディング) • 課題点 • 複数プロセスでのタプル可視性の共有 • 結果のとりまとめ 35
  • 36. スキャンの分割 ワーカーが スキャン 36 ページ1 ページ2 ページ3 ページ4 ページ5 ページ6 ページ7 ページ8 ワーカー ワーカー バック エンド 起動 起動 キュー経由で 結果を渡す
  • 37. ソートの分割 • ある結果セットのソートを複数プロセスで分担 • ページで分割 • テーブルで分割(パーティション/シャーディング) • 課題点 • 入力の分配(HadoopでいうMap処理) • 結果のとりまとめ 37
  • 38. ソートの分割 ワーカーが 部分ソート 38 ワーカー ワーカー バック エンド 起動 起動 キュー経由で 結果を渡す バックエンド で最終ソート
  • 39. 集約の分割 • 概要 • ある結果セットの集約を複数プロセスで分担 • MAX()/MIN()やCOUNT()は多段集約が容易 • AVG()などはやや困難? • 課題点 • 入力の分配 • 結果のとりまとめ 39
  • 40. 集約の分割 ワーカーが 部分集約 40 ワーカー ワーカー バック エンド 起動 起動 キュー経由で 結果を渡す バックエンド で最終集約
  • 41. データロードの分割 • 概要 • バルクINSERTやCOPYを複数プロセスで分担 • 文字列→内部表現変換もパラレル化できると効果大 • 複数セッションでのINSERT/COPYと異なり1トランザ クションで完結 • 課題点 • 追加先の衝突回避 • WALバッファのボトルネック化 41
  • 43. I/OとCPUの分割 • 概要 • I/O待ちってもったいないよね? • その間にCPU使う処理できるんじゃない? • スキャン開始時にfadvise()などでread ahead • postgres_fdwなどで非同期クエリ • 課題点 • 先読み(投機的実行)はパイプライニングと相性が悪い? • effective_io_concurrencyで十分? • スピンドル数に基づいて同時I/O発行数を制御 43
  • 44. CPU処理の分割 • 概要 • スキャン結果のフィルタリング(WHERE句適用)などは CPU処理 • 対象行数が多い場合はCPUでの並列処理にも限界 • GPUでSIMDしちゃえば? • 課題点 • 任意のコードをGPU側でコンパイル・実行する機能が必要 • pg_stromが開発中 44
  • 45. 残っている課題 • パラレル実行のプラン生成 • パラレル実行のコストを正しく見積もれるか? • コスト算出を現実的な時間で完了できるか? 45
  • 46. 残っている課題 • リソース制御 • プロセス数やメモリ量、CPU使用率といったリソースを核 処理がどこまで使用してよいか?をクラスタ全体よりも細 かい粒度で制御する仕組みが必要 • これがないと、リソース枯渇でシステムダウンも • work_memなども意味を変える必要あり? 46