在 NUMA 之下放大和縮小緩衝集區

這個主題描述在使用非統一記憶體存取 (NUMA) 時如何指派緩衝集區中的記憶體頁數。 使用此資訊來了解 SQL Server 如何使用 NUMA 及了解如何解譯緩衝區節點物件的計數器。

記憶體的散發

每個實體 NUMA 節點有一個 SQL Server 記憶體節點。 記憶體節點彼此獨立成長,但會平均分割記憶體。 為了顯示 SQL Server 中的本機對外部記憶體散發,這個主題使用的範例假設電腦有 16 GB 的記憶體。 包括 Windows 的應用程式已取用每一個節點的一些記憶體,SQL Server 已指派一些記憶體給緩衝集區外的程序使用,且 SQL Server 有 10 GB 的記憶體可指派至緩衝集區。 緩衝集區記憶體在 4 個實體 NUMA 節點 (N0、N1、N2 和 N3) 之間分割,每一個節點有下列本機記憶體可用:

  • N0 – 1 GB

  • N1 – 3 GB

  • N2 – 3 GB

  • N3 – 3 GB

在上述組態中,所有節點最後會配置及使用 2.5 GB 的記憶體;不過,節點 N0 最後自己會有 1.0 GB 的記憶體,及其他節點的 1.5 GB 記憶體。

啟動時的記憶體指派

使用 NUMA 時,即使初始的免費記憶體不平均地分散在節點之間,SQL Server 也會以相當於非 NUMA 系統的比率,從作業系統接收記憶體。 緩衝集區嘗試盡量取得每一個節點的本機記憶體;不過,這樣做很難,因為 Windows 目前沒有 API 可從特定節點配置記憶體。

當記憶體指派至 SQL Server 時,您可能會注意到,有些節點得到來自其他 NUMA 節點的許多頁面 (稱為 foreign pages)。 不過,在暴增期間不使用這些頁,因為它們可經常傳輸到自有的節點上,而變成該節點本機上的頁。 達到 max server memory 的值時,有些節點可能有外部記憶體,但一旦達到記憶體目標,緩衝集區會將本機和外部記憶體一視同仁。 例如,在記憶體壓力之下,緩衝集區不會設法在本機記憶體頁之前釋出外部記憶體頁。

限制特定節點的記憶體

如果 SQL Server 已設定為在可用的 NUMA 節點子集上執行,緩衝集區將不會自動限制為那些節點上的記憶體。 在此情況下,請使用 max server memory 選項來限制緩衝集區。 如需有關 max server memory 的資訊,請參閱<伺服器記憶體選項>。

從節點釋出記憶體

使用 NUMA 時,max server memorymin server memory 值平均分散在 NUMA 節點之間。 例如,如果您在具有 4 個節點的系統上,將 max server memory 設為 16 GB,緩衝集區將在每一個節點上配置 4 GB 的記憶體。 如果您變更 affinity mask 設定,而使得其中一個節點離線,max server memory 設定將重新散發在剩餘節點之間。 例如,在先前的四個節點範例中,如果您使兩個節點離線,所釋出的 8 GB 記憶體將平均分散在剩餘節點之間。 由於緩衝集區能夠使用外部頁,如果剩餘節點沒有足夠的記憶體,將會利用遠端記憶體。 如果您希望 SQL Server 不要使用它不再執行之節點中的記憶體,您必須在使節點離線之後減少 max server memory 設定。

Foreign Pages

節點多半獨立運作。 所有記憶體配置和節點的記憶體取消配置是使用與節點相關聯的記憶體來完成。 然而,如果在節點 N1 執行的工作者需要存取已經在節點 N2 記憶體中的資料庫頁,它就會存取非本機記憶體。

觀察緩衝集區內的本機與外部記憶體

您可以檢視緩衝區節點物件來觀察緩衝集區。 SQL Server 緩衝集區中的總記憶體是顯示為緩衝區管理員物件的目標頁數計數器。 每一個節點之緩衝集區中的記憶體是顯示為緩衝區節點物件的目標頁數計數器。 其他節點的記憶體是顯示為 [Foreign pages] 計數器。 如需詳細資訊,請參閱<SQL Server 的 Buffer Node 物件>和<SQL Server 的 Buffer Manager 物件>。

每一個節點在其自己的記憶體中使用檢查點

每一個記憶體節點有它自己的延遲寫入器執行緒。 隱含和明確檢查點都會呼叫此執行緒。 由於對稱式多重處理 (SMP) 電腦只有一個檢查點執行緒,因此使用 NUMA 時,多重執行緒會造成檢查點速度增加。

資料表掃描行為

除非在多個節點的 CPU 上平行執行掃描,否則在節點 N1 執行的資料表掃描只會填入與節點 N1 相關聯的記憶體。 如果掃描僅在單一節點上執行,則只使用來自該節點的緩衝區頁面。 這有助於分割 [應用程式] 的工作負載。