SQL Server 數(shù)據(jù)庫引擎的內(nèi)存利用率由一對配置設(shè)置進(jìn)行限制:“最小服務(wù)器內(nèi)存(MB)”和“最大服務(wù)器內(nèi)存(MB)”。 隨著時間的推移,在正常情況下,SQL Server 將嘗試申請內(nèi)存,使其達(dá)到“最大服務(wù)器內(nèi)存(MB)”設(shè)置的限制。
在較舊版本的 SQL Server 中,內(nèi)存利用率幾乎未設(shè)上限,這向 SQL Server 指示所有系統(tǒng)內(nèi)存均可供使用。 建議在所有版本的 SQL Server 中配置最大服務(wù)器內(nèi)存 (MB)來配置 SQL Server 內(nèi)存利用率上限。
由于 SQL Server 2019 (15.x),Windows 服務(wù)器中的 SQL 安裝程序根據(jù)安裝時可用系統(tǒng)內(nèi)存的百分比,為獨(dú)立 SQL Server 實例提供“最大服務(wù)器內(nèi)存(MB)”的建議。
隨時可通過“最小服務(wù)器內(nèi)存(MB)”和“最大服務(wù)器內(nèi)存(MB)”配置選項,為 SQL Server 實例使用的 SQL Server 進(jìn)程重新配置內(nèi)存邊界 (MB)。
最大服務(wù)器內(nèi)存選項僅限制 SQL Server 緩沖池的大小。 最大服務(wù)器內(nèi)存選項不限制 SQL Server 為分配其他組件(例如,擴(kuò)展存儲過程、COM 對象、非共享 DLL 和 EXE)而保留的剩余未預(yù)留內(nèi)存區(qū)域。
SQL Server 可動態(tài)使用內(nèi)存。 但是,也可手動設(shè)置內(nèi)存選項并限制 SQL Server 可訪問的內(nèi)存量。 在設(shè)置 SQL Server 的內(nèi)存量之前,請確定適當(dāng)?shù)膬?nèi)存設(shè)置,方法是從總物理內(nèi)存中減去操作系統(tǒng) (OS) 所需的內(nèi)存(即不受“最大服務(wù)器內(nèi)存(MB)”設(shè)置控制的內(nèi)存分配)和任何其他 SQL Server 實例所需的內(nèi)存(如果服務(wù)器上有其他使用內(nèi)存的應(yīng)用程序,包括其他 SQL Server 實例,則還要減去其他系統(tǒng)使用的內(nèi)存量)。 這個差值就是可以分配給當(dāng)前 SQL Server 實例使用的最大內(nèi)存量。
使用“最小服務(wù)器內(nèi)存(MB)”可保證可供 SQL Server 內(nèi)存管理器使用的最小內(nèi)存量。
SQL Server 不會在啟動時立即分配在“最小服務(wù)器內(nèi)存(MB)”中指定的內(nèi)存量。 不過,除非調(diào)低“最小服務(wù)器內(nèi)存(MB)”的值,否則當(dāng)內(nèi)存使用量由于客戶端負(fù)載而達(dá)到該值后,SQL Server 不能釋放內(nèi)存。 例如,在同一臺服務(wù)器上同時安裝多個 SQL Server 實例時,請考慮設(shè)置“最小服務(wù)器內(nèi)存(MB)”參數(shù),使其為實例預(yù)留內(nèi)存。
為了確保來自基礎(chǔ)主機(jī)的內(nèi)存壓力不會嘗試從來賓虛擬機(jī) (VM) 上的緩沖池釋放超過可接受性能所需的內(nèi)存,在虛擬環(huán)境中設(shè)置“最小服務(wù)器內(nèi)存(MB)”值非常有必要。 理想情況下,虛擬機(jī)中的 SQL Server 實例不必與虛擬主機(jī)主動內(nèi)存解除分配進(jìn)程競爭。
SQL Server 并不一定分配“最小服務(wù)器內(nèi)存(MB)”中指定的內(nèi)存量。 如果服務(wù)器上的負(fù)載從不需要分配“最小服務(wù)器內(nèi)存(MB)”中指定的內(nèi)存量,則 SQL Server 將使用更少的內(nèi)存。
最大服務(wù)器內(nèi)存
使用“最大服務(wù)器內(nèi)存(MB)”保證 OS 和其他應(yīng)用程序不會遇到來自 SQL Server 的不利內(nèi)存壓力。
在設(shè)置“最大服務(wù)器內(nèi)存(MB)”配置之前,在正常操作期間監(jiān)視托管 SQL Server 實例的服務(wù)器的總體內(nèi)存消耗,以確定內(nèi)存可用性和要求。 對于初始配置,或者當(dāng)沒有機(jī)會收集一段時間內(nèi)的 SQL Server 進(jìn)程內(nèi)存使用情況時,請使用以下通用最佳做法方法,為單個實例配置最大服務(wù)器內(nèi)存 (MB):
從總 OS 內(nèi)存中減去“最大服務(wù)器內(nèi)存(MB)”控制之外的潛在 SQL Server 線程內(nèi)存分配量的同等值,這個量是堆棧大小1乘以計算出的最大工作線程數(shù)2。
2 有關(guān)當(dāng)前主機(jī)中給定數(shù)量的綁定 CPU 的默認(rèn)工作線程計算詳細(xì)信息,請參閱 服務(wù)器配置:最大工作線程。
手動設(shè)置選項
可將“最小服務(wù)器內(nèi)存(MB)”和“最大服務(wù)器內(nèi)存(MB)”設(shè)置為跨一系列內(nèi)存值。 在需要兼顧同一臺主機(jī)上運(yùn)行的其他應(yīng)用程序或其他 SQL Server 實例的內(nèi)存要求時,此方法對于配置 SQL Server 實例的系統(tǒng)或數(shù)據(jù)庫管理員來說非常有用。
基于 Windows 的應(yīng)用程序可使用 Windows 地址窗口擴(kuò)展 (AWE) API 來分配物理內(nèi)存并將其映射到進(jìn)程地址空間。 LPIM Windows 策略將確定哪些帳戶可以訪問 API 以將數(shù)據(jù)保留在物理內(nèi)存中,從而阻止系統(tǒng)將數(shù)據(jù)分頁到磁盤的虛擬內(nèi)存中。 使用 AWE 分配的內(nèi)存被鎖定,直到應(yīng)用程序顯式釋放該內(nèi)存或退出。 在 64 位 SQL Server 中使用 AWE API 進(jìn)行內(nèi)存管理也經(jīng)常稱為鎖定頁。 鎖定內(nèi)存中的頁可以在發(fā)生將內(nèi)存分頁到磁盤時保持服務(wù)器的響應(yīng)能力。 已向有權(quán)運(yùn)行 的帳戶授予 Windows 鎖定內(nèi)存頁 (LPIM) 用戶權(quán)限時,SQL Server Standard Edition 及更高版本的實例中已啟用“鎖定內(nèi)存頁”選項。
若要對 SQL Server 禁用“鎖定內(nèi)存頁”選項,請為有權(quán)運(yùn)行 (SQL Server 啟動帳戶)啟動帳戶的帳戶刪除“鎖定內(nèi)存頁”用戶權(quán)限。
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: ##%.
SELECT osn.node_id,
osn.memory_node_id,
osn.node_state_desc,
omn.locked_page_allocations_kb
FROM sys.dm_os_memory_nodes AS omn
INNERJOIN sys.dm_os_nodes AS osn
ON (omn.memory_node_id = osn.memory_node_id)
WHERE osn.node_state_desc <> 'ONLINE DAC';
當(dāng)前 SQL Server 錯誤日志在服務(wù)器啟動期間 Using locked pages in the memory manager 報告消息。
不執(zhí)行任何操作(不推薦)。 帶有工作負(fù)載的第一個實例通常分配所有的內(nèi)存。 空閑實例或稍后啟動的實例最終可能會只使用最少的可用內(nèi)存量運(yùn)行。 SQL Server 不會嘗試均衡分配各個實例的內(nèi)存使用量。 但是,所有實例均將響應(yīng) Windows 內(nèi)存通知信號以調(diào)整它們內(nèi)存需求量的大小。 Windows 不會使用內(nèi)存通知 API 來平衡各個應(yīng)用程序使用的內(nèi)存。 它只提供有關(guān)系統(tǒng)內(nèi)存可用性的全局反饋。
以下示例將“最大服務(wù)器內(nèi)存(MB)”選項設(shè)置為 4096 MB (4 GB)。 雖然 sp_configure 將選項的名稱指定為 max server memory (MB),但你也可省略 (MB)。
SQL
EXECUTE sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXECUTE sp_configure 'max server memory', 4096;
GO
RECONFIGURE;
GO
這將輸出類似于 Configuration option 'max server memory (MB)' changed from 2147483647 to 4096. Run the RECONFIGURE statement to install. 的語句。新的內(nèi)存限制在執(zhí)行 RECONFIGURE 時立即生效。 有關(guān)詳細(xì)信息,請參閱 sp_configure。
B. 確定當(dāng)前內(nèi)存分配
以下查詢返回有關(guān)當(dāng)前分配內(nèi)存的信息。
SQL
SELECT physical_memory_in_use_kb / 1024AS sql_physical_memory_in_use_MB,
large_page_allocations_kb / 1024AS sql_large_page_allocations_MB,
locked_page_allocations_kb / 1024AS sql_locked_page_allocations_MB,
virtual_address_space_reserved_kb / 1024AS sql_VAS_reserved_MB,
virtual_address_space_committed_kb / 1024AS sql_VAS_committed_MB,
virtual_address_space_available_kb / 1024AS 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;