Postmasterプロセスの処理 †
PostmasterMain関数 †
以下は、PostmasterMain関数(postmaster/postmaster.c)の処理概要である。
- PostmasterContextの生成&メモリコンテキストのスイッチ
- シグナルの設定
- GUCオプションの初期化
- コマンドラインオプション解析
- 設定ファイルの読み込み
- postgresql.conf
- postgresql.auto.conf
- pg_hba.conf
- pg_ident.conf
-C <gucname>
指定があれば出力して終了- Ex:
postgres -C work_mem
- Ex:
- Data directoryの検証
- WorkingDirectoryの変更(
chdir(DataDir)
) - GUCオプションの組み合わせのチェック、以下であること
superuser_reserved_connection
<max_connections
max_wal_senders
<max_connections
archive_mode
が有効時、wal_level
!=minimal
max_wal_senders
> 0 &&wal_level
!=minimal
- Date token tableのチェック(文字列長、順序)
- Lockfile(postmaster.pid)の作成、以下が記録される
- Postmaster pid
- Date directory path
- MyStartTime(起動時刻)
- Port番号
- Unix socket directory
- First listen_address
- Shared memory key
- Postmaster status(starting / stopping / ready / standby)
- SSL有効の場合、SSLライブラリの初期化
- Logical replication launcherの登録(バックグラウンドワーカ)
- shared_preload_librariesのプレロード
- バックエンドプロセス数の初期値設定
max_connections + autovacuum_max_workers + 1 + max_worker_processes
- Serverソケット作成
- Unixドメインソケット作成
- 共有メモリとセマフォのセットアップ
- File Descriptor数の利用可能な最大値を計算
- 関連パラメータ
max_files_per_process
- 最大数 =
Min(利用可能なFD数, max_files_per_process - オープン済FD数) - NUM_RESERVED_FDS(予約FD数))
- 関連パラメータ
- スタック深さチェックで使用するベースとなるポインタをセット
- 深い再帰となる関数呼び出しでスタック深さのチェックが行われる
- 関連パラメータ
max_stack_depth
- postmaster監視用のpipeを初期化
- postmaster.optsファイルの作成
- ファイルには実行ファイルのパスが書き込まれる。ex: /path/to/postgres
external_pid_file
指定があれば、postmasterのプロセスIDを書き込む- 一時ファイルを削除
- base/pgsql_tmp、一時テーブル
- スタンバイ昇格リクエストのシグナルファイルを削除
promote
fallback_promote
- ログのメタファイルを削除
current_logfiles
- 関連update_metainfo_datafile() - https://git.postgresql.org/gitweb/
- 統計情報コレクタプロセスの初期化
- UDPで通信、Portは初期化時に自動決定される(getsocknameで取得)
- 参考pgstat_init() - https://git.postgresql.org/gitweb/
- 自動バキュームの設定チェック
- パラメータ設定のミスがあればwarningが表示される
autovacuum = on
の場合、track_counts = on
であること
pg_hba.conf
のロードpg_ident.conf
のロード- マルチスレッドが否かのチェック、マルチスレッドでpostmasterが実行されているとFATALで終了する
- postmasterの起動タイムスタンプを保存
- ロックファイル(
postmaster.pid
)にpostmasterのステータスstarting
を書き込む - StartupProcessの起動
- 参考StartChildProcess() - https://git.postgresql.org/gitweb/
- fork()してpostmasterの子プロセスとして起動する。処理の終了と終了コードはシグナルでpostmasterに通知される(SIGCHILD)。
- StartupStatusを
STARTUP_RUNNING
にするSTARTUP_NOT_RUNNING --> STARTUP_RUNNING
- postmasterのステータスを
PM_STARTUP
にする- 参考PMState - https://git.postgresql.org/gitweb/
PM_INIT --> PM_STARTUP
- 起動すべきバックグラウンドワーカがあれば起動
- 参考maybe_start_bgworkers() - https://git.postgresql.org/gitweb/
bgw_start_time
がBgWorkerStart_PostmasterStart
であればここで起動される
- ServerLoop()の呼び出し
ServerLoop関数 †
- selectシステムコールのディスクリプタ集合のreadmaskを初期化
pmState
がPM_WAIT_DEAD_END
の場合(selectをコールしない、子プロセスのshutdown待ち状態である)- シグナルをアンブロック
- 100msecのスリープ
- シグナルをブロック
pmState
がPM_WAIT_DEAD_END
でない場合- ServerLoopのスリープ時間の決定
- シグナルをアンブロック
- selectシステムコールでソケットの監視
- シグナルをブロック
- リクエストを処理
- accept
- バックエンドの起動 -> 参考BackendStartup() - https://git.postgresql.org/gitweb/
postmasterの続き
- Log Collectorが有効で且つ動作していない場合、起動
- CheckPointerが動作していない場合、起動
- BackgroundWriterが動作していない場合、起動
- WALWriterが動作していない場合、起動
- autovacuum launcherが動作していない場合、起動
- stats collectorが動作していない場合、起動
- archiverが動作していない場合、起動
- auto vacuum launcherにシグナル(SIGUSR2)を生成する必要があれば、生成する
- WALReceiverを起動する必要があれば、起動
- 起動すべきバックグラウンドワーカ(クラッシュ含め)があれば、起動
- shutdownが遅い子プロセスに対し、シグナル(SIGKILL)を生成。
- この以前にpostmasterはシグナル(SIGQUIT)を受信後、子プロセスにシグナル(SIGQUIT)を生成している
- Data Directoryのロックファイル(postmaster.pid)が不正な場合、postmasterにシグナル(SIGQUIT)(immediate shutdown)が生成される
- ファイルが読み取れること、pidが一致していること
- 前回チェック時から60sec以上の間隔で実施
- ソケットとロックファイルのアクセス時刻と修正時刻を更新する(
utime
)- 前回チェック時から58sec以上の間隔で実施
2へ戻る