[轉帖]postgresql-shared_buffers參數詳解

shared_buffers 是 PostgreSQL 中一個非常關鍵的參數,用於配置服務器使用的共享內存緩衝區的大小。這些緩衝區用於存儲數據頁,以便數據庫可以更快地訪問磁盤上的數據。

這個參數在 PostgreSQL 的性能方面有着重要的影響。增加 shared_buffers 可以提高數據庫的性能,尤其是對於頻繁的讀取操作。但是,設置得太大可能會導致內存不足,影響其他系統進程的性能,需要謹慎平衡。

以下是關於 shared_buffers 的一些重要信息:

  1. 作用: 控制 PostgreSQL 服務器用於緩存數據頁的共享內存大小。這些數據頁是數據庫從磁盤讀取的數據的副本,在內存中存儲以提高後續讀取操作的速度。

  2. 默認值: 默認情況下,shared_buffers 的值是相對於系統總內存的一部分。默認設置通常比較保守,以兼顧系統的其他資源需求。

  3. 調整建議: 適當設置 shared_buffers 的值取決於多個因素,包括系統的可用內存、數據庫負載、運行中的查詢類型等。增加 shared_buffers 可以提高性能,但並不是所有情況下都能帶來線性的性能提升。

  4. 內存計算: 通常建議將 shared_buffers 設置爲物理內存的 25% 到 40% 之間。這只是一個起點,最佳值需要根據實際情況和性能測試來確定。

  5. 影響:shared_buffers 設置得過小可能導致頻繁的磁盤 I/O 操作,影響性能;而設置得過大可能佔用大量內存,影響系統的穩定性和其他進程的性能。

修改 shared_buffers 後通常需要重啓 PostgreSQL 服務器才能使更改生效。

1. 計算機緩存機制

計算機緩存是指用於臨時存儲數據的一種高速存儲器,其目的是提高數據訪問速度並加速計算機系統的性能。緩存系統通過在數據的訪問路徑中引入更快的存儲介質,減少了對慢速存儲(如硬盤)的訪問次數,從而加快數據的讀取和寫入。

1.1. 類型和工作原理:

  1. CPU 緩存(Cache Memory): 在現代計算機系統中,CPU 緩存是其中最重要的緩存之一。它通常分爲三級:一級緩存(L1 Cache)、二級緩存(L2 Cache)和三級緩存(L3 Cache)。這些緩存以層級結構的方式嵌入在 CPU 內部,並用於存儲CPU經常需要訪問的數據和指令。這些緩存級別按速度和容量遞減排列,L1 最快但容量最小,L3 最慢但容量最大。

  2. 硬盤緩存(Disk Cache): 操作系統和文件系統會使用部分內存作爲硬盤緩存,用於存儲磁盤上最近訪問的數據塊的副本。這樣的緩存減少了從慢速的機械硬盤讀取數據的需求,提高了文件訪問速度。

  3. 數據庫緩存: 數據庫系統通常有自己的緩存機制,如之前提到的 PostgreSQL 的 Shared Buffers。這些緩存用於存儲數據庫中經常被訪問的數據,以減少對存儲介質(如磁盤)的訪問,提高數據庫查詢的性能。

1.2. 緩存優勢和侷限性:

  • 優勢:

    • 提高數據讀取速度:通過存儲最近使用的數據副本,可以快速響應對相同數據的再次訪問。
    • 減少延遲:由於緩存通常位於 CPU 或內存之類的更快速介質中,因此訪問這些緩存的延遲更低。
    • 改善性能:優化內存和磁盤之間的數據傳輸,降低系統響應時間,提高整體性能。
  • 侷限性:

    • 有限容量:緩存的容量有限,因此可能無法容納所有的數據。
    • 數據一致性問題:緩存數據更新不及時可能導致一致性問題。
    • 成本:更大容量、更快速的緩存通常成本更高。

1.3. 管理和優化緩存:

  • 合理配置大小: 根據應用需求和硬件條件,合理配置緩存的大小以平衡性能和成本。
  • 監控和優化: 定期監控緩存使用情況,優化緩存命中率,避免緩存污染(淘汰頻繁使用的數據)等問題。
  • 使用合適的緩存策略: 包括先進先出(FIFO)、最近最少使用(LRU)、最不經常使用(LFU)等策略以及寫回、寫通過等寫入策略。

綜合來說,緩存在計算機系統中扮演着至關重要的角色,對於提高系統的整體性能至關重要。因此,合理利用和管理緩存是優化系統性能的關鍵一環。

1.4. OS Cache

  • Linux: 在 Linux 上,可以通過修改內核參數(如 vm.dirty_* 和 vm.swappiness)來影響磁盤緩存的行爲。這些參數控制着內核對於髒頁(未寫入磁盤的數據頁)的處理方式以及內存交換(swapping)行爲。但是,修改這些參數需要謹慎,最好了解其影響和風險。

  • Windows: Windows 操作系統也有一些控制文件系統緩存的參數,但通常情況下,Windows 會自動管理這些參數。

2. BGWriter在PostgreSQL中的作用是什麼?

`BGWriter`(Background Writer)是 PostgreSQL 中的一個重要後臺進程,負責管理緩衝區(Buffer Cache)並儘可能將髒頁(已被修改但尚未寫入磁盤)異步地寫入到磁盤,以確保數據的持久性和系統性能的最優化。

以下是 BGWriter 後臺進程的主要功能和作用:

  1. 髒頁管理BGWriter 負責管理共享緩衝區中的髒頁,這些髒頁包含了已經被修改但尚未寫入磁盤的數據。

  2. 異步寫入髒頁:它定期檢查緩衝區中的髒頁,並嘗試將這些髒頁異步地寫入到磁盤。這樣做有助於降低對磁盤的頻繁訪問,提高數據庫系統的性能。

  3. 減少後續寫入操作的影響:通過將髒頁定期寫入磁盤,BGWriter 可以減少後續寫入操作對系統性能的影響。這有助於確保寫入操作不會阻塞太多,並且減少了系統性能突然下降的風險。

  4. 優化磁盤寫入BGWriter 通過嘗試合併或共享磁盤寫入操作,以提高寫入磁盤的效率,減少對磁盤的訪問次數,進而優化系統性能。

需要注意的是,BGWriter 進程的行爲相對被動,其工作是在後臺週期性地進行。默認情況下,它會根據配置中的參數自動執行,通常不需要額外的手動調整。然而,在某些高負載或特定場景下,對 BGWriter 參數的微調可能有助於進一步優化數據庫的性能。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在這裏插入圖片描述

3. 修改參數的優點和缺點

在 PostgreSQL 中,修改 shared_buffers 參數後,重啓數據庫服務器並重新啓動之後,對於 UPDATE 操作的速度可能會有一定影響,但影響的具體程度取決於多種因素。

shared_buffers 參數控制着數據庫系統用於緩存數據的共享內存區域大小。增大 shared_buffers 的值通常會增加數據庫系統在內存中緩存數據的能力,從而提高查詢性能,尤其是能夠更快地訪問和操作緩存中的數據。

然而,增大 shared_buffers 參數值可能會導致數據庫系統在啓動時需要更多的內存,並且在運行過程中可能佔用更多的系統資源。因此,如果您在修改 shared_buffers 參數後重啓 PostgreSQL,可能會出現以下情況:

  1. 啓動時間增加:如果您將 shared_buffers 值增大到一個較大的數值,可能會導致 PostgreSQL 在啓動時需要更長的時間來分配和管理這部分較大的內存空間。

  2. 內存佔用增加:增大 shared_buffers 參數會佔用更多的內存。如果系統可用內存不足,可能會導致其他進程的內存競爭,甚至可能出現交換(swap)。

  3. 影響 UPDATE 操作速度:在某些情況下,增大 shared_buffers 可能會提高 UPDATE 操作的速度,尤其是對於頻繁讀取的數據,因爲緩存命中率可能會提高。但並不是所有的 UPDATE 操作都會直接受益於這種變化。

總體來說,修改 shared_buffers 後對 UPDATE 操作速度的影響因多種因素而異,包括系統的硬件資源、數據庫的使用模式、查詢訪問模式等。爲了評估對性能的影響,建議在生產環境之前在測試環境中進行測試和評估,以便更好地瞭解參數調整對系統的影響。

文章知識點與官方知識檔案匹配,可進一步學習相關知識
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章