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 ...
随机推荐
- java.IO.EOFException异常
错误代码为: 43 boolean booleanResult = dis.readBoolean();//dis为DateInputStream的实例 44 System.out.println(b ...
- Eclipse Block Selection(块选择)快捷键 Alt + Shift + A
说实话,我暂时还没用过这个快捷键.但是不代表以后我也不会用它. Eclipse 有个地方可以专门查看这些小技巧. Help → Tip of the Day 进入下面这个窗口: 将 Unread on ...
- max_prepared_stmt_count参数
MySQL报错[mysqld-5.5.17-log]Can't create more than max_prepared_stmt_count statements (current value: ...
- prometheus+alertmanager+granafa监控总结,安装基于docker-compose(长期更新)
最近自己个人尝试在使用prometheus+grafana监控工作业务上的指标, 但是报警功能还没有实际用上,但是感觉是很好用,写下一些啃prometheus官网文档并且自己用到的一些配置的总结,后续 ...
- hadoop 异常
2019-09-20 22:49:51,955 WARN org.apache.hadoop.hdfs.server.datanode.DataNode: Problem connecting to ...
- Mybatis @Many注解一对多关联映射
@Many注解:fetchType属性用于配置是否延迟加载
- 3.01定义常量之define
[注:本程序验证是使用vs2013版] #include <stdio.h> #include <stdlib.h> #include <string.h> #pr ...
- AspNetCore Redis实现分布式缓存
分布式缓存描述: 分布式缓存重点是在分布式上,相信大家接触过的分布式有很多中,像分布式开发,分布式部署,分布式锁.事物.系统 等有很多.使我们对分布式本身就有一个很明确的认识,分布式就是有多个应用程序 ...
- redis GEO的使用
一.概念 redis的GEO特性在Redis3.2版本发布,这个功能可以将用户给定的地理位置信息储存起来,并对这些信息进行操作. GEO常用语LBS(Location Based Service),基 ...
- 关于梯度下降之前需要进行feature scale的记录
先上吴恩达老师的课件图 1.对于梯度下降而言,学习率很大程度上影响了模型收敛的速度.对于不同规模的特征,如果采用相同的学习率,那么如果学习率适应于scale大的数据,scale较小的数据由于学习率过大 ...