5. 内存结构
共享内存
共享内存在 PostgreSQL 服务器启动时分配,由所有后端进程共同使用 。 共享内存主要由三部分组成 :
- shared buffer pool : PostgreSQL 将表和索引中的页面从持久存储装载到这里 , 并直接操作它们
- WAL buffer: WAL 文件持久化之前的缓冲区
- CommitLog buffer : PostgreSQL 在 Commit Log 中保存事务的状态,并将这些状态保留在共享内存缓冲 区 中,在整个事务处理过程中使用 。
共享缓冲区(shared_buffers)
PostgreSQL启动后,会生成一块共享内存,共享内存主要是用于数据块的缓冲区,以便提高读写性能。wal日志的缓冲区和clog(commit log)缓冲区也位于共享内存中。除此之外,一些全局信息也保存在共享内存中,如进程信息,锁信息,全局统计信息等。
一般情况下,share_buffer 值不需要设置的很大,推荐值为是1/4物理内存。默认值为128MB,启动时配置。
postgres->postgres@[local]:5432=# show shared_buffers;
shared_buffers
----------------
128MB
(1 row)
postgres->postgres@[local]:5432=# select name,setting,unit,current_setting(name) from pg_settings where name = 'shared_buffers';
shared_buffers的较大设置通常需要相应增加max_wal_size,以便分散在较长时间内写入大量新数据或更改数据的过程。
日志缓冲区(wal_buffers)
用于指定尚未写入磁盘的WAL数据的共享内存量。 默认设置-1选择大小等于3%的shared_buffers,但不小于64kB,也不超过一个WAL段的大小,通常为16MB。
WAL缓冲区的内容在每次事务提交时写入磁盘,因此极大的值不太可能提供显着的好处。 但是,将此值设置为至少几兆字节可以提高许多客户端一次提交的繁忙服务器的写入性能。 默认设置-1选择的自动调整在大多数情况下应该给出合理的结果。
共享内存存储的信息
本地内存
后台服务进程除了访问共享内存外,还会申请一些本地内存,以便暂存一些不需要全局存储的数据,一般分为以下几类:
- temp_buffers(临时缓冲区):用于存放数据库会话访问临时表数据,默认值8MB
- work_mem :内部排序聚合操作和hash表在使用临时磁盘文件时使用的内存缓冲区,需要关注的是:每个排序操作都会消耗一个work_mem内存,并不是一个SQL消耗一个,因此,当您的系统中有大量的排序时,此值可适当调小,防止内存用尽
- maintenance_work_mem:维护操作(如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)使用的内存缓冲区