我有一个具有 12Gb 内存的 Ubuntu Linux 系统,其中大部分(至少 10Gb)可以单独分配给 postgres。该系统还有 6 个磁盘 15k SCSI RAID 10 设置。
我尝试优化的过程有两个方面。
首先,单线程、单连接将对通过外键链接的 2-4 个表进行多次插入。
其次,对结果数据运行许多不同的复杂查询,大量使用group by。这部分尤其需要优化。
为了利用四核 CPU,我同时运行四个这样的进程,因此通常不会有超过 5 个并发连接(1 个备用用于管理任务)。
您建议对默认 Postgres 配置进行哪些配置更改?
我正在寻找诸如 work_mem、shared_buffers 等的最佳值。
谢谢!
答案1
我会降低 checkpoint_segments,每个将占用 16MB,总共 1GB(64 * 16MB)。将 1GB 写入磁盘可能需要太长时间。如果您有 512MB RAM 的 RAID 卡,只需使用 50% 的 WALL 段即可获得非常好的写入性能:checkpoint_segments 16
还可以将 checkpoint_timeout 降低到 2 或 3 分钟,以获得更好、更可预测的性能。
如果您有大量 INSERT,请使用准备好的语句,将大量 INSERT 放在单个事务中,甚至使用 COPY。COPY 将为插入提供最佳性能。每个事务都必须适合单个壁缓冲区才能获得最佳性能。您选择 2MB 作为壁缓冲区,测试一下是否合适。
答案2
以下是我目前想到的:
- 最大连接数100->8
- 检查点段3 -> 64
- 检查点完成目标0.5->0.8
- 工作内存1MB->64MB
- 维护工作内存16MB->256MB
- log_temp_files-1 -> 0
- wal_buffers64kb->2MB
- random_page_cost4.0 -> 2.0
- 有效缓存大小128MB > 9216MB
- 共享缓冲区24MB > 4096MB
希望有人可以验证这些是合理的设置或对此进行改进。
答案3
这个链接也可能有用: 调整你的 PostgreSQL 服务器