PostgreSQL进程架构与内存管理


图1:PostgreSQL多进程架构和内存模型流程示意图
如上图所示,当客户端发起连接时,守护进程会fork单独的服务进程为客户端提供服务,此后由服务进程为客户端执行各种命令,客户端直接和服务进程通信,不再需要守护进程中转,直到客户端断开连接。
守护进程是所有进程的父进程,负责整个数据库系统的启动、关闭、监听、接受新的客户端连接、处理配置变更和恢复和故障处理;服务进程主要职责在于客户端连接认证,并负责处理客户端发出的查询和语句。
除了守护进程的和服务进程外,PG在运行期间还需要一些辅助进程,包括:
Background writer:负责将共享缓冲池中的脏页逐渐刷入持久化存储中。
Checkpointer:在PG9.2及其后版本中,该进程负责处理检查点。
Autovacuum launcher:周期性地启动自动清理工作进程。
WAL writer:本进程周期性地将WAL缓冲区中的WAL数据刷入持久存储中。
Statistics Collector:负责收集统计信息,用于诸如pg_stat_activity, pg_stat_database等系统视图。
Logging collector (logger):负责将错误消息写入日志文件。
Archiver:负责将日志归档。
在内存模型方面,PostgreSQL的内存体系结构可以分为两大类:本地内存区域(Local memory area)和共享内存区域(Shared memory area)。
本地内存由每个后端服务进程分配供自己使用,当后端服务进程被fork时,每个后端服务进程为查询分配一个本地内存区域,由以下三部分组成:
work_mem:执行器在执行ORDER BY和DISTINCT时使用该区域对元组做排序,以及存储归并连接和散列连接中的连接表。
maintenance_work_mem:某些类型的维护操作使用该区域(例如VACUUM、REINDEX)。
temp_buffers:临时表相关操作使用这部分内存。
共享内存区域由PostgreSQL服务器在启动时分配,由所有后端进程共同使用。这个区域也被划分为几个固定大小的子区域,如下所示:
Shared buffer pool:PostgreSQL将表和索引中的页面从持久存储加载至此,并直接操作。
WAL buffer:WAL数据是PostgreSQL中的事务日志;WAL缓冲区是WAL数据在写入持久存储之前的缓冲区。
Commit log buffer:提交日志为并发控制(CC)机制保存了所需的所有事务状态(例如进行中、已提交、已中止等)。
内存上下文的实现


图2:PostgreSQL内存上下文结构示意图
在上图中,各模块功能如下:
TopMemoryContext:位于内存上下文树型管理结构的顶层,所有其它的内存上下文都是其直接或间接子节点。TopMemoryContext上的内存分配与malloc完全相同,因此TopMemoryContext不会被重置和删除。
CacheMemoryContext:RelCache、CatCache以及相关模块的持久存储,无法重置或删除。
MessageContext:此内存环境持有前台进程传递过来的当前命令消息,以及当前消息衍生出来的并且与当前消息生命周期相同的存储空间。
TopTransactionContext:此内存环境一直持续到最高层事务结束的时候。在每一次最高层事务结束的时候,这个内存环境都会被重设,其所有的子内存环境都会被删除。在大多数情况下,无须在这里分配内存,而应该在CurTransactionContext中分配。注意:此内存环境不会在出错时立即清除,而是直到事务块通过调用COMMIT/ROLLBACK时清除。
CurTransactionContext:此内存环境持有当前事务的数据,直到当前事务结束,特别是在最高层事务提交时需要此内存环境。当处于一个最高层事务中时,此内存环境与TopTransactionContext一致,但是在子事务中,CurTransactionContext则指向一个子内存环境。
ErrorContext:这是一个持久性的内存环境,会在错误恢复过程中切换,在恢复结束时重设。这里安排了8K的空间,保证在其他所有内存用尽之后,也可以顺利地把错误恢复。

图3:PostgreSQL内存上下文数据结构示意图
ChunkSize > allocChunkLimit,直接调用 free() 进行释放。 ChunkSize <= allocChunkLimit,将 Chunk直接添加至freelist空闲链表中即可。
结语

💡延展思考:PG的内存上下文使用了freelist的数据结构,为什么不采用伙伴算法管理内存?这样的设计有哪些优势?两者之间有何区别?对这个话题感兴趣的同学,可以扫描下方二维码,添加企微小助手,加入HashData技术交流群共同探讨!
相关阅读:

HashData研发、行业销售、工程服务等岗位正在火热招聘中!扫描下图二维码,可获取职位详细信息,加入我们的团队!





