Postgresql 10 - 并行配置
Postgresql 10 - Parallel configuration
有4种配置可以开启并行和做优化,但是PostgreSQL的documentation并没有说任何值和计算。我的问题是:
1- How to calculate the values of max_parallel_workers
,
max_parallel_workers_per_gather
and max_worker_processes
?
2- The work_mem
can be calculate on base of connections and
memory(RAM), but the work_mem
needs to change something if I enable
the parallel?
我的假设是:如果机器有8核the max_parallel_workers
是8,worker process和per gather的值是32(8*4),我从原来的配置中取的数字4就是每 1 个并行工作 4 个集合。
问题很明显,但答案却不是。
我将尝试描述的范围更广一些,因此如果您觉得某些内容很明显 - 请跳过它。
首先-这里描述了它是如何工作的here. What that parameters are for is described here。换句话说 - PG 拥有可以在后台执行某些操作的进程池。它们的最大数量受 max_worker_processes
限制。当执行 table 扫描时,它可能需要很长时间,因此让更多进程获取数据是明智的。这可以在后台完成,由...后台工作人员完成。它们可以完成的查询计划节点有:gather
、gather-merge
。
每个后台工作者都有自己的内存——用于排序和其他与执行相关的事情。他们一直都在那里,所以最好记住这一点,只是为了确保系统没有使用交换...
除此之外。尝试找出每个查询的最佳工作人员数量——默认情况下为 2。因此,如果一切正常,则有两个后台工作人员用于收集数据。下一个问题是并行执行了多少查询。我的意思是 - 需要并行处理的大量查询。有了这两个数字 - 每个查询 4 个工作人员和 10 个查询 - 只需要 40 个工作人员。您可以计算是否可行,或者对此进行试验。这样或那样 - 还有一个参数 - max_worker_processes
。有 40 名工人进行并行处理——你需要更多的工人来完成其他任务——比如复制。
40听起来合理吗?这里有两个反点——默认情况下 PG 是 OLTP 数据库。所以系统已经为其他事情做好了准备,这种变化可以带来好的结果。另一方面 - 有一个 bgwriter
,所以毕竟有一个处理 I-O 的进程。它依赖于系统,但仍然是一个过程。
所以答案远非完美 - 您需要尝试、收集自己的统计数据并做出决定。
经过一番搜索,我找到了一些答案,这可以帮助那些想要启用和拥有基本配置的人,如果您有 4 个内核(CPU):
您的最大工作进程将是核心数量,最大并行需要具有相同的数量:
max_worker_processes = 4
max_parallel_workers = 4
收集更复杂,因为可以根据您的需要和资源操纵此值,有必要进行测试以获得最佳值,但要启动值,您可以使用 cores/2.
max_parallel_workers_per_gather = 2
这不是最终答案,还有一些遗漏...我仍在搜索和更新此答案或等待更好的答案。
有一个不错的小在线配置实用程序可以帮助设置主要 postgresql.conf 值。
它并不完美,但它提供了一个可能有用的起点。
有4种配置可以开启并行和做优化,但是PostgreSQL的documentation并没有说任何值和计算。我的问题是:
1- How to calculate the values of
max_parallel_workers
,max_parallel_workers_per_gather
andmax_worker_processes
?2- The
work_mem
can be calculate on base of connections and memory(RAM), but thework_mem
needs to change something if I enable the parallel?
我的假设是:如果机器有8核the max_parallel_workers
是8,worker process和per gather的值是32(8*4),我从原来的配置中取的数字4就是每 1 个并行工作 4 个集合。
问题很明显,但答案却不是。
我将尝试描述的范围更广一些,因此如果您觉得某些内容很明显 - 请跳过它。
首先-这里描述了它是如何工作的here. What that parameters are for is described here。换句话说 - PG 拥有可以在后台执行某些操作的进程池。它们的最大数量受 max_worker_processes
限制。当执行 table 扫描时,它可能需要很长时间,因此让更多进程获取数据是明智的。这可以在后台完成,由...后台工作人员完成。它们可以完成的查询计划节点有:gather
、gather-merge
。
每个后台工作者都有自己的内存——用于排序和其他与执行相关的事情。他们一直都在那里,所以最好记住这一点,只是为了确保系统没有使用交换...
除此之外。尝试找出每个查询的最佳工作人员数量——默认情况下为 2。因此,如果一切正常,则有两个后台工作人员用于收集数据。下一个问题是并行执行了多少查询。我的意思是 - 需要并行处理的大量查询。有了这两个数字 - 每个查询 4 个工作人员和 10 个查询 - 只需要 40 个工作人员。您可以计算是否可行,或者对此进行试验。这样或那样 - 还有一个参数 - max_worker_processes
。有 40 名工人进行并行处理——你需要更多的工人来完成其他任务——比如复制。
40听起来合理吗?这里有两个反点——默认情况下 PG 是 OLTP 数据库。所以系统已经为其他事情做好了准备,这种变化可以带来好的结果。另一方面 - 有一个 bgwriter
,所以毕竟有一个处理 I-O 的进程。它依赖于系统,但仍然是一个过程。
所以答案远非完美 - 您需要尝试、收集自己的统计数据并做出决定。
经过一番搜索,我找到了一些答案,这可以帮助那些想要启用和拥有基本配置的人,如果您有 4 个内核(CPU):
您的最大工作进程将是核心数量,最大并行需要具有相同的数量:
max_worker_processes = 4
max_parallel_workers = 4
收集更复杂,因为可以根据您的需要和资源操纵此值,有必要进行测试以获得最佳值,但要启动值,您可以使用 cores/2.
max_parallel_workers_per_gather = 2
这不是最终答案,还有一些遗漏...我仍在搜索和更新此答案或等待更好的答案。
有一个不错的小在线配置实用程序可以帮助设置主要 postgresql.conf 值。
它并不完美,但它提供了一个可能有用的起点。