了解 PostgreSQL 共享内存

已完成

PostgreSQL 使用的内存可以分为:

  • 本地内存 - 分配给每个进程
  • 共享内存 - 由所有进程使用

本地内存

PostgreSQL 中的每个进程都需要内存进行查询处理。 以下服务器参数允许定义内存使用情况:

work_mem 定义了 ORDER BY 和 DISTINCT 操作中对元组进行排序所需的内存。 此参数确定可用于内部排序作和哈希表的内存量。 如果你有大量可用内存,并且工作负载具有复杂的排序查询,则增大此参数值可以在溢出到磁盘之前允许更大的内存扫描以提高性能。

但是,一个复杂的查询可能会有许多排序和哈希操作同时运行。 每个操作在开始将数据写入基于磁盘的临时文件之前,都会根据此值尽可能多地使用内存。 因此,在繁忙的系统上,内存的总使用量比单个 work_mem 参数的使用量大很多倍。

若要优化此值,请使用总 RAM * 0.25 / max_connections 作为初始值。

maintenance_work_mem清理重新编制索引所需的内存。 此参数确定可用于内部排序作和哈希表的内存量。 默认值为 64 KB,但增加此值可以提高清扫性能。

autovacuum_work_mem 设置每个 autovacuum 进程要使用的最大内存。

temp_buffers 定义用于存储临时表的内存。 此参数设置每个数据库会话使用的最大临时缓冲区数。

effective_cache_size 定义操作系统和数据库中用于磁盘缓存的可用内存量。 PostgreSQL 查询规划器确定此内存是否在 RAM 中固定。 索引扫描最有可能用于较高的值,否则,如果值较低,则使用顺序扫描方式。

将计算机总 RAM 的 effective_cache_size 设置为 50%。

共享内存

共享内存在启动时分配。 共享内存用于:

shared_buffers 定义服务器使用的共享内存缓冲区。 PostgreSQL 将表和索引的页面从永久性存储加载到共享缓冲池,然后在内存中处理它们。 此共享缓冲池是服务器使用的共享内存的主要组件。 默认值为 128 MB(具体取决于计算层)。 如果决定分配更多内存,则需要重启服务器。

wal_buffers 在将磁盘页缓冲区写入持久存储之前,在共享内存中定义用于提前写入日志记录(WAL)的磁盘页缓冲区数。

总之,与内存相关且可能需要调整的重要服务器参数包括:

  • 共享缓冲区 (shared_buffers)
  • 工作内存 (work_mem)
  • 有效缓存大小