PostgreSQL/開発

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

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

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

background-worker-overview.png

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

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

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

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

background-worker-process-image.png

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)
{
    /* ワーカの処理 */
}

参考リンク


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