第 9 课 PostgreSQL 4种进程启动方式

Postgres在启动后,可分别以一下四种形式启动进程:

    1. SubPostmasterMain
    1. AuxiliaryProcessMain
    1. PostgresMain
    1. PostmasterMain

SubPostmasterMain(--fork)

    1. 指明由postmaster派生
    1. 设置进程ID
    1. 初始化内存池
    1. 处理输入参数
    1. 运行相应的backend或子进程

    –forkbackend或–forkboot
    1) 关联到共享内存
    2) 初始化共享内存访问(UsedShmemSegAddr)
    3) 初始化AuxiliaryProcess
    4) 创建共享内存和信号量
    5) 启动AuxiliaryProcessMain

    –forkavlauncher
    1) 关联到共享内存
    2) AutovacuumLauncherIAm()
    3) 初始化共享内存访问(UsedShmemSegAddr)
    4) 初始化AuxiliaryProcess
    5) 创建共享内存和信号量
    6) 启动AutoVacLauncherMain

    –forkavworker
    1) 关联到共享内存
    2) AutovacuumLauncherIAm()
    3) 初始化共享内存访问(UsedShmemSegAddr)
    4) 初始化AuxiliaryProcess
    5) 创建共享内存和信号量
    6) 启动AutoVacWorkerMain

    –forkarch
    1) 启动PgArchiverMain

    –forkcol
    1) 启动PgstatCollectorMain

    –forklog
    1) 启动SysLoggerMain

AuxiliaryProcessMain(--boot)

  1. 设置进程ID
  2. 初始化内存池
  3. 设置路径、时间等变量
  4. 初始化GUC选项,处理输入参数
  5. 以BootstrapProcessing模式初始化一个backend:ipc, lock, file, storage, buffer
  6. 设置信号处理句柄
  7. 以NormalProcessing状态针对不同auxType分别进行以下处理
    a) CheckerProcess
    1) 启动CheckerModeMain
    b) BooststrapProcess
    1) BootstrapXLOG
    2) 启动XLOG
    3) 启动BootstrapModeMain
    c) StartupProcess
    1) 启动XLOG
    2) 加载FreeSpaceMap
    3) BuildFlatFiles(false)
    d) BgWriterProcess
    1) 初始化XLOG访问
    2) 启动BackgroundWriterMain
    e) WalWriterProcess
    1) 初始化XLOG访问
    2) 启动WalWriterMain

PostgresMain(--single)

  1. 设置进程ID
  2. 初始化内存池
  3. 设置路径、时间等变量
  4. 初始化GUC选项,处理输入参数和其他startup packet中的参数
  5. 设置信号处理句柄
  6. 初始化一个backend(无论它是否由postmaster生成):ipc, lock, file, storage, buffer
  7. 启动XLOG
  8. 加载FreeSpaceMap
  9. 初始化进程
  10. 初始化表缓存和系统目录访问
  11. 处理预加载的库
  12. 转到MessageContext内存池
  13. 进入查询处理主循环

PostmasterMain

  1. 设置进程ID
  2. 初始化内存池
  3. 设置路径、时间等变量
  4. 初始化GUC选项,处理输入参数并载入hba和ident
  5. 设置共享内存和信号量,初始化共享数据结构
  6. 设置信号处理句柄
  7. 启动守护进程:
    (1) syslogger:收集其他其他进程的日志输出,写入到文件
    (2) stats daemon:通过UDP获取各backend的运行时统计信息
    (3) autovacuum launcher:定期进行表空间的自动清理
  8. 由参数forkboot启动一个backend
  9. 绑定到TCP socket,监听连接请求
PostgreSQL版本使用的多线程

启动之后的线程:

  10   Thread 0x7fffe478e700 (LWP 42580) "kingbase" (Exiting) 0x00007ffff56c5bf7 in madvise () from /lib64/libc.so.6
  9    Thread 0x7fffe498f700 (LWP 42569) "kingbase" 0x00007ffff56c0bcd in poll () from /lib64/libc.so.6
  8    Thread 0x7fffe4fa7700 (LWP 42438) "kingbase" 0x00007ffff56c2943 in select () from /lib64/libc.so.6
  7    Thread 0x7fffe4b90700 (LWP 42437) "kingbase" 0x00007ffff56c2943 in select () from /lib64/libc.so.6
  5    Thread 0x7fffebef6700 (LWP 42327) "kingbase" 0x00007ffff569242d in nanosleep () from /lib64/libc.so.6
  4    Thread 0x7fffec0f7700 (LWP 42326) "kingbase" 0x00007ffff56c2943 in select () from /lib64/libc.so.6
  3    Thread 0x7fffec514700 (LWP 42323) "kingbase" 0x00007ffff56c2941 in select () from /lib64/libc.so.6
  2    Thread 0x7fffec715700 (LWP 42322) "kingbase" 0x00007ffff64c4e91 in sigwait () from /lib64/libpthread.so.0
* 1    Thread 0x7ffff7fd0140 (LWP 42318) "kingbase" 0x00007ffff56c2943 in select () from /lib64/libc.so.6
子线程创建调用
#0  ThreadCreate (start=0x8915a1 , args=0x18ddd70) at kos_signal.c:877
#1  0x0000000000891835 in internal_forkexec (argc=6, argv=0x7fffffffdd80, port=0x7fffffffdae0) at postmaster.c:5116
#2  0x00000000008914ff in postmaster_forkexec (argc=6, argv=0x7fffffffdd80) at postmaster.c:5029
#3  0x0000000000892571 in StartChildProcess (xlop=2) at postmaster.c:5854
#4  0x000000000088d002 in PostmasterMain (argc=5, argv=0x186ae60) at postmaster.c:2376
#5  0x00000000007c574f in main (argc=5, argv=0x186ae60) at main.c:288

#0  ThreadCreate (start=0x8915a1 , args=0x18ddd70) at kos_signal.c:877
#1  0x0000000000891835 in internal_forkexec (argc=6, argv=0x7fffffffd540, port=0x7fffffffd2a0) at postmaster.c:5116
#2  0x00000000008914ff in postmaster_forkexec (argc=6, argv=0x7fffffffd540) at postmaster.c:5029
#3  0x0000000000892571 in StartChildProcess (xlop=3) at postmaster.c:5854
#4  0x000000000088f880 in reaper (postgres_signal_arg=17) at postmaster.c:3936
#5  0x000000000087d31f in pg_dispatch_queued_signals () at kos_signal.c:499
#6  0x000000000087c5d1 in sigusr2_handler (postgres_signal_arg=12) at kos_signal.c:148
#7  
#8  0x00007ffff56c2943 in select () from /lib64/libc.so.6
#9  0x000000000088d5d0 in ServerLoop () at postmaster.c:2696
#10 0x000000000088d086 in PostmasterMain (argc=5, argv=0x186ae60) at postmaster.c:2413
#11 0x00000000007c574f in main (argc=5, argv=0x186ae60) at main.c:288

#0  ThreadCreate (start=0x8915a1 , args=0x18975a0) at kos_signal.c:877
#1  0x0000000000891835 in internal_forkexec (argc=6, argv=0x7fffffffd540, port=0x7fffffffd2a0) at postmaster.c:5116
#2  0x00000000008914ff in postmaster_forkexec (argc=6, argv=0x7fffffffd540) at postmaster.c:5029
#3  0x0000000000892571 in StartChildProcess (xlop=4) at postmaster.c:5854
#4  0x000000000088f8d3 in reaper (postgres_signal_arg=17) at postmaster.c:3949
#5  0x000000000087d31f in pg_dispatch_queued_signals () at kos_signal.c:499
#6  0x000000000087c5d1 in sigusr2_handler (postgres_signal_arg=12) at kos_signal.c:148
#7  
#8  0x00007ffff56c2943 in select () from /lib64/libc.so.6
#9  0x000000000088d5d0 in ServerLoop () at postmaster.c:2696
#10 0x000000000088d086 in PostmasterMain (argc=5, argv=0x186ae60) at postmaster.c:2413
#11 0x00000000007c574f in main (argc=5, argv=0x186ae60) at main.c:288

#0  ThreadCreate (start=0x8915a1 , args=0x18dde70) at kos_signal.c:877
#1  0x0000000000891835 in internal_forkexec (argc=3, argv=0x7fffffffd520, port=0x7fffffffd2b0) at postmaster.c:5116
#2  0x00000000008914ff in postmaster_forkexec (argc=3, argv=0x7fffffffd520) at postmaster.c:5029
#3  0x0000000000886c42 in pgstat_forkexec () at pgstat.c:508
#4  0x0000000000886d01 in pgstat_start () at pgstat.c:568
#5  0x000000000088f915 in reaper (postgres_signal_arg=17) at postmaster.c:3953
#6  0x000000000087d31f in pg_dispatch_queued_signals () at kos_signal.c:499
#7  0x000000000087c5d1 in sigusr2_handler (postgres_signal_arg=12) at kos_signal.c:148
#8  
#9  0x00007ffff56c2943 in select () from /lib64/libc.so.6
#10 0x000000000088d5d0 in ServerLoop () at postmaster.c:2696
#11 0x000000000088d086 in PostmasterMain (argc=5, argv=0x186ae60) at postmaster.c:2413
#12 0x00000000007c574f in main (argc=5, argv=0x186ae60) at main.c:288

#0  ThreadCreate (start=0x8915a1 , args=0x186cfd0) at kos_signal.c:877
#1  0x0000000000891835 in internal_forkexec (argc=3, argv=0x7fffffffdbe0, port=0x7fffffffd970) at postmaster.c:5116
#2  0x00000000008914ff in postmaster_forkexec (argc=3, argv=0x7fffffffdbe0) at postmaster.c:5029
#3  0x0000000000882d68 in autovac_forkexec () at autovacuum.c:522
#4  0x0000000000882c1f in autovac_start () at autovacuum.c:459
#5  0x000000000088d8a0 in ServerLoop () at postmaster.c:2845
#6  0x000000000088d086 in PostmasterMain (argc=5, argv=0x186ae60) at postmaster.c:2413
#7  0x00000000007c574f in main (argc=5, argv=0x186ae60) at main.c:288


共享内存初始化过程
- 主线程首次初始化
(gdb) bt
#0  InitBufTable (size=11664) at buf_table.c:60
#1  0x00000000008fa224 in StrategyInitialize (init=1 '\001') at freelist.c:342
#2  0x00000000008f1672 in InitBufferPool () at buf_init.c:148
#3  0x000000000091f124 in CreateSharedMemoryAndSemaphores (makePrivate=0 '\000', port=44444) at ipci.c:219
#4  0x000000000088ee5c in reset_shared (port=44444) at postmaster.c:3565
#5  0x000000000088cbcf in PostmasterMain (argc=5, argv=0x186ae60) at postmaster.c:2134
#6  0x00000000007c574f in main (argc=5, argv=0x186ae60) at main.c:288
(gdb) 

$4 = (HTAB *) 0x18b0f20

- 子线程使用共享内存初始化
#0  InitBufTable (size=11664) at buf_table.c:60
#1  0x00000000008fa224 in StrategyInitialize (init=0 '\000') at freelist.c:342
#2  0x00000000008f1672 in InitBufferPool () at buf_init.c:148
#3  0x000000000091f124 in CreateSharedMemoryAndSemaphores (makePrivate=0 '\000', port=0) at ipci.c:219
#4  0x0000000000891bef in SubPostmasterMain (argc=6, argv=0x18ddd70) at postmaster.c:5388
#5  0x0000000000891644 in MainStarter (params=0x18ddd70) at postmaster.c:5070
#6  0x00007ffff64bddc5 in start_thread () from /lib64/libpthread.so.0
#7  0x00007ffff56cb21d in clone () from /lib64/libc.so.6

$8 = (HTAB *) 0x7fffe0022390

- 子线程使用共享内存初始化
#0  InitBufTable (size=11664) at buf_table.c:60
#1  0x00000000008fa224 in StrategyInitialize (init=0 '\000') at freelist.c:342
#2  0x00000000008f1672 in InitBufferPool () at buf_init.c:148
#3  0x000000000091f124 in CreateSharedMemoryAndSemaphores (makePrivate=0 '\000', port=0) at ipci.c:219
#4  0x0000000000891bef in SubPostmasterMain (argc=6, argv=0x18ddd70) at postmaster.c:5388
#5  0x0000000000891644 in MainStarter (params=0x18ddd70) at postmaster.c:5070
#6  0x00007ffff64bddc5 in start_thread () from /lib64/libpthread.so.0
#7  0x00007ffff56cb21d in clone () from /lib64/libc.so.6

$10 = (HTAB *) 0x7fffe00243a0

- 子线程使用共享内存初始化
#0  InitBufTable (size=11664) at buf_table.c:60
#1  0x00000000008fa224 in StrategyInitialize (init=0 '\000') at freelist.c:342
#2  0x00000000008f1672 in InitBufferPool () at buf_init.c:148
#3  0x000000000091f124 in CreateSharedMemoryAndSemaphores (makePrivate=0 '\000', port=0) at ipci.c:219
#4  0x0000000000891bef in SubPostmasterMain (argc=6, argv=0x18975a0) at postmaster.c:5388
#5  0x0000000000891644 in MainStarter (params=0x18975a0) at postmaster.c:5070
#6  0x00007ffff64bddc5 in start_thread () from /lib64/libpthread.so.0
#7  0x00007ffff56cb21d in clone () from /lib64/libc.so.6

$12 = (HTAB *) 0x7fffd8022390

- 子线程使用共享内存初始化.....

发现更多宝藏

我在喜马拉雅上分享声音

《PostgreSQL数据库内核分析》,点开链接可以听听,有点意思。

《数据库系统概论(第4版)》,点开链接可以听听,有点意思。

更多IT有声课程,点我发现更多

第 0 课 PostgreSQL 系列文章列表

其他相关文章分享列表:

第 23 课 PostgreSQL 创建自己的数据库、模式、用户
第 22 课 PostgreSQL 控制文件
第 21 课 PostgreSQL 日志系统
第 16 课 查询过程源码分析
第 15 课 PostgreSQL 系统参数配置
第 14 课 PostgreSQL 数据存储结构
第 13 课 PostgreSQL 存储之Page(页面)源码分析
第 12 课 PostgreSQL 认证方式
第 11 课 PostgreSQL 增加一个内核C函数
第 10 课 PostgreSQL 在内核增加一个配置参数
第 09 课 PostgreSQL 4种进程启动方式
第 08 课 PostgreSQL 事务介绍
第 07 课 PostgreSQL 数据库、模式、表、空间、用户间的关系
第 06 课 PostgreSQL 系统表介绍
第 05 课 PostgreSQL 编译源代码进行开发
第 04 课 PostgreSQL 安装最新的版本
第 03 课 PostgreSQL 代码结构
第 02 课 PostgreSQL 的特性、应用、安装
第 01 课 PostgreSQL 简介及发展历程

上面文章都在专辑中:PostgreSQL专辑链接,点我查看

如果有用,可以收藏这篇文件,随时在更新....

更多交流加群: PostgreSQL内核开发群 876673220

亲,记得点赞、留言、打赏额!!!

上一课
下一课

你可能感兴趣的:(第 9 课 PostgreSQL 4种进程启动方式)