Postgresql管理系列-第二章 进程和内存结构

在本章中,总结了PostgreSQL中的流程体系结构和内存体系结构,以帮助阅读后续章节。如果您已经熟悉它们,可以跳过本章

 

1.进程结构

Postgresql 是一个C/S架构的关系型数据库,由多个后台进程管理数据库,下面分别介绍一些这些进程

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

backend process 每一个客户端的连接都有一个后端进程存在

backgroud processes 为管理数据库而产生的一些进程

backgroud work processes 9.3以后版本开始有这个进程,这里不做详细介绍

进程架构图2.1:

下面简短的介绍一些这几个进程的作用

1.1 postgres server process

正如上所说,是所有进程的父进程,早期的版本叫postmaster.

pg_ctl start执行后,这个进程就会启动,然后,从物理内存中分配内给给shared memory,然后产生很多其他的backgroup processes ,等待客户端来连接,每产生一个连接就会生成一个backend process,一个postgres server process只能监听一个端口,默认端口是5432。尽管一台机器可以运行多个server,但是端口必须不同。

1.2 backend processes

通过TCP协议和客户端建立通讯,当客户端断开时,连接消失。允许多个客户端同时连接,连接数由max_connections参数控制,默认是100,如果客户端频繁的和服务端建立连接然后断开,会增加数据库的开销,导致服务器负载不正常,因为数据库本身不提供连接池的功能,如果有需要,可以使用pgbouncer或者pgpool-II。

1.3 backgroud processes

下面列出了相关的服务端进程,这里只做简单的介绍

 

Table 2.1: background processes.
processdescriptionreference
background writer进程将shared buffer pool中的脏数据写到磁盘,检查点总能触发这个进程Section 8.6
checkpointer 在9.2版本以后,检查点会触发产生这个进程Section 8.6Section 9.7
autovacuum launcher 为vacuum process周期性的调用autovacuum work processesSection 6.5
WAL writer 周期性的从wal buffer刷新数据到磁盘Section 9.9
statistics collector 收集统计信息进程,比如pg_stat_activity 和pg_stat_database的数据 
logging collector (logger) 将错误信息写入到日志 
archiver 将日志归档的进程.Section 9.10

这里显示了PostgreSQL数据库的进程信息。在以下示例中,一个postgres服务器进程(pid为9687),两个后端进程(pids为9697和9717)以及表2.1中列出的几个后台进程正在运行。

postgres> pstree -p 9687
-+= 00001 root /sbin/launchd
 \-+- 09687 postgres /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
   |--= 09688 postgres postgres: logger process     
   |--= 09690 postgres postgres: checkpointer process     
   |--= 09691 postgres postgres: writer process     
   |--= 09692 postgres postgres: wal writer process     
   |--= 09693 postgres postgres: autovacuum launcher process     
   |--= 09694 postgres postgres: archiver process     
   |--= 09695 postgres postgres: stats collector process     
   |--= 09697 postgres postgres: postgres sampledb 192.168.1.100(54924) idle  
   \--= 09717 postgres postgres: postgres sampledb 192.168.1.100(54964) idle in transaction  

2.内存架构

 

在Postgresql中,内存大概被分为两块

Local memory area – 为每一个backend process 分配的内存

Shared memory area – PostgreSQL server 所有的backgroud process使用的内存

2.1 Local memory area 

 

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

Table 2.2: Local memory area
sub-areadescriptionreference
work_mem 用户在sort,distinct,merge join,hash join的时候会用到这块区域Chapter 3
maintenance_work_mem vacuum,reindex会用到这块区域Section 6.1
temp_buffers 存储临时表会用到这块区域 

 

2.2 Shared memory area 

 

这块区域在服务器启动的时候分配,这块区域也是分为好几个子区域,见下面介绍

 

Table 2.3: Shared memory area
sub-areadescriptionreference
shared buffer pool 将表或者索引的page从磁盘加载到shared buffer,然后在shared buffer操作Chapter 8
WAL buffer 在服务端出现问题的时候,确保数据不会丢失,在写到磁盘之前,wal buffer是wal log的缓存区域Chapter 9
commit log 为了并发控制所有事物的状态的保持而分配的区域

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

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值