进程架构

1.1 进程父子关系

PostgreSQL 的进程架构由多个后端进程组成,其父进程是 postmaster。进程 ID 记录在 {PGDATA}/postmaster.pid 文件中。当实例成功关闭时,该文件将被删除。数据库客户端与 postmaster 进程正在侦听的端口建立连接。

图1 进程父子关系

在下面的示例中,进程 ID 2680 是 postmaster 进程。很明显,所有其他进程是 postmaster 的子进程。 Postmaster 进程接收来自客户端的连接并对其进行身份验证。然后postmaster启动postgres进程作为子进程执行SQL

示例1 处理父子关系

$ ps -ef | grep postgres | grep -v grep
postgres 2680 1 0 10:25 ? 00:00:00 /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
postgres 2681 2680 0 10:25 ? 00:00:00 postgres: logger process
postgres 2683 2680 0 10:25 ? 00:00:00 postgres: checkpointer process
postgres 2684 2680 0 10:25 ? 00:00:00 postgres: writer process
postgres 2685 2680 0 10:25 ? 00:00:00 postgres: wal writer process
postgres 2686 2680 0 10:25 ? 00:00:00 postgres: autovacuum launcher process
postgres 2687 2680 0 10:25 ? 00:00:00 postgres: stats collector process

1.2 进程名称

PostgreSQL 实例如上所述配置了多个进程。通过将参数 update_process_title 指定为“on”(默认值:“on”),部分进程名称会发生变化。 ps 命令中引用的每个进程的名称如下表所示。

表 1 进程名称

进程 进程名称
postmaster {INSTALL}/bin/postgres -D
logger postgres: logger process
checkpointer postgres: checkpointer process
writer postgres: writer process
wal writer postgres: wal writer process
autovacuum launcher postgres: autovacuum launcher process
autovacuum worker postgres: autovacuum worker process
archiver postgres: archiver process last was
stats collector postgres: stats collector process
postgres (local) postgres: {PGUSER} {PGDATABASE} [local]
postgres (remote) postgres: {PGUSER} {PGDATABASE} {TCP/IP (PORT)}
wal sender postgres: wal sender process {PGUSER} {TCP/IP (PORT)} streaming
postgres: wal sender process {PGUSER} {TCP/IP (PORT)} sending backup "{BACKUP_LABEL}"
wal receiver postgres: wal receiver process streaming
startup process postgres: startup process recovering
bgworker postgres: bgworker:
parallel worker postgres: bgworker: parallel worker for PID

如果指定参数 cluster_name,这是 PostgreSQL 9.5 的新功能,则输出已指定为进程名称一部分的字符串。以下是将“cluster1”指定为参数 cluster_name 时的示例

示例2 cluster_name 参数

$ ps –ef | grep postgres
postgres 12364 1 0 06:14 pts/0 00:00:00 /usr/local/pgsql/bin/postgres -D data
postgres 12365 12364 0 06:14 ? 00:00:00 postgres: cluster1: logger process
postgres 12367 12364 0 06:14 ? 00:00:00 postgres: cluster1: checkpointer process
postgres 12368 12364 0 06:14 ? 00:00:00 postgres: cluster1: writer process
postgres 12369 12364 0 06:14 ? 00:00:00 postgres: cluster1: wal writer process
postgres 12370 12364 0 06:14 ? 00:00:00 postgres: cluster1: autovacuum launcher process

从这个例子可以看出,在postmaster的进程名中并没有输出cluster name进程。参数 cluster_name 中可以指定的字符仅限于 ASCII 字符串 (0x20 ~ 0x7E)。其他代码在转换为问号(?)后输出。

1.3 过程与信号

您可以通过向后端进程发送特定信号来执行操作,后端进程配置实例。这里验证了对几个信号的响应动作。

  • SIGKILL 信号

当 postmaster 进程收到一个杀死信号。这次没有删除 postmaster.pid 文件。实例重启后虽然有如下日志记录,但实例正常启动。

示例3 异常终止后重启日志

LOG: database system was interrupted; last known up at 2017-02-11 11:12:03 JST

LOG: database system was not properly shut down; automatic recovery in progress

LOG: redo starts at 0/155E118

FATAL: the database system is starting up

FATAL: the database system is starting up

LOG: invalid record length at 0/5A5C050: wanted 24, got 0

LOG: redo done at 0/5A5C018

LOG: last completed transaction was at log time 2017-02-11 12:25:15.443492+09

LOG: MultiXact member wraparound protections are now enabled

LOG: autovacuum launcher started

LOG: database system is ready to accept connections

当postgres进程异常终止(包括接收到KILL信号),以及适当的进程,它将重置从客户端连接的所有会话。实例上运行的所有事务都被回滚,成为接收错误信号后的所有 SQL 语句。要安全地停止 postgres 进程,执行 pg_cancel_backend 函数(发送 SIGINT 信号)或 pg_terminate_backend 函数(发送 SIGTERM 信号)。

示例4 收到KILL信号后记录

LOG: server process (PID 3416) was terminated by signal 9: Killed

LOG: terminating any other active server processes

LOG: archiver process (PID 3404) exited with exit code 1

WARNING: terminating connection because of crash of another server process

DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.

HINT: In a moment you should be able to reconnect to the database and repeat your command.

LOG: all server processes terminated; reinitializing

每个后端进程收到信号时的行为如下。 SIG_IGN 表示信号忽略,并且 SIG_DFL 显示 Linux 进程的默认行为。

  • postgres进程接收信号时的行为

postgres进程接收信号时的操作如下。

表 2 postgres 进程的行为

Signal Signal Handler function Behavior
SIGHUP SigHupHandler Reload configuration file
SIGINT StatementCancelHandler Destruction of the running transactions (Processing of pg_cancel_backend function)
SIGTERM die Destruction of the running transactions and exit process (Processing of pg_terminate_backend function)
SIGQUIT quickdie or die Forced termination
SIGALRM handle_sig_alarm Timeout occurrence notification
SIGPIPE SIG_IGN
SIGUSR1 procsignal_sigusr1_handler Database recovery
SIGUSR2 SIG_IGN
SIGFPE FloatExceptionHandler Output ERROR log
SIGCHLD SIG_DFL
  • postmaster 进程接收信号时的行为

postmaster进程接收信号时的操作如下:

表 3 postmaster 进程的行为

Signal Signal Handler function Behavior
SIGHUP SIGHUP_handler Reload configuration file Send SIGHUP signal to the child process
SIGINT pmdie FAST shutdown
SIGTERM pmdie SMART shutdown
SIGQUIT pmdie IMMEDIATE shutdown
SIGALRM SIG_IGN
SIGPIPE SIG_IGN
SIGUSR1 sigusr1_handler Signal reception processing from the child process
SIGUSR2 dummy_handler Does nothing
SIGCHLD reaper Processing at the end of a child process Restart the back-end process
SIGTTIN SIG_IGN
SIGTTOU SIG_IGN
SIGXFSZ SIG_IGN

当你向 postmaster 进程发送 SIGHUP 信号时,postgresql.conf 文件(postgresql.auto.conf 和 pg_*.conf 文件,以及)被重新加载。这与执行 pg_ctl reload 命令的行为相同。输出以下日志。

示例5 重新读取配置文件的日志输出

LOG: received SIGHUP, reloading configuration files

1.4 启动和停止进程

Checkpointer, writer, and stats collector进程始终启动。其他进程的启动/停止时序如下。 postmaster 的子进程定期检查其父进程的存在,postmaster 和他们在检测到 postmaster 进程停止时终止自己的进程。

表 4 启动和停止进程

Process Start / stop timing
logger Start-up in the case where parameter logging_collector to "on" (default: "off")
autovacuum launcher Start-up in the case where parameter autovacuum to "on" (default: "on")
autovacuum worker Autovacuum launcher process is started with the interval specified by the parameter autovacuum_naptime (default: "1min"); it stops after completing the work
archiver Start-up in the case of stand-alone or in replication environment of the master instance, parameter archive_mode to "on" or "always" (default:"off"). In slave instance of replication environment, start-up only if the archive_mode to "always"
postgres (local) Start with the local connection of the client, and stop on disconnect.
postgres (remote) Start with the remote connection of the client, and stop on disconnect.
wal sender It starts in the master instance of streaming replication environment. Starts when slave instances come to connect, and stops when slave instances disconnect. Starts during the backup by pg_basebackup command, and stop with the completion of the backup.
wal receiver Starts in the slave instance of streaming replication environment. When the master instance is stopped, it automatically stops. Restarts when the master instance is restarted.
startup process Always start in the slave instance of streaming replication environment.
wal writer It does not start in the slave instance of the replication environment. Except for this situation, it always starts.
bgworker Behavior is changed according to the specifications of the custom process.
parallel worker Starting at the time of Parallel Query run, stop at the time of SQL execution is completed.
  • autovacuum worker进程数

从它的进程名称可以看出,每个数据库都启动了 autovacuum worker 进程。启动进程的最大数量由参数 autovacuum_max_workers 决定(默认值:3)。每个工作进程逐个表执行处理。

  • postgres进程数

当客户端连接时,Postgres 进程自动启动。 postgres的最大数量受限于参数 max_connections(默认值:100)。没有SUPERUSER权限的一般用户可以连接的连接数是“max_connections ‑ superuser_reserved_connections(默认:3)”的计算结果。以下日志输出超过此限制的连接请求。

示例6 普通用户连接数超标

FATAL: remaining connection slots are reserved for non-replication superuser connections

例子7 超过参数max_connections中指定的连接数

FATAL: sorry, too many clients already

pg9.6进程架构的更多相关文章

  1. 【体系结构】Oracle进程架构

    Client Process的介绍 Client and Server Processes Client Process代表着客户端进程,每一个客户端进程关联着一个Server Process(服务器 ...

  2. 《浏览器工作原理与实践》<01>Chrome架构:仅仅打开了1个页面,为什么有4个进程?

    无论你是想要设计高性能 Web 应用,还是要优化现有的 Web 应用,你都需要了解浏览器中的网络流程.页面渲染过程,JavaScript 执行流程,以及 Web 安全理论,而这些功能是分散在浏览器的各 ...

  3. [转]架构蓝图--软件架构 "4+1" 视图模型

    架构蓝图--软件架构 "4+1" 视图模型 本文基于多个并发视图的使用情况来说明描述软件密集型系统架构的模型.使用多重视图允许独立地处理各"风险承担人":最终用 ...

  4. CEF3开发者系列之进程和线程

    CEF3是一个多进程架构框架,如果有了解过chromium的进程架构的,那么就很容易了解CEF3的多进程了.打开CEF3源代码中发布的cefclient实例,如果打开的页面带有flash或者其他插件. ...

  5. [转载] 深入 nginx 架构

    原文: http://www.cnbeta.com/articles/402709.htm 了解 nginx 架构帮助我们学习如何开发高性能 web 服务. 为了更好地理解设计,你需要了解NGINX是 ...

  6. Process Node.js 进程

    Process 进程 process.argv 是命令行参数数组,第一个元素是node,第二个元素是脚本文件名,从第三个元素开始每个元素是一个运行参数. process.stdout 标准输出流 co ...

  7. 判断指定进程是否为x64的方法(在ntdll判断某个x64函数是否存在)

    BOOL IsWow64ProcessEx(HANDLE hProcess) { // 如果系统是x86的,那么进程就不可能有x64 bool isX86 = false; #ifndef _WIN6 ...

  8. Android存储系统的架构与设计

    一.概述 本文讲述Android存储系统的架构与设计,基于Android 6.0的源码,涉及到最为核心的便是MountService和Vold这两个模块以及之间的交互.为了缩减篇幅,只展示部分核心代码 ...

  9. 架构蓝图--软件架构 "4+1" 视图模型

    引言 我们已经看到在许多文章和书籍中,作者欲使用单张视图来捕捉所有的系统架构要点.通过仔细地观察这 些图例中的方框和箭头,不难发现作者努力地在单一视图中表达超过其表达限度的蓝图.方框是代表运行的程序吗 ...

  10. 【PostgreSQL-9.6.3】进程及体系结构

    本文主要讲述了PG的几个主要进程,以及PG的核心架构.进程和体系结构详见下图: 从上面的体系结构图可以看出来,PG使用经典的C/S架构,进程架构.在服务器端有主进程.服务进程.子进程.共享内存以及文件 ...

随机推荐

  1. DVWA靶场实战(十一)——XSS(Reflected)

    DVWA靶场实战(十一) 十一.XSS(Reflected): 1.漏洞原理: XSS被称为跨站脚本攻击(Cross Site Script),而Reflected被称作反射型XSS.不同于DOM和S ...

  2. BUG日记之————>springboot使用QueryMapper多条件查询

    使用MP的QueryMapper这里注意配置的Maven 注意这里的 .isEmpty 和hasText和hasLength不是一种类型

  3. 教你解决虚拟机用不了USB设备的苦恼。

    如果你看见了上图的效果说明我们的苦恼是一样一样的. vm10 vm11 vm player都有这个问题!!!!  对不对?哈哈 . 在虚拟机右击设备点击连接(Connect) 然后听见你的电脑发出了硬 ...

  4. Python风格规范(转载)

    Python风格规范(转载) https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python ...

  5. 1888: 生成括号(等级考试3级 2021-09 T5)

    题目: 程序: #include<bits/stdc++.h> using namespace std; int n; string s1; void dfs(int l,int r) { ...

  6. Syntax Error: Error: Cannot find module ‘node-sass‘

    出现问题原因: vscode运行前端项目输入npm run dev命令触发此错误 解决办法: 指定淘宝镜像安装node-sass win+r 打开cmd控制台输入 npm install -g cnp ...

  7. Spring Boot 小知识、小demo、配置文件

    五.spring boot 通过springboot可以快速的搭建一个基于ssm框架的Java application,简单配置,自动装配. JavaConfiguration用java类来替代xml ...

  8. 2.16 win32信息 事件 机制-创建第一个win32程序

    事件和信息 事件,例如鼠标的单机 会保存很多数据 这个便是信息 Windows为了能够准确的描述这些信息,提供了一个结构体:MSG,该结构体里面记录的事件的详细信息. typedef struct t ...

  9. nuxt+vant+rem项目构建

    原文链接:https://blog.csdn.net/Young_Gao/article/details/93605428 一.创建项目 1.使用如下命令生成项目 vue init nuxt-comm ...

  10. 浅显直白的Python深拷贝与浅拷贝区别说明

    一.可变数据类型与不可变数据类型 在开始说深拷贝与浅拷贝前,我们先来弄清楚,可变对象与不可变对象 总的来说,Python数据类型可分为可变数据类型与不可变数据类型 可变数据类型:在不改变对象所指向的地 ...