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>