使用 proxmox 在 ZFS 上對 PostgreSQL/TimescaleDB VM 進行快取配置

使用 proxmox 在 ZFS 上對 PostgreSQL/TimescaleDB VM 進行快取配置

我有一個單節點的 proxmox 集群,我想使用 PostgreSQL 和 TimescaleDB 啟動一個新的 VM,在閱讀了大量有關如何為此目的調整 ZFS 卷的文章後,我仍然對快取選項有一些疑問。我們有 3 個快取:proxmox 快取(ARC)、linux vm 快取(LRU)和 PostgreSQL 快取(時脈掃描);按照從遠到近 DB 的順序。

我讀過很多信息,其中一些是矛盾的,所以我不知道這是否屬實,但似乎 PG 緩存的設計方式與內核緩存不同,它試圖捕獲所有內容,並且僅當沒有足夠的空間來繼續緩存時才逐出。事實上,它似乎更像是目前正在處理的資料的緩衝區,而不​​是長期快取。事實上,它被稱為共享緩衝區。我想這就是為什麼文件不建議像 ARC 那樣將shared_buffers 設定為可用記憶體的較高百分比,而是在 25% 到 50% 之間。看來真正的PG快取是核心快取而不是shared_buffers。

考慮到這一點,需要考慮一些可能的配置:

  1. 建立一個具有適度 RAM 量(假設為 12GB)的 VM,並將共用緩衝區設為 10GB。嘗試這樣做:1)有足夠的記憶體作為正在進行的查詢的緩衝區。 2) 限制虛擬機器 RAM 不使用其緩存,其 LRU 配置應該是最糟糕的緩存,而應使用權重更好的 ARC 快取。此配置的問題可能來自於虛擬機器外部的緩存,並且可能會降低效能而不是提高效能。也不確定我必須留下多少空間來運行虛擬機器作業系統和其他資料庫進程。
  2. 建立一個具有大量 RAM(假設為 48 GB)的 VM,並將共用緩衝區保留在相同的 10GB 中。 zfs也將主快取設定為元資料。這樣,快取將更靠近資料庫並位於虛擬機器內部,但邏輯最差。看來 LRU 對 DB 來說有點不好。
  3. 建立一個具有大量 RAM 且 Primarycache=all 的 VM。我認為這將是一件壞事,因為:1)VM 和 proxmox chaches 將爭奪資源。 2) 快取複製。

為了提供一些背景信息,該節點具有 64GB 的總 RAM,PG/timescaleDB 將是在其上運行的要求更高/優先級更高的應用程式。

那麼,我最初的假設正確嗎?哪種配置效果較好?你會改變什麼?

誠摯的問候,感謝您的寶貴時間,

赫克托

答案1

我的建議是使用解決方案 #4:建立一個具有大量 RAM 的 VM,並在 KVM (Proxmox) 端用於cache=none資料磁碟。這將阻止 Proxmox 使用主機頁面緩存,從而有效地運行真實儲存同步。透過這種方式,您可以在虛擬機中盡可能接近裸機,並且可以在那裡微調您的快取。

請注意,對於我所知道的所有資料庫(包括 PostgreSQL),RAM 緩衝區不僅僅是磁碟緩存,而且至少會將部分資料保留為可讀取的格式或磁碟格式。這意味著,為 DB 進程預留的 RAM 比僅用作 I/O 緩衝區的 RAM 更有價值。

如果您的資料庫可以從(自己的)RAM 應答查詢,則它根本不會透過 IO 堆疊運行,從而大大節省延遲。

相關內容