---max_connections
每一个连接消耗内存 = work_mem * 并行操作数 + 连接开销
总消耗内存 = 最大连接数 * 每一个连接消耗的内存 + Shared_Buffers + maintenance_work_mem + 主机总内存 * (Shared_Buffers / 主机总内存)
-假设:
总内存: 64GB
Shared Buffers: 16GB
maintenance_work_mem: 512MB
其他系统内存消耗: 64GB × 0.2 = 12.8GB
每个连接的内存消耗: 14MB
-根据公式,我们可以计算得出:
可用于连接的内存: = 64GB - 16GB - 512MB - 12.8GB = 34.688GB
推荐的最大连接数: = 34.688GB / 14MB ≈ 2480
推荐的最大连接数为约2480个。
max_connections=2480
---shared_buffers
shared_buffers 是 PostgreSQL 数据库配置文件 postgresql.conf 中的一个重要参数,它用于设置数据库服务器用于缓存数据和索引的内存量。这是数据库性能调优中最关键的参数之一。
-作用:
shared_buffers 参数控制着 PostgreSQL 用于共享内存的总量,这些内存用于存储数据和索引的缓存。
缓存可以显著提高数据库查询性能,因为它减少了对磁盘的访问需求。
一般建议将 shared_buffers 设置为系统总内存的 25% 到 50%。
如果你的服务器有 16GB 的 RAM,shared_buffers 可以设置为 4GB 到 8GB。
shared_buffers = 8GB
---work_mem
work_mem 是 PostgreSQL 数据库中的一个配置参数,用于指定数据库服务器为每个会话(session)动态分配的工作内存的总量。这个参数对于数据库查询的性能至关重要,因为它决定了 PostgreSQL 可以为排序(sort)、哈希表(hash tables)、聚合(aggregates)等操作在内存中使用的数据量。
单位: work_mem 的单位是 kilobytes (KB)。
例如,如果设置为 4MB,应该写为 4096(因为 1MB = 1024KB)。
work_mem=4MB
work_mem 与 maintenance_work_mem(用于维护操作,如 VACUUM)不同,后者专门用于数据库维护任务。
---maintenance_work_mem
maintenance_work_mem 是 PostgreSQL 数据库中的一个配置参数,它专门用于维护操作期间的内存分配。这些维护操作包括但不限于:
VACUUM:清理数据库中的死元组(dead tuples),回收空间,并更新索引统计信息。
ANALYZE:收集表和索引的统计信息,以帮助查询优化器选择更好的查询计划。
REINDEX:重建表或索引。
CLUSTER:根据特定的索引对表进行物理重新排序。
maintenance_work_mem=64MB
默认 maintenance_work_mem 值通常比 work_mem 要大,以便在执行资源密集型的维护任务时有足够的内存可用。
---autovacuum_work_mem
在 PostgreSQL 中,autovacuum_work_mem 参数用于设置自动真空(autovacuum)操作可以使用的工作内存量。自动真空是 PostgreSQL 中的一个维护进程,用于回收已删除的行所占用的空间,并防止表的膨胀。
如果你想要为自动真空设置一个具体的内存值,比如 128MB:
autovacuum_work_mem = 128MB
如果你想要自动真空使用与 maintenance_work_mem 相同的内存量,你可以这样设置:
autovacuum_work_mem = -1
maintenance_work_mem = 256MB
---effective_cache_size
在 PostgreSQL 中,effective_cache_size 参数用于估计数据库服务器的总可用缓存大小,包括内存中的共享缓冲区以及其他形式的系统缓存。这个参数对于数据库查询优化器选择查询计划(execution plan)非常重要,尤其是在涉及到大量数据扫描(如顺序扫描)和索引扫描的情况下。
通常,effective_cache_size 应该设置为数据库服务器的物理内存大小加上操作系统的文件系统缓存(如果已知)。例如,如果你的数据库服务器有 128GB 的 RAM,并且你知道操作系统的文件系统缓存大约占用了 20GB,那么 effective_cache_size 可以设置为 148GB。
如果你的服务器有 256GB 的内存,并且你决定为系统其他部分保留 10% 的内存,你可以这样设置:
effective_cache_size = 230GB # 256GB 的 90%
effective_cache_size=4096MB
---wal_buffers
在 PostgreSQL 中,wal_buffers 参数用于配置 WAL (Write-Ahead Logging) 缓冲区的大小。这个缓冲区是用于存储在事务提交之前必须写入磁盘的 WAL 数据的内存区域。wal_buffers 的设置会影响 PostgreSQL 的性能,尤其是在高并发写入的场景下。
当 wal_buffers 设置为 -1 时,PostgreSQL 会根据 shared_buffers 参数的大小自动计算 WAL 缓冲区的大小。计算公式通常是 shared_buffers 的 1/32。
通常,设置 wal_buffers 为 shared_buffers 的 1/32 到 1/16 是一个起点。
例如,如果你有 1GB 的 shared_buffers,那么 wal_buffers 可以设置为大约 32MB 到 64MB。