4.PG的进程和内存结构
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参数决定大小。