適用於:SQL Server
SQL Server 2014 (12.x) 導入了緩衝集區延伸,將非揮發性隨機存取記憶體 (也就是固態硬碟) 延伸模組無縫整合到資料庫引擎緩衝集區中,以大幅提升 I/O 輸送量。 每個 SQL Server 版本都無法使用緩衝池擴充功能。 如需詳細資訊,請參閱 版本與 SQL Server 2022 支援的功能。
緩衝集區延伸的優點
SQL Server 資料庫的主要用途是為了儲存和抓取資料,因此大量磁碟 I/O 是 Database Engine 的核心特性。 因為磁碟 I/O 作業會消耗許多資源,而且需要相對較長的時間才能完成,所以 SQL Server 非常注重提高 I/O 的效率。 緩衝即區可做為 SQL Server 的主要記憶體配置來源。 緩衝區管理是達成這種效率的重要元件。 緩衝區管理元件由兩種機制所組成:可存取和更新資料庫頁面的緩衝區管理員,以及可減少資料庫檔案 I/O 的緩衝集區。
資料與索引頁面都會從磁碟讀入緩衝集區,而修改的頁面 (也稱為中途分頁) 則會重新寫入磁碟。 伺服器和資料庫檢查點的記憶體壓力會導致緩衝區快取中使用頻繁 (使用中) 的中途分頁從快取收回並寫入機械磁碟,然後再重新讀入快取中。 這些 I/O 作業通常是以 4 KB 到 16 KB 數據的順序進行小型隨機讀取和寫入。 小型隨機 I/O 模式會產生頻繁的搜尋、競爭機械磁碟臂、增加 I/O 延遲,並降低系統的彙總 I/O 輸送量。
解決這些 I/O 瓶頸的一般方法是加入更多 DRAM,或者加入高效能的 SAS 主軸。 雖然這些選項很有説明,但它們有顯著的缺點:DRAM 比數據儲存磁碟驅動器更昂貴,而且新增主軸會增加硬體取得的資本支出,並增加耗電量和增加元件故障機率來增加營運成本。
緩衝集區擴充功能可透過非動態儲存 (通常是 SSD) 延伸緩衝集區快取。 因為有了這個延伸模組,緩衝集區可以容納更大的資料庫工作集,強制將 RAM 與 SSD 之間的 I/O 分頁。 這樣可有效地將機械磁碟中的小型隨機 I/O 卸載到 SSD。 由於 SSD 的延遲較低而且隨機 I/O 效能更好,所以緩衝集區擴充會大幅提高 I/O 輸送量。
下列清單描述緩衝集區擴充功能的優點。
增加隨機 I/O 輸送量
減少 I/O 延遲
增加交易輸送量
透過更大的混合式緩衝集區來提升讀取效能
可以充分利用現有和將來的低成本記憶體磁碟的快取架構
概念
下列詞彙適用於緩衝集區擴充功能。
| 術語 | 描述 |
|---|---|
| 固態硬碟 (SSD) | 固態硬碟會以持續方式將資料儲存在記憶體 (RAM) 中。 如需詳細資訊,請參閱 維琪百科定義。 |
| 緩衝區 | 在 SQL Server 中,緩衝區是記憶體中的 8 KB 頁面,大小與數據或索引頁相同。 因此,緩衝區快取也分成 8 KB 的頁面。 頁面會保留在緩衝區快取中,直到緩衝區管理員需要緩衝區來讀取更多資料為止。 只有在修改數據時,才會將數據寫回磁碟。 這些記憶體中已修改的頁面稱為中途分頁。 當頁面等同於其在磁碟上的資料庫映像時,頁面就是乾淨的。 在重新寫入磁碟之前,可以多次修改緩衝區快取中的資料。 |
| 緩衝池 | 也稱為 緩衝區快取。 緩衝集區是所有資料庫的快取資料頁面所共用的全域資源。 緩衝池緩存的最大和最小大小是在啟動期間決定的,或者當 SQL Server 的實例被動態重新配置時,使用 sp_configure。 此大小會決定執行中的執行個體內隨時可在緩衝集區內快取的最大頁數。 緩衝池擴充功能所能認可的記憶體上限可以受限於計算機上執行的其他應用程式,以防這些應用程式產生顯著的記憶體壓力。 |
| 檢查點 | 檢查點會建立一個已知的恰當起點,資料庫引擎可以在發生非預期關機或損毀之後的復原期間,從這個點開始套用交易記錄中包含的變更。 檢查點會將中途分頁和交易記錄資訊從記憶體寫入磁碟,也會記錄有關交易記錄的資訊。 如需詳細資訊,請參閱 資料庫檢查點 (SQL Server)。 |
詳細資料
SSD 儲存體是當做記憶體子系統的延伸模組來使用,而非磁碟儲存體的子系統。 也就是說,緩衝集區擴充檔案允許緩衝集區管理員使用 DRAM 和 NAND 快閃記憶體,在 SSD 支援的非揮發性隨機存取記憶體中維護較大的 lukewarm 頁面緩衝集區。 這樣會建立多層級快取階層,其中的層級 1 (L1) 為 DRAM,而層級 (L2) 為 SSD 上的緩衝集區擴充檔案。 只有乾淨的頁面會寫入 L2 快取中,如此有助於維護資料安全。 緩衝區管理員會處理 L1 與 L2 快取之間非中途頁面的移動。
下圖提供緩衝集區相較於其他 SQL Server 元件的大略架構概觀。
啟用時,緩衝集區擴充會指定 SSD 上緩衝集區快取檔案的大小和檔案路徑。 這個檔案是 SSD 上連續的儲存範圍,而且會在啟動 SQL Server 執行個體的期間以靜態方式設定。 只有當緩衝集區擴充功能停用時,才能執行檔案組態參數的更改。 當停用緩衝集區擴充時,所有相關的組態設定都會從登錄中移除。 當 SQL Server 執行個體關機後,便會刪除緩衝集區擴充檔案。
容量限制
SQL Server Enterprise 版本允許緩衝池擴充大小上限為 max server memory (MB)值 32 倍。
SQL Server Standard 版本允許緩衝池擴充大小上限為 max server memory (MB)值的四倍。
最佳做法
我們建議您依照以下的最佳作法進行。
第一次啟用緩衝池擴充功能之後,您應該重新啟動SQL Server 實例,以取得最大的效能優勢。
設定緩衝池擴充功能,使物理記憶體大小(
max server memory (MB))與緩衝池擴充大小之間的比率為1:16或更少。 1:4 到 1:8 範圍內的較低比例可能是最佳。 如需設定max server memory (MB)選項的相關信息,請參閱 伺服器記憶體組態選項。在生產環境中實作之前,請徹底測試緩衝集區擴充。 進入生產環境之後,請避免對檔案進行組態變更或關閉此功能。 這些活動可能會對伺服器效能造成負面影響,因為停用功能時,緩衝池的大小會大幅減少。 停用時,在重新啟動 SQL Server 實例之前,不會回收用來支援此功能的記憶體。 不過,如果重新啟用此功能,則會重複使用記憶體,而不會重新啟動 實例。
傳回緩衝集區延伸的相關資訊
您可以使用下列動態管理檢視顯示緩衝集區擴充的組態,並傳回有關擴充中資料頁的資訊。
SQL Server 中的緩衝區管理員物件有提供效能計數器,以便追蹤緩衝集區擴充檔案中的資料頁面。 如需詳細資訊,請參閱< 緩衝集區擴充效能計數器>。
下列 XEvent 可供使用。
| XEvent | 描述 | 參數 |
|---|---|---|
sqlserver.buffer_pool_extension_pages_written |
會在從緩衝集區收回一個頁面或一組頁面,並將頁面寫入緩衝集區擴充檔時引發。 | number_pagefirst_page_idfirst_page_offsetinitiator_numa_node_id |
sqlserver.buffer_pool_extension_pages_read |
會在從緩衝集區擴充檔案將頁面讀到緩衝集區時引發。 | number_pagefirst_page_idfirst_page_offsetinitiator_numa_node_id |
sqlserver.buffer_pool_extension_pages_evicted |
會在從緩衝集區擴充檔收回頁面時引發。 | number_pagefirst_page_idfirst_page_offsetinitiator_numa_node_id |
sqlserver.buffer_pool_eviction_thresholds_recalculated |
會在計算收回臨界值時引發。 | warm_thresholdcold_thresholdpages_bypassed_evictioneviction_bypass_reasoneviction_bypass_reason_description |
相關工作
| 工作描述 | 文章 |
|---|---|
| 啟用及設定緩衝集區擴充 | 更改伺服器配置 |
| 修改緩衝集區擴充組態 | 更改伺服器配置 |
| 檢視緩衝集區擴充組態 | sys.dm_os_buffer_pool_extension_configuration |
| 監視緩衝集區擴充 |
sys.dm_os_buffer_descriptors SQL Server、Buffer Manager 物件 |