天天看点

PostgreSQL 10.0 preview 多核并行增强 - 控制集群并行度

postgresql , 多核并行 , 集群并行度 , sql并行度 , node并行度

postgresql 9.6引入多核并行,一条sql可以使用多个cpu核,提升sql性能。

但是多核并行一定不要滥用,因为cpu资源有限,如果单个query把cpu都用光了,其他query就会因为缺乏cpu资源造成性能抖动。

9.6刚出来的时候,可以控制单个gather的并行度,比如全表扫描,扫描节点算一个gather,一个gather下面会fork 一些worker process执行并行任务。

9.6通过max_worker_processes参数控制整个集群的并行度,同时运行的query,同时启动的worker process总数不能超过max_worker_processes设置的值。

但是系统中还有其他功能还需要fork worker process,比如pg_base_basckup,比如standby,都会用到worker process。

那么多核计算很可能会影响这些应用。

10.0 新增了一个控制多核并行的参数max_parallel_workers,用于控制整个集群允许开启的用于多核计算的worker process.

这样就可以控制用于并行的workers不会占满所有的max_worker_processes。

设置max_parallel_workers后,可以大幅提升开启并行计算后的数据库oltp稳定性。

比如64核的机器

max_parallel_workers_per_gather(8) < max_parallel_workers(48) < max_worker_processes(64)

1. max_worker_processes (integer)

设置集群允许fork的最大worker process数目

2. max_parallel_workers_per_gather (integer)

设置query中单个gather node允许开启的worker process数目

3. max_parallel_workers (integer)

设置整个数据库集群,允许同时开启的用于多核计算的worker process数目

除此之外,postgresql的并行度是如何计算,如何控制并行度的?请参考

<a href="https://github.com/digoal/blog/blob/master/201610/20161002_01.md">《postgresql 9.6 并行计算 优化器算法浅析》</a>

1. 按时间段配置并行度,比如0点到8点,并行度开到最大。平时降一半。

这种配置可以用于olap+oltp的混合场景,例如晚上用于统计,白天用于oltp,白天即使有多核并行的query,由于现在了集群级别的并行度,所以对oltp也不会有影响。

2. 如果你要设置单个会话的最大并行度,可以设置会话级别的max_parallel_workers参数,如果你要设置单个query的最大并行度,则设置max_parallel_workers或者max_parallel_workers_per_gather即可

<a href="https://www.postgresql.org/docs/devel/static/runtime-config-resource.html">https://www.postgresql.org/docs/devel/static/runtime-config-resource.html</a>

继续阅读