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
下面列出了相关的服务端进程,这里只做简单的介绍
| process | description | reference |
|---|---|---|
| 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 |
这里显示了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, 每一块区域又分为三个子区域 ,见下表
| sub-area | description | reference |
|---|---|---|
| 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
这块区域在服务器启动的时候分配,这块区域也是分为好几个子区域,见下面介绍
| sub-area | description | reference |
|---|---|---|
| shared buffer pool | 将表或者索引的page从磁盘加载到shared buffer,然后在shared buffer操作 | Chapter 8 |
| WAL buffer | 在服务端出现问题的时候,确保数据不会丢失,在写到磁盘之前,wal buffer是wal log的缓存区域 | Chapter 9 |
| commit log | 为了并发控制所有事物的状态的保持而分配的区域 |
另外,Postgresql还分配一些其他的内存区域:
- 为访问控制分配的子区域,比如轻量级锁,共享或者专有锁.
- 为其他backgroud process提供的子区域,比如检查点,vacuum.
- 为事物处理提供的子区域,比如事物中的保存点,和二阶段事物提交.
转载自:
https://blog.csdn.net/dazuiba008/article/details/80389220
Postgresql 进程和内存结构的更多相关文章
- PostgreSQL进程和内存结构
PostgreSQL数据库启动时,会先启动一个叫做Postmaster的主进程,还会fork一些辅助子进程,这些辅助子进程各自负责一部分功能,辅助子进程分类如下: $ ps -ef | grep po ...
- postgresql进程及内存结
一.进程和内存架构图 postgresql数据库启动时,先启动一个postmaster的主进程,然后fork出一些辅助子进程. 二.主进程postmaster -bash-4.2$ which pos ...
- Windows中进程的内存结构
基础知识: 栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表.允许插入或删除操作的一端称为栈顶,另一端称为栈底,对栈的插入和删除操作被称为入栈和出栈. 有一组CPU指令可以实现对进程 ...
- 面试问题之操作系统:Linux下进程的内存结构
转载于:http://www.hqj.com/news/emb184.htm Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间.该地址空间是大小为4GB的线性虚拟空间 ...
- [转]oracle学习入门系列之五内存结构、数据库结构、进程
原文地址:http://www.2cto.com/database/201505/399285.html 1 Oracle数据库结构 关于这个话题,网上一搜绝对一大把,更别提书籍上出现的了,还有很多大 ...
- PostgreSQL内存结构图示
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页 作者:高健@博客园 luckyjackgao@ ...
- 概览JVM的基本结构和JVM内存结构
概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...
- JVM的基本结构和JVM的内存结构
这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫JVM内存模型. 1.JVM的基本结构 ...
- PG进程结构和内存结构
本文主要介绍PostgreSQL数据库(后文简称PG)进程结构和内存结构,物理结构将在后续继续整理分享. 上图描述了PG进程结构.内存结构和部分物理结构的内容.图中的内容包含了两个部分: PG ...
随机推荐
- 记一次stm8l程序跑飞
项目使用stm8l051f3做主控,CC2500做数据接收,不发送. 跑飞的现象就是,刚开始能运行,经过一段未知长度的时间,有可能是3分钟,有可能是30分钟,指示灯不再闪烁,中断按键单片机无反应. 接 ...
- change事件传值方式 data-set 以及复杂数据类型 可以动态创建对象push到数组里面
<template> <div> <!-- <div class="banner"> <a-breadcru ...
- PXC增量恢复添加节点(IST)
绕开SST通过IST方式添加Node到Percona XtraDB Cluster Gcache存储了所有的 writeset ,因此说这个集合的大小直接决定了允许其他节点宕机后多长时间内可以进行 ...
- VisualStudio 连接 MySql 实现增删查改
首先创建数据库,建立一个用户登录表 2.visualStudio默认是不支持MySql的,要想通过Ado.Net 操作MySql 需要在管理NeGet包添加对MySql.Data 和 MySql.D ...
- 上传自己的 NuGet 包
参考:https://blog.csdn.net/gulijiang2008/article/details/41724927 STEP 1:在NuGet上注册并获取API Key STEP 2:下载 ...
- Linux操作系统六大优点
打开百度App,看更多图片 1.免费开源.Linux是一款完全免费的操作系统,任何人都可以从网络上下载到它的源代码,并可以根据自己的需求进行定制化的开发,而且没有版权限制. 2.模块化程度高.Linu ...
- asp.net core 一个中小型项目实战的起手式——Swagger配置
交流群:863563315 一.Swagger是什么 Swagger 是一款RESTFUL接口的.基于YAML.JSON语言的文档在线自动生成.代码自动生成的工具. 二.如何在项目中加入Swagger ...
- DevExtreme学习笔记(一) DataGrid中数据筛选
config.filterRow = { visible: true, applyFilter: "auto" }; config.headerFilter = { visible ...
- (二) Windows 进行 Docker CE 安装(Docker Desktop)
参考并感谢 官方文档: https://docs.docker.com/docker-for-windows/install/ 下载地址 https://download.docker.com/win ...
- Django使用LDAP
https://github.com/python-ldap/python-ldap Quick usage example: import ldap l = ldap.initialize(&quo ...