PG INTERNAL-进程与内存架构

本文深入探讨PostgreSQL的多进程架构,包括Postgres Server Process、Backend Process和Background processes的作用及交互方式,以及其内存架构如何支持高效的数据管理和查询处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

翻译http://www.interdb.jp/pg/pgsql02.html

1.进程架构

PostgreSQL是运行在单个主机的多进程架构的c/s类型的关系型数据库管理系统.
一组多进程共同管理一个database cluster.这些进程有以下类型:

  • postgres server process:是所有管理database cluster的相关进程的父进程.
  • backend process:处理已连接客户端的所有请求查询和语句.
  • background processes:不同的background processes处理数据库管理的不同方面的任务(比如,VACUUM,CHECKPOINT等).
  • replication associated processes:它们执行流备份任务.
  • background worker process:9.3版本开始支持,它们可以执行任何用户实现的进程,具体可查看官方文档

下面的图描述了pg的进程架构.
在这里插入图片描述

1.1Postgres Server Process

Postgres Server Process是PG所有进程的父进程.在早期的版本中,它被称为postmaster.
通过执行pg_ctl并且附带启动选项,可以启动一个postgres server process.然后它在内存中分配一块共享区域,启动不同的background processes,如果需要也会启动replication processes和background worker processes,然后等待客户端连接请求.只要它接收到一个客户端请求,它就启动一个backend process,然后这个backend process会处理这个已连接的客户端的所有请求.

postgres server process监听一个网络端口,默认是5432.由于在一个主机可以运行多个PostgresSQL server,每个serve必须设置不同的监听端口.

1.2 Backend Process

一个Backend process也被称为postgres.它与客户端通过一个tcp连接交互,当客户端连接断开后结束.

postgres server process监听到了client连接创建了连接的socket,然后postgres server process fork了backend process,backend process有这个socket的副本可以直接使用,而postgres server process也不会关闭socket,所以可以实现backend process直接与client tcp通信,而不是重新建立连接

由于它只允许操作一个数据库,所以在连接之前要显示的指定数据库.
PostgreSQL允许多个客户端同时连接,参数max_connections控制最大客户端连接数量(默认100).

如果许多客户端比如WEB应用经常重复连接与断开连接,会增加建立连接与创建backend process的代价,因为PostgrSQL还没有实现本地连接池.这会对数据库的性能造成不好的影响.为了处理这种情况,可以使用一个pooling中间件,比如pgbouncer,pgpool-II.

1.3 Background processes

下面的表显示了一组background process.与postgres server和backend process不同,每一个的功能都不同,都不能简单的解释.
在这里插入图片描述

下面显示了实际的PostgreSQL server的进程.
在这里插入图片描述

2.内存架构

PostgreSQL的内存架构可以被分为两大块:

  • Local memory area:每个backend process自己分配的内存.
  • Shared memory area:所有PostgreSQL进程共用的内存.

在这里插入图片描述

2.1 Local Memory Area

每个backend process都会分配local memory area用于查询处理.每个area被分为多个sub-area,大小可以使固定或者可变的.下面的显示了一组组要的sub-areas.
在这里插入图片描述

2. Shared Memory Area

一个共享的区域是由PostgreSQL server启动时候创建的.这块区域被分割成几块大小固定的sub-area.下图显示了几个主要的sub-area.
在这里插入图片描述
除了上面所述的,PostgreSQL还会分配下面几个区域:

  • 为了access control机制分配的sub-areas.
  • 不同的background process使用的sub-areas.比如,checkpointer和autovacuum.
  • 事务处理(比如save-point和tow-phase-commit)使用的sub-area.
<think>好的,用户想了解PostgreSQL的会话服务进程的工作原理和技术细节。首先,我需要回忆一下PostgreSQL的架构,特别是关于客户端连接处理的部分。记得PostgreSQL使用的是多进程模型,主进程是postmaster,负责监听连接请求。当有客户端连接时,postmaster会fork一个backend进程来处理这个会话。这个backend进程负责执行查询、事务管理等。 接下来,需要详细说明连接建立的步骤。用户可能想知道从客户端发起请求到backend进程开始工作的整个过程。比如,postmaster如何监听端口,接收到连接后如何验证,然后fork进程。这里可能需要提到pg_hba.conf文件的作用,用于控制客户端的认证方式,如密码验证、SSL等,引用中的信息[^3]提到了密码验证方法,比如SCRAM,可以在这里引用。 然后,关于backend进程的初始化,特别是relcache和syscache的初始化。引用[^2]提到了在InitPostgres函数中的步骤,包括读取pg_filenode.map和pg_internal.init文件。这部分需要解释这些文件的作用,以及为什么需要在进程启动时加载这些缓存,可能会影响性能,尤其是当系统表较多时。 另外,需要讨论进程间通信和隔离。PostgreSQL的每个backend进程都是独立的,这提供了良好的隔离性,但也意味着资源消耗较高。可能需要对比多线程模型,解释为什么PostgreSQL选择多进程,比如稳定性考虑,一个进程崩溃不会影响其他进程。 关于技术细节,可以提到内存管理,每个backend有自己的内存上下文,事务管理,MVCC的实现,以及查询处理的流程,比如解析、优化、执行。同时,进程结束后的资源释放也很重要,比如临时文件、内存的清理。 用户可能还会关心常见问题,比如连接数过多导致资源耗尽,如何优化。这时需要建议调整max_connections参数,使用连接池如pgbouncer。另外,性能瓶颈可能出现在relcache初始化,可以提到pg_prewarm扩展或者调整配置参数。 需要确保回答结构清晰,分点列出连接建立、进程初始化、工作阶段、终止过程,以及相关技术问题。同时,生成的问题要覆盖用户可能进一步询问的方向,比如认证机制、缓存优化、多进程模型优缺点、性能优化工具等。 最后,检查引用是否正确应用,比如引用[^1]提到只读参数和配置,可能在讨论配置参数时提及;引用详细说明了backend进程初始化的步骤和涉及的文件;引用关于认证方法,特别是SCRAM的安全性。确保这些引用自然地融入回答中,帮助增强权威性。</think>### PostgreSQL会话服务进程工作原理及技术细节 #### 一、连接建立进程创建 1. **Postmaster监听** PostgreSQL进程(`postmaster`)在启动后监听默认端口(如5432),等待客户端连接请求。其职责包括管理共享内存、协调子进程生命周期[^1]。 2. **客户端连接触发Fork** 当客户端发起连接时,`postmaster`会通过`fork()`系统调用创建子进程(即**backend进程**)。该进程独立服务于当前会话的所有操作,包括SQL解析、执行和结果返回[^2]。 3. **认证初始化** - 认证阶段依据`pg_hba.conf`配置(如密码认证、SSL证书等),例如SCRAM-SHA-256加密认证[^3]。 - 进程初始化包括: - 加载系统表缓存(`relcache`和`syscache`) - 读取`pg_filenode.map`(系统表文件映射)和`pg_internal.init`(预加载缓存) - 建立私有内存上下文(如`TopMemoryContext`) #### 二、会话服务进程(Backend)工作阶段 1. **查询处理流程** ```text 客户端请求 → 语法解析 → 查询重写 → 优化器 → 执行器 → 结果返回 ``` 2. **关键模块** - **内存管理**:采用层次化内存上下文(MemoryContext),防止内存泄漏 - **事务控制**:通过事务ID(XID)和MVCC实现隔离性 - **锁管理**:行级锁、表级锁死锁检测 3. **隔离性设计** 每个backend进程拥有独立的内存空间和事务状态,确保会话间互不影响。例如: - 临时表仅在当前会话可见 - 未提交事务的修改对其他会话不可见 #### 三、会话终止资源释放 1. **正常终止** 客户端断开连接后,backend进程主动释放内存、关闭文件描述符,并向`postmaster`发送状态信息。 2. **异常终止** - `postmaster`监控子进程状态,若检测到崩溃会自动重启 - 通过`SIGTERM`或`SIGKILL`强制终止异常进程 #### 四、相关技术问题解决方案 1. **连接数限制** - 参数`max_connections`控制最大并发连接数,超限会拒绝新连接[^1] - **解决方案**:使用连接池(如pgbouncer)复用连接 2. **系统表缓存加载性能** - 初始化时读取`pg_internal.init`可能成为瓶颈 - **优化方法**:通过`pg_prewarm`扩展预热缓存 3. **认证安全问题** - 明文密码风险(如`password`认证方式) - **建议**:强制使用SCRAM-SHA-256或证书认证 #### 五、核心代码逻辑(简化) ```c // postmaster主循环 while (true) { int conn_fd = accept(); // 接收新连接 pid_t pid = fork(); if (pid == 0) { // 子进程 close_shared_resources(); // 关闭无关资源 ClientAuth(conn_fd); // 执行认证 PostgresMain(); // 进入查询处理循环 exit(0); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值