进程结构
1、postgres server process是所有PostgreSQL数据库管理的父进程,在早期的版本种称为postmaster。
1、postgres server process是所有PostgreSQL数据库管理的父进程,在早期的版本种称为postmaster。
(1)随着pg_ctl start,postgres server process也随之启动。 (2)分配shared memory (3)启动一系列后台进程,复制相关的进程,后台工作者进程 (4)当客户端连接的时候,通过调用操作系统命令fork()出一个backend process (5)监听数据库的端口
2、backend process 负责处理客户端连接的请求处理。
(1)必须指定要在连接到PostgreSQL服务器时显式使用的数据库,且只能指定一个db。 (2)允许多个客户端同时连接PostgreSQL服务器,受参数max_connections控制,默认100 (3)如果客户端频繁与服务器端建立和断开链接,增加建立连接和创建后端进程的成本,可使用连接池中间件(pgbouncer 或pgpool-II)进行连接复用。
3、backgroud processes 是一系列各种功能特性的执行进程,比如vacuum,checkpoint等等。
(1)background writer,共享内存中的脏页数据被有规律的定期持久化写入到磁盘,在pg9.1和之前版本还充当checkpoint的功能。 (2)checkpointer,在9.2和之后的版本,执行检查点的过程。 (3)autovacuum launcher 申请自动垃圾清理的创建 (4)WAL writer 定期将WAL缓冲区上的WAL数据写入并刷新持久化到磁盘。 (5)statistics collector 收集诸如pg_stat_activity和pg_stat_database等统计信息。 (6)logger 将错误消息写入日志文件 (7)archiver 归档日志
4、replication associated processes 复制相关的进程
(1)master端的walsender, (2)standby端的walreceiver。
5、backgroud worker processes,
(1)PostgreSQL启动时候可以通过模块中shared_preload_libraries包含的模块来初始化后台工作者进程。 (2)可动态注册,注册的后台工作者的最大数量受max_worker_processes控制,默认为8。
内存结构
1、本地内存(类似于oracle的PGA),每个backend process 分配一个本地存储area,主要包括以下:
1、本地内存(类似于oracle的PGA),每个backend process 分配一个本地存储area,主要包括以下:
work_mem :order by 和distinct操作对元组进行排序,通过merge-join和hash-join操作对表进行连接时使用 maintenance_work_mem :某些维护操作(例如VACUUM,REINDEX)使用 temp_buffers :临时表使用
2、共享内存(类似于oracle的SGA),PostgreSQL服务器启动时将分配一个共享内存区域,主要包括以下:
shared_buffers PostgreSQL对表或索引的操作都是在内存中进行的,如果访问的相关数据或者索引不在此区域,将从持久性存储加载到此处, 并直接对其进行操作。 WAL buffer 是在写入磁盘之前WAL数据的缓冲区 commit log pg_xact记录所有事务的状态,事务进行中,已提交,已回滚。