Postgresql

Postgresql 9.6 大型管理工作的最佳設置(min_wal 和 max_wal)

  • July 24, 2020

我們有一個與世界斷開連接的伺服器。這是一個高端系統,配備 48GB 記憶體和 500GB SSD 硬碟,16 核 CPU。我們正在嘗試做一個pg_restore少於 10 個表的簡單數據庫轉儲,沒有二進制數據或 blob,只有簡單的文本(評論系統)。但是一張表有大約 200GB 的數據,所以它很大。

該數據庫沒有其他工作。只有這個維護任務。鑑於上述配置,為此目的的最佳設置是什麼?PGSQL 的文件對我幫助不大。我的具體問題是關於 wal 設置。

如果我們可以使用整個伺服器來做 a pg_restore,而這台伺服器上除了 PG 之外沒有其他東西,我們應該使用什麼設置?這就是我們現在所擁有的:

maintenance_work_mem = 1500MB 
fsync = off
synchronous_commit = off
wal_level = minimal
full_page_writes = off
wal_buffers = 64MB
#-----  checkpoint_segments = 512
#-----  max_wal_size = (3 * checkpoint_segments) * 16MB
#-- min_wal_size = 100MB    # 80MB is the default
max_wal_size = 24576MB   # based on 512 checkpoint_segments 
max_wal_senders = 0
wal_keep_segments = 0
archive_mode = off
autovacuum = off

請注意,使用 top,我們發現記憶體不是問題。CPU 核心飆升至 100 左右,然後下降。這是一個密集的寫入過程,所以這是有道理的。歡迎任何關於如何設置的簡單易懂的指導min_wal_size——請注意,它現在已經為我們評論了。

我猜您只想測試轉儲的恢復是否有效,僅此而已,這意味著您可以進行一些不安全的配置更改。讓我們首先從您的設置開始。

這是一個很好的電話:

fsync = off
synchronous_commit = off
full_page_writes = off
wal_level = minimal
autovacuum = off

這三個僅在您使用複制時才重要,並且由於您已經設置wal_level為最小值,因此您沒有使用它,因此它們並不重要:

wal_keep_segments = 0
archive_mode = off
max_wal_senders = 0

你有很多 RAM 不會用於任何事情,我會增加這個:

maintenance_work_mem = 3GB 

我會保留wal_buffers它的預設值:

wal_buffers = -1

和凹凸shared_bufferswall_buffers將自動計算):

shared_buffers: 4GB

您應該盡量集中精力在還原期間不設置檢查點或盡可能少設置檢查點。檢查點由max_wal_size和控制checkpoint_timeout。首先碰到類似的checkpoint_timeout東西20h,以便在您恢復時不會發生定時檢查點:

checkpoint_timeout = 20h

然後,您可以設置max_wal_size為磁碟空間允許的最高值。如果您恢復的 DB 是200GB和您的 disk 500GB,您應該可以安全地設置max_wal_size為,100GB因為 Postgres 最多可以儲存兩個 wals 檢查點(即 2x max_wal_size):

max_wal_size = 100GB

min_wal_size在你的情況下沒那麼重要,但你可以將它提升到 10GB

min_wal_size = 10GB

我還建議您使用pg_restorewith --jobs=NUMwhere NUM 可能是 CPU 核心的數量,但這也取決於您的速度SSD,因此您可以使用此參數。

除了 Postgres 設置之外,我還建議您在可能的情況下向該磁碟添加一個額外的SATA驅動器(7200RPM會很好)和符號連結目錄。那是 Postgres 保存 WAL 的目錄,並且因為它們是附加編寫的,所以對它們來說足夠快。它會減少 . 上的負載,但也意味著您將能夠碰撞更多(取決於磁碟的大小)。pg_wal``SATA``SATA``SSD``max_wal_size``SATA

最後,不要忘記在轉儲恢復後將您的設置恢復為正常值。

我對 Strahinja 的回答給出了 +1,但要添加的內容可能比評論中的內容要多,因此請添加一個答案。

我對 Strahinja 的任何建議的唯一質疑是,最佳 WAL 大小可能會因硬體和作業系統而異。我已經看到基準,其中將大小保留為預設值比提升它們以恢復轉儲更好。這是一個驚喜,但有時確實會發生。如果您確實提升它們,我建議將大小設置為不超過建議的專用驅動器大小的三分之一的相等值。

我可以為此目的禁用 autovacuum,但請確保在您VACUUM ANALYZE;作為數據庫中的數據庫超級使用者執行之前不要考慮恢復。這將設置提示位並有效地建構可見性圖和可用空間圖,而不是一開始就加重前台查詢的負擔。統計數據將有助於進行良好的規劃。

並且絕對確保在系統上開始任何生產工作之前將配置設置回正常的生產配置並重新啟動數據庫服務!

引用自:https://dba.stackexchange.com/questions/168464