Postgresql体系架构(四)-内存结构
PostgreSQL的内存结构,分为:本地内存和共享内存。另外还有一些为辅助进程分配的内存等。
当我们和数据库建立一个连接请求时,数据库帮我们创建1个后端进程。并给该后端进程分配 的内存区域,该内存区域只属于这一个后端进程使用,可以认为是私有的。用于处理和响应我们向数据库发起的请求操作。通常包含:工作区work mem、维护工作区、临时缓冲区。
1. 本地内存
每个后端进程分配本地内存进行查询处理,当后端服务进程被fork时,每个后端进程为查询分配一个本地内存区域。本地内存包含三部分:work_mem、maintenance_work_mem和temp_buffers。
(1) work_mem: 使用 work mem,区域用于对元组的排序,比如 order by、distinct操作。也用于表的join 操作,比如 merge-join、hash-join 操作。由参数 work mem 控制,默认是 4MB。需要关注的是:每个排序操作都会消耗一个work_mem内存,并不是一个SQL消耗一个,因此,当您的系统中有大量的排序时,此值可适当调小,防止内存用尽。
(2) maintenance_work_mem: 维护操作,例如 VACUUM 、 REINDEX 、 CREATE INDEX,alter table add foreign key等操作使用这部分内存。默认是64MB。由于数据库会话一次只能执行其中的一个操作,并且 PostgreSQL不会同时运行许多操作,因此可以将maintenance work mem 的值设置为明显大于 work mem 的值。
设置建议:
RAM*10%,最大不超过 1GB
如果 vacuum 有问题,可以设置的再大一点。
(3)Temp_buffers: 存放临时表。temp_buffer参数控制。默认是8MB。该参数设置每个数据库会话使用的临时缓冲区的最大数量。会话本地缓冲区仅用于访问临时表。可以在单个会话中更改此参数的设置,但只能在会话中首次使用临时表之前更改。PostgresaL利用这个内存区域来保存每个会话的临时表,当连接关闭时这些临时表将被清除。
2. 共享内存
PostgreSQL启动后会分配一块共享内存,这个区域也被划分为几个固定大小的子区域由所有的后端进程共同使用。
PostgreSQL 启动后,会生成一块共享内存,用于做数据块的缓冲区,以便提高读写性能。WAL日 志缓冲区和Clog缓冲区也存在共享内存中,除此之外还有全局信息比如进程、锁、全局统计等信息也 保存在共享内存中。 其中最重要的组成部分是Shared Buffer和WAL Buffer。
主要包含以下三部分:
(1)shared buffer pool : PostgreSQL 将表和索引中的页面从持久存储装载到这里,并直接操作它们 。由参数 shared buffers 控制,默认是 128MB
(2)WAL buffer: WAL文件持久化之前的缓冲区。在服务端出现问题的时候,确保数据不会丢失,在写到磁盘之前,wal buffer是wallog的缓存区域
(3)CommitLog buffer : PostgreSQL 在 Commit Log 中保存事务的状态,并将这些状态保留在共享内存缓冲区中,在整个事务处理过程中使用。是并发控制机制的一部分。事务有以下四种状态:in progress、commited、aborted、sub-commited。
其它内存参数:
effective_cache_size
用于指示数据库优化器,当前的数据库服务器可以提供多少的缓存空间。这里的缓存空间不仅仅是内存的缓存空间,也考虑了文件系统缓存空间、CPU的缓存空间等。effective_cache_size 是这些缓存空间的总和。
设置规划器对一个单一查询可用的有效磁盘缓冲区尺寸的假设。 这个参数会被考虑在使 用一个索引的代价估计中,更高的数值会使得索引扫描更可能被使用,更低的数值会使 得顺序扫描更可能被使用。 在设置这个参数时,你还应该考虑PostgreSQL的共享缓冲区 以及将被用于PostgreSQL数据文件的内核磁盘缓冲区,尽管有些数据可能在两个地方都 存在。 另外,还要考虑预计在不同表上的并发查询数目,因为它们必须共享可用的空 间。 这个参数对PostgreSQL分配的共享内存尺寸没有影响,它也不会保留内核磁盘缓 冲,它只用于估计的目的。系统也不会假设在查询之间数据会保留在磁盘缓冲中。 如果 指定值时没有单位,则以块为单位,即BLCKSZ字节,通常为8kB。 默认值是 4吉字节 (4GB)。(如果BLCKSZ不是8kB,默认值会按比例缩放它。)
对于effecve_cache_size的一般建议如下:
- 将该值设置为可用的文件系统缓存的数量
- 如果您不知道,可以将该值设置为系统总内存的50%
默认值为effecve_cache_size = 4GB。