- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- ソース を表示
- PostgreSQL/解析/バックグラウンドワーカプロセス へ行く。
バックグラウンドワーカプロセス †
PostgreSQLでは、クライアントコネクション接続を処理するバックエンドプロセスとは異なるプロセスを実行することができる。このバックグラウンドワーカプロセスは、postmasterプロセスによって起動(fork)され、ワーカプロセスの状態はpostmasterの起動・停止・監視とリンクしている。このバックグラウンドワーカの仕組みは、パラレルワーカでも使われており、バックエンドプロセスから動的にバックグラウンドワーカプロセスを登録(※)することも可能である。
バックグラウンドワーカは、バージョン9.3から機能追加されている。
9.4からは動的にバックグラウンドワーカを起動できるように拡張されている。
補足※ 登録と記述しているのは、実際にプロセス生成を行なうのがpostmasterプロセスであるためである。バックグラウンドワーカの起動は、呼び出し側がposmasterにシグナル送信(SIGUSR1)し、postmasterがforkすることで実現されている。
バックグラウンドワーカプロセスのフロー †
バックグラウンドワーカは、Postmaster起動時及び起動後のタイミングで登録することができる(便宜上、ここではPostmaster起動時のワーカを静的、Posmaster起動後のワーカを動的と呼ぶこととする)。静的、動的では以下の違いがある。
- 静的バックグラウンドワーカ(BackgroundWorker)
- postmaster起動時(postmasterプロセスからの呼び出し)
- shared_preload_librariesによる初期化中
- 動的バックグラウンドワーカ(DynamicBackgroundWorker)
- postmaster起動時以外(NOT postmasterプロセスからの呼び出し)。バックエンドプロセス、静的バックグラウンドワーカ、動的バックグラウンドワーカから登録が可能。
静的・動的でバックグラウンドワーカを登録する関数は異なるが、バックグラウンドワーカ自体は、同じ構造体変数で表現され、共有メモリ上のバックグラウンドワーカ配列で管理される。
BackgroundWorker構造体 †
バックグラウンドワーカの登録は、BackgroundWorker構造体を介して行なう。以下、静的バックグラウンドワーカを登録する例である。
void _PG_init(void) { BackgroundWorker worker; memset(&worker, 0, sizeof(worker)); // ワーカは、データベース接続を必要とする worker.bgw_flags = BGWORKER_SHMEM_ACCESS | BGWORKER_BACKEND_DATABASE_CONNECTION; /* リカバリ完了しクエリの受け付け可能になったタイミングで起動 */ worker.bgw_start_time = BgWorkerStart_RecoveryFinished; /* クラッシュしても再起動しない */ worker.bgw_restart_time = BGW_NEVER_RESTART; /* モジュール名 */ sprintf(worker.bgw_library_name, "myworker"); /* エントリーポイント */ sprintf(worker.bgw_function_name, "myworker_main"); /* 静的バックグラウンドワーカの場合は、0以外は無効(ワーカが登録されない) */ worker.bgw_notify_pid = 0; /* プロセスリストやログに表示される名前 */ snprintf(worker.bgw_name, BGW_MAXLEN, "myworker"); /* ワーカスロットに登録 */ RegisterBackgroundWorker(&worker); } /* * ワーカのエントリポイント */ void myworker_main(Datum main_arg) { /* ワーカの処理 */ }
参考リンク †
- 並列クエリを実行するPostgreSQLのアーキテクチャ - https://www.slideshare.net/kaigai/
- PostgreSQL 9.6.X 文書 第45章 バックグラウンドワーカプロセス - https://www.postgresql.jp/document/9.6/html/
- Chapter 47. Background Worker Processes - https://www.postgresql.org/docs/10/static/
- postmaster/bgworker.c - https://git.postgresql.org/gitweb/?p=postgresql.git;a=shortlog;h=refs/heads/REL_10_STABLE