SQL Server 2000 將使用者模式虛擬位址空間(VAS)劃分為三大區域:緩衝集區、MemToLeave(保留記憶體區)、AWE 擴展區(>3GB 實體記憶體)。理解這三區運作,是調校高效能資料庫的關鍵。
三大記憶體區域
1. Buffer Pool (Bpool,緩衝集區)
- 啟動時依實體記憶體或使用者 VAS 大小計算上限。
- 以 8 KB 頁為單位保留虛擬位址空間,隨需求逐步認交。
- 主要供資料頁、索引頁(≤8 KB)及小型記憶體配置使用。
- 效能計數器:
SQL Server:Buffer Manager\Target Pages(上限)、Total Pages(已認交)。
2. MemToLeave (MTL,保留記憶體區)
- 位於 Bpool 保留區之後,包含未被 Bpool 使用的 VAS。
- 用於 ≥8 KB 的大型配置:執行緒堆疊、擴展預存程序、COM 物件、OLE DB Provider、備份/還原緩衝區等。
- 若 MTL 耗盡(最大可用區塊 < 0.5 MB),將無法建立新工作執行緒,導致連線逾時。
- 監控:
Process:Private Bytes 增長而 Total Pages 平穩,通常表示 MTL 配置增加。
3. AWE 擴展區(啟用 AWE 時)
- 利用 Windows AWE API 鎖定 >3GB 實體記憶體,作為 Bpool 的擴展,專供資料/索引頁緩存。
- Bpool 在 32-bit 指標可定址範圍內映射 AWE 實體頁。
- 啟用 AWE 後,
Private Bytes 不再反映真實總記憶體使用量。
記憶體配置器與消費者
- 內部消費者(查詢執行、鎖管理等)透過記憶體物件向 Buffer Pool 或 MTL 申請。
- 請求 < 8 KB → 通常從 Bpool;≥ 8 KB → 通常從 MTL。
- 外部消費者(XP、COM、OLE DB)呼叫 Win32 API,從 MTL 配置;XP 呼叫
srv_alloc 則遵循同樣規則。
記憶體管理員:動態平衡
- 持續監控可用實體記憶體,維持 4~10 MB(Win2003 偏 10 MB)緩衝。
- 低於門檻時,釋放 Bpool 已認交頁(縮減工作集)。
- 維護每 CPU 獨立的空閒頁清單,優先滿足本地 CPU 請求,提升 NUMA 效能。
- 可用
SQL Server:Buffer Manager\Free Pages 監控總空閒頁。
AWE 模式下的特殊行為
- 啟動時鎖定實體記憶體:若設定 max server memory,嘗試鎖定該數量;否則鎖定除保留 128 MB 外的所有實體記憶體。
- Bpool 直接使用 >3GB 實體頁,透過映射供 32-bit 指標存取。
實戰啟示:開發者如何受影響
- 調大網路封包(如 8 KB)會從 MTL 配置,導致 MTL 耗盡並寫入錯誤日誌;預設 4 KB 較安全。
- 擴展預存程序配置 < 8 KB 會佔用 Bpool,擠壓資料緩存。
- 理解 AWE 與 /3GB 開關優劣,可正確規劃 >3GB 實體記憶體的伺服器啟動參數。
掌握記憶體管理機制,能讓你寫出高效應用、精準診斷記憶體相關瓶頸,並為 SQL Server 做出最佳容量規劃。