PostgreSQL/解析/バックグラウンドワーカプロセス のバックアップ(No.3)


PostgreSQL/開発

バックグラウンドワーカプロセス

PostgreSQLでは、クライアントコネクション接続を処理するバックエンドプロセスとは異なるプロセスを実行することができる。このバックグラウンドワーカプロセスは、postmasterプロセスによって起動(fork)され、ワーカプロセスの状態はpostmasterの起動・停止・監視とリンクしている。このバックグラウンドワーカの仕組みは、パラレルワーカでも使われており、バックエンドプロセスから動的にバックグラウンドワーカプロセスを登録(※)することも可能である。

バックグラウンドワーカは、バージョン9.3から機能追加されている。
9.4からは動的にバックグラウンドワーカを起動できるように拡張されている。

background-worker-overview.png

補足※ 登録と記述しているのは、実際にプロセス生成を行なうのがpostmasterプロセスであるためである。バックグラウンドワーカの起動は、呼び出し側がposmasterにシグナル送信(SIGUSR1)し、postmasterがforkすることで実現されている。

バックグラウンドワーカプロセスのフロー

バックグラウンドワーカは、Postmaster起動時及び起動後のタイミングで登録することができる(便宜上、ここではPostmaster起動時のワーカを静的、Posmaster起動後のワーカを動的と呼ぶこととする)。静的、動的では以下の違いがある。

  • 静的バックグラウンドワーカ(BackgroundWorker
    • postmaster起動時(postmasterプロセスからの呼び出し)
    • shared_preload_librariesによる初期化中
  • 動的バックグラウンドワーカ(DynamicBackgroundWorker
    • postmaster起動時以外NOT postmasterプロセスからの呼び出し)。バックエンドプロセス、静的バックグラウンドワーカ、動的バックグラウンドワーカから登録が可能。

静的・動的でバックグラウンドワーカを登録する関数は異なるが、バックグラウンドワーカ自体は、同じ構造体変数で表現され、共有メモリ上のバックグラウンドワーカ配列で管理される。

background-worker-process-image.png

BackgroundWorker構造体

バックグラウンドワーカの登録は、BackgroundWorker構造体を介して行なう。以下、静的バックグラウンドワーカを登録する例である。

/*
 * Module load callback
 */
void
_PG_init(void)
{
	BackgroundWorker worker;

	/* Setup worker information */
	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");

	/* Register a background worker */
	RegisterBackgroundWorker(&worker);
}

参考リンク


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
TOP | 閉じる | ダブルクリックで閉じる