Postgresql技术内幕系列-第二章 进程与内存架构

本章主要介绍pg的进程架构和内存架构,如果您对此已经非常熟悉,可跳过本章阅读后续章节。

2.1 进程架构

PostgreSQL是一个C/S架构的关系型数据库管理系统,在一个服务器中采用了多进程架构。

'PostgreSQL server'指的是用以一组数据库后台进程的集合,用于管理一个数据库集合。pg server包括以下主要后台进程:

                                                    图2.1 PG进程架构图

  • postgres server process  是所有进程的父进程

  • backend process 是每一个客户端的连接都有一个后端进程,用以处理所有查询和SQL

  • backgroud processes 为管理数据库而产生的一些进程,包括vacumm进程、checkpoint进程等等

  • backgroud work processes 9.3以后版本开始有这个进程,是后台工作进程接口。 后台工作进程,一个可以运行任意用户代码的进程,当然也包括:正常的事务(Transaction)操作。外部模块可以通过调用shared_preload_libraries函数来注册一个worker。当然worker也可在运行过程中进行动态注册。 上述两类worker进程都是通过由postmaster fork而来。这里不做详细介绍,详见官方文档。     

2.1.1. Postgres Server 进程

如上所述,postgres server进程是pg server中所有进程的父进程。在早期的版本中,该进程被称作‘postmaster’进程。

可以通过 pg_ctl 工具启动一个postgres server进程。然后该进程会分配一块共享内存,启动大量background进程,等待客户端来连接,每产生一个连接就会生成一个backend process,一个postgres server process只能监听一个端口,默认端口是5432。尽管一台机器可以运行多个server,但是端口必须不同。

2.1.2. Backend 进程

一个backend进程,常被称作postgres进程,由postgres server进程启动,用来处理客户端连接的查询请求。通过TCP协议和客户端建立通讯,当客户端断开时,连接消失。

在连接PostgreSQL server时,用户需要指定所要操作的数据库名称。

pg允许同时支持多个连接,配置参数max_connections 用于设置最大连接数,默认值为100。

如果客户端频繁的和服务端建立连接然后断开,会增加数据库的开销,导致服务器负载不正常,因为数据库本身不提供连接池的功能,如果有需要,可以使用pgbouncer或者pgpool-II。

2.1.3. Background 进程

表2.1展示了background进程列表,以下对这些进程的功能进行简要介绍,在后续章节中会进行详细说明。

进程名称

描述

详见

background writer

进程将shared buffer pool中的脏数据写到磁盘,检查点总能触发这个进程

Section 8.6

checkpointer

 在9.2版本以后,检查点会触发产生这个进程

Section 8.6

Section 9.7

autovacuum launcher

 为vacuum process周期性的调用autovacuum work processes

Section 6.5

WAL writer

 周期性的从wal buffer刷新数据到磁盘

Section 9.9

statistics collector

 收集统计信息进程,比如pg_stat_activity 和pg_stat_database的数据

 

logging collector (logger)

将错误信息写入到日志

 

archiver

 将日志归档

Section 9.10

The actual processes of a PostgreSQL server is shown here. In the following example, one postgres server process (pid is 9687), two backend processes (pids are 9697 and 9717) and the several background processes listed in Table 2.1 are running. See also Fig. 2.1.

一个PostgreSQL Server的进程信息如下所示,一个postgres服务器进程(pid为9687),两个后端进程(pids为9697和9717)以及表2.1中列出的几个后台进程正在运行。

2.2. 内存架构

PG中的内存可以分为两大类,如下图所示:

1)本地内存:供各backend进程单独使用。

2)共享内存:供PostgreSQL server中的所有进程共同使用。

2.2.1. 本地内存

每一个backend process 都会分配一块local memory area, 每一块区域又分为三个子区域 ,见下表

2.2.2. 共享内存

共享内存分类如下:

另外,Postgresql还分配一些其他的共享内存区域:

  • 为访问控制分配的子区域,比如轻量级锁,共享锁或者专有锁.
  • 为其他backgroud process提供的子区域,比如检查点,vacuum.
  • 为事物处理提供的子区域,比如事物中的保存点(save-point),和二阶段事物提交(two-phase-commit)

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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值