瞭解 PostgreSQL 共用記憶體

已完成

PostgreSQL 使用的記憶體可被分類為:

  • 本機記憶體 - 配置給每個進程
  • 共用記憶體 - 由所有進程使用

本機記憶體

PostgreSQL 中的每個進程都需要記憶體來進行查詢處理。 下列伺服器參數可讓您定義記憶體使用量:

work_mem 定義用於 ORDER BY 和 DISTINCT 作業排序元組所需的記憶體。 此參數會決定內部排序作業和哈希表可用的記憶體數量。 如果您有大量的可用記憶體,且工作負載具有複雜排序的查詢,增加此參數值可能會藉由允許較大的記憶體內部掃描,再溢出至磁碟來改善效能。

不過,一個複雜的查詢可能會同時執行許多排序和哈希作業。 每個作業在開始寫入磁碟型暫存盤之前,都會使用與此值一樣多的記憶體。 因此,在忙碌系統中,記憶體使用量總計是個別 work_mem 參數的多次。

若要微調此值,請使用 RAM 總計 * 0.25 / max_connections 作為初始值。

maintenance_work_memvacuumreindex 所需的記憶體。 此參數會決定內部排序作業和哈希表可用的記憶體數量。 默認值為 64 KB,但增加此值可改善真空的效能。

autovacuum_work_mem 設定每個自動清理程序要使用的記憶體上限。

temp_buffers 會定義用來儲存臨時表的記憶體。 此參數會設定每個資料庫會話所使用的暫存緩衝區數目上限。

effective_cache_size 會定義作業系統和資料庫內的磁碟快取可用記憶體數量。 PostgreSQL 查詢規劃工具會決定此記憶體是否固定在 RAM 中。 索引掃描最有可能用於較高的值;否則,如果值很低,則會使用循序掃描。

effective_cache_size 設定為機器 RAM 總計的 50%。

共用記憶體

共用記憶體會在啟動時分配。 共用記憶體用於:

shared_buffers 定義伺服器所使用的共用記憶體緩衝區。 PostgreSQL 會將數據表和索引的頁面從永續性記憶體載入共用緩衝池,然後在記憶體中運作。 這個共用緩衝池是伺服器所使用共用記憶體的主要元件。 預設值為 128 MB(視計算層而定)。 如果您決定配置更多記憶體,則必須重新啟動伺服器。

wal_buffers 定義共用記憶體中的磁碟頁面緩衝區數目,以便進行預寫記錄 (WAL),再將其寫入永續性儲存體。

總而言之,與您可能想要微調的記憶體相關的重要伺服器參數如下:

  • 共享緩衝區
  • work_mem
  • effective_cache_size