我看到很多 PostgreSQL 性能调优博客和 EDB 等公司建议将PostgreSQL 的max_worker_processes设置为机器中的CPU 数量。
我们在云中使用具有16 个 vCPU的专用PostgreSQL 13 VM 。但 Postgres 默认设置max_worker_processes=8。基于默认值 我的想法是 Postgres 最多只能使用 8 个 vCPU,预计最大 CPU 使用率约为 50%,直到几天前我们遇到了一些连接峰值,这实际上与 I/O 过载有关,但 CPU 却达到了 95尖峰期间-99%。
那么 max_worker_processes 与 CPU 有何关系呢?如果我将其保留为默认值 8,这会产生任何影响吗?或者还有其他方法可以找到最佳值吗?
我认为你误会了
max_worker_processes
。此参数不限制 PostgreSQL 后端进程(属于数据库会话的服务器进程)的数量,但限制自定义后台工作进程(例如,其他并行工作进程)的数量。如果您不使用创建额外后台工作进程的 PostgreSQL 扩展(例如
pg_prewarm
或),则如果您不同时增加并行工作进程的限制,pg_timetable
则增加几乎没有什么用处。max_worker_processes
max_parallel_workers
如果您的工作负载受 I/O 限制或者您的数据仓库一次运行单个查询,则将这些参数设置为与 CPU 核心数量一样高就可以了。对于 CPU 限制的工作负载,我会将这些参数设置得较低,这样您就不会面临并行工作进程使 CPU 过载的危险。将参数设置得较高以优化响应时间,将参数设置得较低以优化吞吐量,因为并行查询比单线程查询使用更多的资源。