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 ...
随机推荐
- Spring Cloud--Hystrix服务熔断(线程隔离/服务降级)代码实现
一旦服务阻塞就进行服务降级或线程隔离.要不然就会导致大面积服务的瘫痪,Hystrix就是干这个的,一出现不健康的服务就进行熔断,不阻塞后面线程的执行. 引入依赖: 加注解: 这三个注解可以用一个注解搞 ...
- bootstrap Modal或者 bootbox弹窗时,页面混动至顶部
bootstrap使用Modal时,页面自动滚动至了最顶部, 调用bootbox时,也是如此 查了半天资料,最后参考下述帖子,解决问题 https://stackoverflow.com/questi ...
- 缺陷的背后(三)---mysql之sql_mode为空的陷阱
导语 mysql服务器可以在不同的sql_mode模式下运行,并且可以根据sql_mode系统变量的值,为不同的客户机应用不同的模式.sql_mode会影响mysql支持的sql语法,并且会执行数据验 ...
- mysql开启二进制日志
打开xhell进入系统 进入mysql配置文件目录 执行 cd /etc/mysql 首先找到my.cnf这个配置文件,然后使用vim进入文件编辑 放开我标记的地方. 注意我标记的地方,其实这个就是在 ...
- 【洛谷 P2483】 【模板】k短路([SDOI2010]魔法猪学院)(A*)
题目链接 优先队列bfs第一次出队就是最短路,那么显然第k次出队就是k短路 ?????????????????????????????? 书上写的 但是直接优先队列bfs会T,所以用A*优化就行,估价 ...
- Ruby开发小记
基础点 1.log打印 puts "Hello!" 2.拼接字符 value1 = "today" value2 = "#{value1} is Th ...
- 大数据的前世今生【Hadoop、Spark】
一.大数据简介 大数据是一个很热门的话题,但它是什么时候开始兴起的呢? 大数据[big data]这个词最早在UNIX用户协会的会议上被使用,来自SGI公司的科学家在其文章“大数据与下一代基础架构 ...
- Charles中文破解版下载安装及使用教程(附带免费下载链接)
一. 简介及安装 Charles 是在 PC 端常用的网络封包截取工具,但它不仅仅能在pc端使用,还可以在手机ios和安卓端都可以使用.我们在做移动开发或者测试网页app时候,为了调试与服务器端的网络 ...
- Python开发之路:目录篇
第一部分:Python基础知识 本篇主要python基础知识的积累和学习,其中包括python的介绍.基本数据类型.函数.模块及面向对象等. 第一篇:Python简介 第二篇:Python基本知识 ...
- flutter入门开发的一些坑
flutter入门开发的一些坑 很久没写博客了,最近在准备物联网比赛,顺便抽出时间学习了一下flutter,花了近2周完成了一个查看博客博文的一个小的APPdemo,随便截了两张图,如下: 首页 博客 ...