天天看點

SQL Server調用以下幾個DBCC管理指令來清理緩存,釋放記憶體空間

作者:三生石上三生緣

調用以下幾個DBCC管理指令來清理這些緩存:

DBCC FREEPROCCACHE 清除存儲過程相關的緩存

DBCC FREESESSIONCACHE 會話緩存

DBCC FREESYSTEMCACHE('All') 系統緩存

DBCC DROPCLEANBUFFERS 所有緩存

但是,這幾個指令雖然會清除掉現有緩存,為新的緩存騰地方,但是SQL Server并不會是以釋放掉已經占用的記憶體。Sql Server并沒有提供任何指令允許我們釋放不用到的記憶體。是以我們隻能通過動态調整SQL Server可用的實體記憶體設定來強迫它釋放記憶體。

調用以下幾個DBCC管理指令來清理這些緩存:

DBCC FREEPROCCACHE 清除存儲過程相關的緩存

DBCC FREESESSIONCACHE 會話緩存

DBCC FREESYSTEMCACHE('All') 系統緩存

DBCC DROPCLEANBUFFERS 所有緩存

但是,這幾個指令雖然會清除掉現有緩存,為新的緩存騰地方,但是SQL Server并不會是以釋放掉已經占用的記憶體。Sql Server并沒有提供任何指令允許我們釋放不用到的記憶體。是以我們隻能通過動态調整SQL Server可用的實體記憶體設定來強迫它釋放記憶體。

解決SQL Server占用記憶體過高的具體步驟:

1、清除所有緩存

DBCC DROPCLEANBUFFERS

SQL Server調用以下幾個DBCC管理指令來清理緩存,釋放記憶體空間

2、調整可使用實體記憶體

SQL Server調用以下幾個DBCC管理指令來清理緩存,釋放記憶體空間
SQL Server調用以下幾個DBCC管理指令來清理緩存,釋放記憶體空間

将最大伺服器記憶體改成4G,确定後記憶體就會被強制釋放,然後把最大伺服器記憶體改成合适的值。

重要

将“max server memory”值設定得太高可能導緻一個 SQL Server 執行個體與同一主機上承載的其他 SQL Server 執行個體争用記憶體。 但是,将此值設定得太低可能會導緻極大的記憶體壓力和性能問題。 将“max server memory”設定為最小值甚至可能導緻無法啟動 SQL Server。 如果在更改此選項之後無法啟動 SQL Server,請使用“-f”啟動選項啟動它,并将“max server memory”重置為以前的值 。 有關詳細資訊,請參閱 Database Engine Service Startup Options。

SQL Server 可動态使用記憶體;但也可以手動設定記憶體選項并限制 SQL Server 可以通路的記憶體量。 在設定 SQL Server 的記憶體量之前,請通過從總實體記憶體中減去作業系統所需的記憶體(即不受 max_server_memory 設定控制的記憶體配置設定)以及任何其他 SQL Server 執行個體所需的記憶體(如果計算機并非完全由 SQL Server 專用,則還要減去其他系統使用的記憶體量)。 這個內插補點就是可以配置設定給目前 SQL Server 執行個體使用的最大記憶體量。

手動設定選項

可以将 min server memory 和 max server memory 設定成一個記憶體範圍 。 在需要兼顧同一台主機上運作的其他應用程式或其他 SQL Server 執行個體的記憶體要求時,此方法對于配置 SQL Server 執行個體的系統或資料庫管理者來說非常有用。

備注

min server memory 和 max server memory 選項都是進階選項。 如果使用 sp_configure 系統存儲過程來更改這些設定,則隻有在“顯示進階選項”設定為 1 時才能更改它們。 這些設定更改後會立即生效,不需要重新啟動伺服器。

使用 min_server_memory 可以保證可供 SQL Server 執行個體的 SQL Server 記憶體管理器使用的最小記憶體量。 SQL Server 不會在啟動時立即配置設定 min server memory 中指定的記憶體量。 不過,除非降低 SQL Server min server memory 的值,否則當記憶體使用量由于用戶端負荷而達到該值後, 不能釋放記憶體。 例如,同一個主機中可同時存在多個 SQL Server 執行個體時,為了給執行個體保留記憶體,請設定 min_server_memory 參數而不是 max_server_memory。 此外,為了確定來自基礎主機的記憶體壓力不會嘗試從來賓 SQL Server 虛拟機 (VM) 上的緩沖池釋放超過可接受性能所需的記憶體,在虛拟環境中設定 min_server_memory 值非常必要。

備注

SQL Server 并不一定配置設定“最小伺服器記憶體”中指定的記憶體量。 如果伺服器上的負荷從不需要配置設定 min server memory 指定的記憶體量,則 SQL Server 将以較少的記憶體運作。

使用 max_server_memory 來保證 OS 不會遇到不利的記憶體壓力。 若要設定 max server memory 配置,請監視 SQL Server 程序的總體消耗,以确定記憶體要求。 使單個執行個體的這些計算更準确:

從 OS 總記憶體中,為 OS 自身保留 1GB - 4GB。

然後,減去等于在“最大伺服器記憶體”控制範圍外的潛在 SQL Server 記憶體配置設定的值,即堆棧大小1 * 計算出的最大工作線程數 2 。 所得結果就是一個執行個體設定的 max_server_memory 設定。

1 有關每個體系結構的線程堆棧大小的資訊,請參閱記憶體管理體系結構指南。

2 有關為目前主機中給定數量的關聯 CPU 計算得出的預設工作線程數的資訊,請參閱介紹如何配置最大工作線程數伺服器配置選項的文檔頁。

使用 SQL Server Management Studio

使用“min server memory”和“max server memory”這兩個伺服器記憶體選項重新配置由 SQL Server 記憶體管理器為 SQL Server 執行個體管理的記憶體量 (MB)。 預設情況下, SQL Server 的記憶體要求會根據可用系統資源的情況動态變化。

配置固定記憶體量的過程(不推薦)

設定固定記憶體量:

在對象資料總管中,右鍵單擊伺服器并選擇 “屬性” 。

單擊 “記憶體” 節點。

在 “伺服器記憶體選項” 中,為 “最小伺服器記憶體” 和 “最大伺服器記憶體” 輸入所需的記憶體量。

使用預設設定,将允許 SQL Server 根據可用系統資源動态更改其記憶體需求。 建議按上述内容設定 max server memory。

下面的螢幕截圖示範了所有這三個步驟:

SQL Server調用以下幾個DBCC管理指令來清理緩存,釋放記憶體空間

鎖定記憶體頁 (LPIM)

此 Windows 政策将确定哪些帳戶可以使用程序将資料保留在實體記憶體中,進而阻止系統将資料分頁到磁盤的虛拟記憶體中。 鎖定記憶體中的頁可以在發生将記憶體分頁到磁盤時保持伺服器的響應能力。 已向有權運作 sqlservr.exe 的帳戶授予 Windows 鎖定記憶體頁 (LPIM) 使用者權限時,在 SQL Server Standard Edition 和更高版本的執行個體中将“鎖定記憶體頁”選項設定為“打開”。

若要對 SQL Server禁用“鎖定記憶體頁”選項,請為有權運作 sqlservr.exe(SQL Server 啟動帳戶)啟動帳戶的帳戶删除“鎖定記憶體頁”使用者權限。

設定此選項可實作根據其他記憶體配置設定器的請求擴大或縮小記憶體,不影響 SQL Server 動态記憶體管理。 使用“鎖定記憶體頁”使用者權限時,建議按如上所述,為 max server memory 設定一個上限。

重要

應僅在必要時設定此選項,即有迹象表明正在換出 sqlservr 程序時。在這種情況下,錯誤日志将報告錯誤 17890,類似于以下示例:A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: #### seconds. Working set (KB): ####, committed (KB): ####, memory utilization: ##%.

從 SQL Server 2012 (11.x) 開始,Standard Edition 不需要跟蹤标志 845來使用“鎖定頁”。

啟用“鎖定記憶體頁”

啟用“鎖定記憶體頁”選項:

在 “開始” 菜單上,單擊 “運作” 。 在“打開” 框中,鍵入 gpedit.msc

将打開 “組政策” 對話框。

在 “組政策” 控制台上,展開 “計算機配置” ,再展開 “Windows 設定” 。

展開 “安全設定” ,再展開 “本地政策” 。

選擇 “使用者權利指派” 檔案夾。

細節窗格中随即顯示出政策。

在該窗格中,輕按兩下“鎖定記憶體頁”。

在“本地安全政策設定”對話框中,添加有權運作 sqlservr.exe (SQL Server 啟動帳戶)的帳戶。

SQL Server 的多個執行個體

當運作多個 資料庫引擎執行個體時,可以使用三種方法來管理記憶體:

使用“max server memory”控制記憶體使用量,如上所述。 為每個執行個體建立最大設定,注意總的允許設定值不能大于計算機上的實體總記憶體。 可能需要為每個執行個體提供與預期的工作負荷或資料庫大小成正比的記憶體。 這種方法的優勢展現在:當啟動新的程序或執行個體時,可以立即為這些程序或執行個體提供可用記憶體。 這種方法的缺點為:如果沒有運作所有執行個體,則所有運作中的執行個體都無法使用剩餘的可用記憶體。

使用“min server memory”控制記憶體使用量,如上所述。 為每個執行個體建立最小設定,以使這些最小值的和比計算機上總的實體記憶體小 1-2 GB。 此外,可能需要建立與該執行個體的預期負荷成正比的最小值。 這種方法的優勢展現在:如果沒有同時運作所有執行個體,則運作中的執行個體可以使用剩餘的可用記憶體。 當計算機上存在其他占用大量記憶體的程序時,這種方法也十分有用,因為它可確定 SQL Server 至少獲得合理的記憶體量。 這種方法的缺點是:當啟動新的執行個體(或任何其他程序)時,運作的執行個體可能會花費一些時間來釋放記憶體,如果執行個體必須将修改後的頁寫回到資料庫中來釋放記憶體,則花費的時間可能會更長。

不執行任何操作(不推薦)。 帶有工作負荷的第一個執行個體通常配置設定所有的記憶體。 空閑執行個體或稍後啟動的執行個體最終可能會隻使用最少的可用記憶體量運作。 SQL Server 不會嘗試均衡配置設定各個執行個體的記憶體使用量。 但是,所有執行個體均将響應 Windows 記憶體通知信号以調整它們記憶體需求量的大小。 Windows 不會使用記憶體通知 API 來平衡各個應用程式使用的記憶體。 它隻提供有關系統記憶體可用性的全局回報。

您可以在不重新啟動執行個體的情況下更改這些設定,以便可以輕松地進行嘗試以找到适合使用模式的最佳設定。

提供最大記憶體量

在 SQL Server 的所有版本中,記憶體最大可配置為程序虛拟位址空間限制。 有關詳細資訊,請參閱 Windows 和 Windows Server 版本的記憶體限制。

示例

示例 A. 将最大伺服器記憶體選項設定為 4 GB。

以下示例将 max server memory 選項設定為 4 GB。 請注意,雖然 sp_configure 将選項的名稱指定為 max server memory (MB),但該示例的示範省略了 (MB)。

sp_configure 'show advanced options', 1;

GO

RECONFIGURE;

GO

sp_configure 'max server memory', 4096;

GO

RECONFIGURE;

GO

此操作輸出的語句類似于:

配置選項“最大伺服器記憶體 (MB)”從 2147483647 更改為 4096。 請運作 RECONFIGURE 語句進行安裝。

示例 B. 确定目前記憶體配置設定

以下查詢傳回有關目前配置設定記憶體的資訊。

SELECT

physical_memory_in_use_kb/1024 AS sql_physical_memory_in_use_MB,

large_page_allocations_kb/1024 AS sql_large_page_allocations_MB,

locked_page_allocations_kb/1024 AS sql_locked_page_allocations_MB,

virtual_address_space_reserved_kb/1024 AS sql_VAS_reserved_MB,

virtual_address_space_committed_kb/1024 AS sql_VAS_committed_MB,

virtual_address_space_available_kb/1024 AS sql_VAS_available_MB,

page_fault_count AS sql_page_fault_count,

memory_utilization_percentage AS sql_memory_utilization_percentage,

process_physical_memory_low AS sql_process_physical_memory_low,

process_virtual_memory_low AS sql_process_virtual_memory_low

FROM sys.dm_os_process_memory;

示例 C. 确定“最大伺服器記憶體 (MB)”的值

以下查詢傳回有關目前配置的值和 SQL Server 使用的值的資訊。 無論“顯示進階選項”是否為 true,此查詢都将傳回結果。

SELECT c.value, c.value_in_use

FROM sys.configurations c WHERE c.[name] = 'max server memory (MB)'

後續步驟

繼續閱讀