4.PG的进程和内存结构

发布时间 2023-12-19 22:04:05作者: 太白金星有点烦

1.我们在启动PG数据库时,会先启动一个Postmaster的主进程,还会fork出一些辅助的子进程,其中辅助的子进程主要包含:

   1)Logger(系统日志)进程  2)BgWriter(后台写)进程  3)WalWriter(预写式日志) 进程 

     4) PgArch(归档)进程        5) AutoVacuum(系统自动清理)进程    6)PgStat(统计信息收集)进程

 以下就是进程和内存图

  •  Postmaster主进程是整个实例的总控制进程,负责启动和关闭数据库实例,它也是pg数据库第一个进程,此进程还会fork出一些辅助的子进程
  • Logger子进程是系统日志进程,只有当参数logging_collect设置为on时,主进程才会启动Logger子进程,
  • BgWriter后台写进程,该进程的作用是把共享内存中的脏页写到磁盘上
  • WalWriter进程是预写式日志进程,该进程是及将xlog缓冲区的数据写到磁盘上
  • pgArch进程:WAL日志是循坏使用的,pgArch进程会把覆盖前的WAL日志备份出来(类似于oracle的归档日志)
  • Auto vacuum:自动清理进程,当对表进程delete操作之后,原有的数据不会立即被清除,原有的数据只是会被标记成一个删除状态,只有在没有其他事务使用这些数据时,才会被清除掉,
  • PgStat进程:该进程主要使用进行统计收集工作,收集的信息主要用于查询优化时的代价估算,这些信息包括一个表和索引上进行了多少插入、更新、删除操作
  • Checkpoint进程主要是用于刷脏页

2.PG的内存结构

  如下图 

 内存结构分为共享内存、本地内存。类似于Oracle的SGA和PGA

共享内存
是指数据库服务器向操作系统申请的共享内存段,如数据共享缓冲区、日志缓冲区、事务提交日志内存区等,提供给PostgreSQL服务器的所有进程使用。

数据共享缓冲区:PostgreSQL把要操作和处理的表、index,读入到内存中,放到该区域缓存。类似于Oracle的database buffer cache。其大小由shared_buffers参数决定。

日志缓冲区:用于缓存数据库中对数据修改的日志记录,如:update table test set id=1这条SQL语句,数据库会把这个操作的信息记录在该内存区,将来写出到日志文件中,如果配置为归档模式,则最终写出到归档日志文件中去,用于恢复使用。其大小由wal_buffers参数决定。类似于Oracle的log buffer。

提交日志缓冲区:该内存区域有别于wal buffer日志缓冲区。它用于记录数据库中所有事务的提交状态,事务是否已经提交,是否已经终止,是否进行中,子事务等状态信息。用于MVCC。

本地内存
当我们和数据库建立一个连接请求时,数据库帮我们创建1个后端进程。并给该后端进程分配的内存区域,该内存区域只属于这一个后端进程使用,可以认为是私有的。用于处理和响应我们向数据库发起的请求操作。通常包含:工作区work mem、维护工作区、临时缓冲区。

工作区:该内存区用于处理客户端SQL语句请求的order by排序、distinct过滤、表合并连接merge-join、哈希连接hash-join操作等。由work_mem参数决定大小。

维护工作区:该内存区域用于处理重建索引reindex、vacuum空间回收操作、给表添加外键约束等。由maintenance_work_mem参数决定大小。

临时缓冲区:该内存区用于创建和访问临时表时,存放临时表的数据。该内存区和因为SQL中因为大表排序或hash table而在服务器上建立的临时文件(位于pgsql_tmp路径下)没有直接关系。由temp_buffers参数决定大小。