共用方式為


監視記憶體使用量

適用於:SQL Server

定期監視 SQL Server 執行個體,以確認記憶體使用量是在正常範圍內。

設定 SQL Server 的記憶體上限

根據預設,SQL Server 執行個體可能會隨著時間耗用伺服器中大部分可用的 Windows 作業系統記憶體。 取得記憶體之後,除非偵測到記憶體壓力,否則不會加以釋放。 這是設計使然,並不表示 SQL Server 進程中發生記憶體流失。 使用 [最大伺服器記憶體] 選項,來限制允許 SQL Server 針對大部分用途取得的記憶體數量。 如需詳細資訊,請參閱記憶體管理架構指南

在 Linux 的 SQL Server 中,使用 mssql-conf 工具設置 memory.memorylimitmb 設定來調整記憶體限制

監視作業系統記憶體

若要監視記憶體不足的狀況,請使用下列 Windows 伺服器計數器。 許多作業系統記憶體計數器都可透過動態管理檢視 sys.dm_os_process_memorysys.dm_os_sys_memory 進行查詢。

  • 記憶體:可用位元組 此計數器指出進程目前可用的記憶體位元組數。 可用位元組計數器的低值可指出作業系統記憶體的整體不足。 您可以使用 sys.dm_os_sys_memory.available_physical_memory_kb,透過 T-SQL 查詢此值。

  • 記憶體:頁數/秒 此計數器指出由於硬式頁面錯誤而從磁碟擷取的頁面數目,或由於頁面錯誤而寫入磁碟以釋放工作集中的空間。 Pages/sec 計數器數值過高可能表示過度分頁。

  • 記憶體:分頁錯誤/秒:此計數器會指出所有處理序 (包括系統處理序) 的分頁錯誤率。 低但非零的磁碟分頁率 (連同分頁錯誤) 是正常的,即使配備許多可用記憶體的電腦也是如此。 當 Microsoft Windows 虛擬記憶體管理員 (VMM) 調整 SQL Server 和其他處理程序的工作集大小時,會從那些處理程序中回收分頁。 此 VMM 活動容易造成分頁錯誤。

  • 程序:每秒頁面錯誤 此計數器指出指定使用者程序的頁面錯誤速率。 監視進程:頁面錯誤/秒,以判斷磁碟活動是否由 SQL Server 的分頁操作所造成。 若要判斷 SQL Server 或其他處理序是否會導致過度分頁,請監視適用於 SQL Server 處理序執行個體的處理序:分頁錯誤/秒計數器。

如需解決過度分頁的詳細資訊,請參閱作業系統文件。

將 SQL Server 使用的記憶體進行隔離

若要監視 SQL Server 記憶體使用量,請使用下列 [使用 SQL Server 物件]。 許多 SQL Server 物件計數器都可以透過動態管理檢視 sys.dm_os_performance_counterssys.dm_os_process_memory 來查詢。

根據預設,SQL Server 會根據可用的系統資源,動態管理其記憶體需求。 如果 SQL Server 需要更多記憶體,其會查詢作業系統,以判斷是否有可用的實體記憶體,並使用可用的記憶體。 如果 OS 的可用記憶體不足,SQL Server 會將記憶體釋放回作業系統,直到記憶體不足狀況得到緩解,或直到 SQL Server 達到 伺服器記憶體上限為 止。 不過,您可以使用伺服器組態選項 min server memorymax server memory 來覆蓋此選項,以動態分配記憶體。 如需詳細資訊,請參閱 伺服器記憶體組態選項

若要監視 SQL Server 所使用的記憶體數量,請檢查下列效能計數器:

  • SQL Server:記憶體管理員:伺服器記憶體總計 (KB) 此計數器指出 SQL Server 記憶體管理員目前已認可至 SQL Server 的作業系統記憶體數量。 此數量預期會隨著實際活動的需要而增長,並且將在 SQL Server 啟動之後成長。 使用動態管理檢視 sys.dm_os_sys_info 查詢此計數器,並觀察 committed_kb 資料行。

  • SQL Server:記憶體管理員:目標伺服器記憶體 (KB) 此計數器表示根據最近的工作負載,SQL Server 可以耗用的理想記憶體量。 在一段時間的一般作業之後,與總伺服器記憶體進行比較,以判斷 SQL Server 是否配置所需的記憶體數量。 一般作業之後,總伺服器記憶體目標伺服器記憶體應該類似。 如果 [伺服器記憶體總計] 明顯低於 [目標伺服器記憶體],則 SQL Server 執行個體可能會遇到記憶體壓力。 在啟動 SQL Server 之後的一段期間,總伺服器記憶體預期會低於目標伺服器記憶體,因為總伺服器記憶體會成長。 使用 sys.dm_os_sys_info 動態管理檢視來查詢此計數器,並觀察 committed_target_kb 資料行。 如需有關記憶體設定的更多資訊與最佳實踐,請參閱伺服器記憶體組態選項

  • 流程:工作集 此計數器會根據作業系統,指出進程目前使用的實體記憶體數量。 觀察此計數器的 sqlservr.exe 執行個體。 使用 sys.dm_os_process_memory 動態管理檢視來查詢此計數器,並觀察 physical_memory_in_use_kb 資料行。

  • 進程:私有位元組 此計數器指出進程已要求作業系統自行使用的記憶體數量。 觀察此計數器的 sqlservr.exe 執行個體。 因為此計數器包含 sqlservr.exe 要求的所有記憶體配置,包括不受 [最大伺服器記憶體選項] 限制的記憶體配置,所以,此計數器可以報告大於 [最大伺服器記憶體選項] 的值。

  • SQL Server:緩衝區管理員:資料庫頁面 此計數器指出緩衝池中具有資料庫內容的頁數。 不包含 SQL Server 進程內的其他非緩衝集區記憶體。 使用動態管理檢視 sys.dm_os_performance_counters 來查詢此計數器。

  • SQL Server:緩衝區管理員:緩衝區快取命中率 此計數器是 SQL Server 特有的。 需要 90 或更高的比率。 值大於 90 表示超過 90% 的資料請求已經直接從記憶體中的資料快取獲得滿足,而不需要從磁碟讀取。 如需 SQL Server 緩衝區管理員的詳細資訊,請參閱 SQL Server,緩衝區管理員物件。 使用動態管理檢視 sys.dm_os_performance_counters 來查詢此計數器。

  • SQL Server:緩衝區管理員:頁面預期生命週期 此計數器會測量最舊頁面保留在緩衝池中的時間量 (以秒為單位)。 對於使用 NUMA 結構的系統,這是所有 NUMA 節點上的平均。 更高且不斷成長的值最好。 突然下降表示緩衝池中資料大幅變動,表示工作負載無法完全受益於記憶體中已有的資料。 每個 NUMA 節點都有自己的緩衝集區節點。 在具有多個 NUMA 節點的伺服器上,使用 SQL Server:緩衝節點:頁面的預期壽命,來檢視每個緩衝集區節點分頁的預期壽命。 使用動態管理檢視 sys.dm_os_performance_counters 來查詢此計數器。

範例

決定目前的記憶體配置

下列查詢會傳回目前配置記憶體的相關資訊。

SELECT
(total_physical_memory_kb/1024) AS Total_OS_Memory_MB,
(available_physical_memory_kb/1024)  AS Available_OS_Memory_MB
FROM sys.dm_os_sys_memory;

SELECT
(physical_memory_in_use_kb/1024) AS Memory_used_by_Sqlserver_MB,
(locked_page_allocations_kb/1024) AS Locked_pages_used_by_Sqlserver_MB,
(total_virtual_address_space_kb/1024) AS Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
FROM sys.dm_os_process_memory;

判斷目前的 SQL Server 記憶體使用率

下列查詢會傳回目前 SQL Server 記憶體使用率的相關資訊。

SELECT
sqlserver_start_time,
(committed_kb/1024) AS Total_Server_Memory_MB,
(committed_target_kb/1024)  AS Target_Server_Memory_MB
FROM sys.dm_os_sys_info;

判斷頁面的預期壽命

下列查詢會使用 sys.dm_os_performance_counters 來觀察 SQL Server 執行個體在整體緩衝區管理員層級,以及每個 NUMA 節點層級上目前的頁面預期壽命值。

SELECT
CASE instance_name WHEN '' THEN 'Overall' ELSE instance_name END AS NUMA_Node, cntr_value AS PLE_s
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Page life expectancy';