PostgreSQL/解析

Postmasterプロセスの処理

postmaster-overview.png

PostmasterMain関数

以下は、PostmasterMain関数postmaster/postmaster.c)の処理概要である。

  1. PostmasterContextの生成&メモリコンテキストのスイッチ
  2. シグナルの設定
  3. GUCオプションの初期化
  4. コマンドラインオプション解析
  5. 設定ファイルの読み込み
    1. postgresql.conf
    2. postgresql.auto.conf
    3. pg_hba.conf
    4. pg_ident.conf
  6. -C <gucname>指定があれば出力して終了
    • Ex: postgres -C work_mem
  7. Data directoryの検証
  8. WorkingDirectoryの変更( chdir(DataDir)
  9. GUCオプションの組み合わせのチェック、以下であること
    • superuser_reserved_connection < max_connections
    • max_wal_senders < max_connections
    • archive_modeが有効時、wal_level != minimal
    • max_wal_senders > 0 && wal_level != minimal
  10. Date token tableのチェック(文字列長、順序)
  11. Lockfile(postmaster.pid)の作成、以下が記録される
    1. Postmaster pid
    2. Date directory path
    3. MyStartTime(起動時刻)
    4. Port番号
    5. Unix socket directory
    6. First listen_address
    7. Shared memory key
    8. Postmaster status(starting / stopping / ready / standby)
  12. SSL有効の場合、SSLライブラリの初期化
  13. Logical replication launcherの登録(バックグラウンドワーカ)
  14. shared_preload_librariesのプレロード
  15. バックエンドプロセス数の初期値設定
    • max_connections + autovacuum_max_workers + 1 + max_worker_processes
  16. Serverソケット作成
  17. Unixドメインソケット作成
  18. 共有メモリとセマフォのセットアップ
  19. File Descriptor数の利用可能な最大値を計算
    • 関連パラメータmax_files_per_process
    • 最大数 = Min(利用可能なFD数, max_files_per_process - オープン済FD数) - NUM_RESERVED_FDS(予約FD数))
  20. スタック深さチェックで使用するベースとなるポインタをセット
    • 深い再帰となる関数呼び出しでスタック深さのチェックが行われる
    • 関連パラメータmax_stack_depth
  21. postmaster監視用のpipeを初期化
  22. postmaster.optsファイルの作成
    • ファイルには実行ファイルのパスが書き込まれる。ex: /path/to/postgres
  23. external_pid_file指定があれば、postmasterのプロセスIDを書き込む
  24. 一時ファイルを削除
    • base/pgsql_tmp、一時テーブル
  25. スタンバイ昇格リクエストのシグナルファイルを削除
    • promote
    • fallback_promote
  26. ログのメタファイルを削除
  27. 統計情報コレクタプロセスの初期化
  28. 自動バキュームの設定チェック
    • パラメータ設定のミスがあればwarningが表示される
    • autovacuum = onの場合、track_counts = onであること
  29. pg_hba.confのロード
  30. pg_ident.confのロード
  31. マルチスレッドが否かのチェック、マルチスレッドでpostmasterが実行されているとFATALで終了する
  32. postmasterの起動タイムスタンプを保存
  33. ロックファイル(postmaster.pid)にpostmasterのステータスstartingを書き込む
  34. StartupProcessの起動
  35. StartupStatusをSTARTUP_RUNNINGにする
    • STARTUP_NOT_RUNNING --> STARTUP_RUNNING
  36. postmasterのステータスをPM_STARTUPにする
  37. 起動すべきバックグラウンドワーカがあれば起動
  38. ServerLoop()の呼び出し

ServerLoop関数

  1. selectシステムコールのディスクリプタ集合のreadmaskを初期化
  2. pmStatePM_WAIT_DEAD_ENDの場合(selectをコールしない、子プロセスのshutdown待ち状態である)
    1. シグナルをアンブロック
    2. 100msecのスリープ
    3. シグナルをブロック
  3. pmStatePM_WAIT_DEAD_ENDでない場合
    1. ServerLoopのスリープ時間の決定
    2. シグナルをアンブロック
    3. selectシステムコールでソケットの監視
    4. シグナルをブロック
  4. リクエストを処理
    1. accept
    2. バックエンドの起動 -> 参考BackendStartup() - https://git.postgresql.org/gitweb/

postmasterの続き

  1. Log Collectorが有効で且つ動作していない場合、起動
  2. CheckPointerが動作していない場合、起動
  3. BackgroundWriterが動作していない場合、起動
  4. WALWriterが動作していない場合、起動
  5. autovacuum launcherが動作していない場合、起動
  6. stats collectorが動作していない場合、起動
  7. archiverが動作していない場合、起動
  8. auto vacuum launcherにシグナル(SIGUSR2)を生成する必要があれば、生成する
  9. WALReceiverを起動する必要があれば、起動
  10. 起動すべきバックグラウンドワーカ(クラッシュ含め)があれば、起動
  11. shutdownが遅い子プロセスに対し、シグナル(SIGKILL)を生成。
    • この以前にpostmasterはシグナル(SIGQUIT)を受信後、子プロセスにシグナル(SIGQUIT)を生成している
  12. Data Directoryのロックファイル(postmaster.pid)が不正な場合、postmasterにシグナル(SIGQUIT)(immediate shutdown)が生成される
    • ファイルが読み取れること、pidが一致していること
    • 前回チェック時から60sec以上の間隔で実施
  13. ソケットとロックファイルのアクセス時刻と修正時刻を更新する(utime
    • 前回チェック時から58sec以上の間隔で実施

2へ戻る

参考リンク


添付ファイル: filepostmaster-overview.png 78件 [詳細]
[PR]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-04 (日) 13:34:36 (286d)
GO TO TOP