在本章中,总结了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

下面列出了相关的服务端进程,这里只做简单的介绍

Table 2.1: background processes.
process description reference
background writer 进程将shared buffer pool中的脏数据写到磁盘,检查点总能触发这个进程 Section 8.6
checkpointer  在9.2版本以后,检查点会触发产生这个进程 Section 8.6Section 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中列出的几个后台进程正在运行。

  1.  
    postgres> pstree -p 9687
  2.  
    -+= 00001 root /sbin/launchd
  3.  
    \-+- 09687 postgres /usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
  4.  
    |--= 09688 postgres postgres: logger process
  5.  
    |--= 09690 postgres postgres: checkpointer process
  6.  
    |--= 09691 postgres postgres: writer process
  7.  
    |--= 09692 postgres postgres: wal writer process
  8.  
    |--= 09693 postgres postgres: autovacuum launcher process
  9.  
    |--= 09694 postgres postgres: archiver process
  10.  
    |--= 09695 postgres postgres: stats collector process
  11.  
    |--= 09697 postgres postgres: postgres sampledb 192.168.1.100(54924) idle
  12.  
    \--= 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, 每一块区域又分为三个子区域 ,见下表

Table 2.2: 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

这块区域在服务器启动的时候分配,这块区域也是分为好几个子区域,见下面介绍

Table 2.3: 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 进程和内存结构的更多相关文章

  1. PostgreSQL进程和内存结构

    PostgreSQL数据库启动时,会先启动一个叫做Postmaster的主进程,还会fork一些辅助子进程,这些辅助子进程各自负责一部分功能,辅助子进程分类如下: $ ps -ef | grep po ...

  2. postgresql进程及内存结

    一.进程和内存架构图 postgresql数据库启动时,先启动一个postmaster的主进程,然后fork出一些辅助子进程. 二.主进程postmaster -bash-4.2$ which pos ...

  3. Windows中进程的内存结构

    基础知识: 栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表.允许插入或删除操作的一端称为栈顶,另一端称为栈底,对栈的插入和删除操作被称为入栈和出栈. 有一组CPU指令可以实现对进程 ...

  4. 面试问题之操作系统:Linux下进程的内存结构

    转载于:http://www.hqj.com/news/emb184.htm Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间.该地址空间是大小为4GB的线性虚拟空间 ...

  5. [转]oracle学习入门系列之五内存结构、数据库结构、进程

    原文地址:http://www.2cto.com/database/201505/399285.html 1 Oracle数据库结构 关于这个话题,网上一搜绝对一大把,更别提书籍上出现的了,还有很多大 ...

  6. PostgreSQL内存结构图示

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页    回到顶级页面:PostgreSQL索引页 作者:高健@博客园 luckyjackgao@ ...

  7. 概览JVM的基本结构和JVM内存结构

    概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...

  8. JVM的基本结构和JVM的内存结构

    这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫JVM内存模型. 1.JVM的基本结构 ...

  9. PG进程结构和内存结构

    ​ 本文主要介绍PostgreSQL数据库(后文简称PG)进程结构和内存结构,物理结构将在后续继续整理分享. ​ 上图描述了PG进程结构.内存结构和部分物理结构的内容.图中的内容包含了两个部分: PG ...

随机推荐

  1. macbook下使用pycharm2019版本配置远程连接服务器

    pycharm提供了很方便的与服务器同步代码,并执行的插件.我在配置windows版的pycharm时配置成功,在挪用到mac上则遇到了些许问题,终于是解决了,在此记录配置的过程 目的:pycharm ...

  2. Python爬虫快速上手教程

    1 这个是什么        整理Python中requests常用的API 2 代码 from bs4 import BeautifulSoup import requests import re ...

  3. 使用 SetParent 制作父子窗口的时候,如何设置子窗口的窗口样式以避免抢走父窗口的焦点

    原文:使用 SetParent 制作父子窗口的时候,如何设置子窗口的窗口样式以避免抢走父窗口的焦点 制作传统 Win32 程序以及 Windows Forms 程序的时候,一个用户看起来独立的窗口本就 ...

  4. Spring AOP 创建Advice 基于Annotation

    public interface IHello { public void sayHello(String str); } public class Hello implements IHello { ...

  5. 14-4 ADO.NET简介2

    14-4-1Connection连接.关闭数据库 1.为了访问数据库,就要提供数据库连接类,在C#中,是通过Connection类来实现的.它有 四种类型的连接方式: SQLConnection AD ...

  6. WebClient 请求 https 页面出错:未能创建 SSL/TLS 安全通道

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | Securi ...

  7. Java调用WebService方法总结(3)--wsimport调用WebService

    wsimport是JDK自带的把WSDL转成Java的工具,可以很方便的生成调用WebService的代码.文中所使用到的软件版本:Java 1.8.0_191. 1.准备 参考Java调用WebSe ...

  8. Jsp页面显示时间:<fmt>标签问题

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"%> <%@ taglib ...

  9. native function 'Window_sendPlatformMessage' (4 arguments) cannot be found

    https://github.com/pauldemarco/flutter_blue/issues/140 https://github.com/flutter/flutter/issues/168 ...

  10. HTML学习摘要5

    DAY 5 HTML <address> 元素定义文档或文章的联系信息(作者/拥有者). 此元素通常以斜体显示.大多数浏览器会在此元素前后添加折行. HTML <cite> 元 ...