天天看點

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>

繼續閱讀