首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

淺談 SQL Server 記憶體管理 (二):SQLOS 三層分配架構、Memory Node/Clerk/Buffer Pool 深度解析

     編輯:關於SqlServer

SQLOS 記憶體分配三層依賴架構

SQLOS 記憶體依賴關係圖

自底向上:Memory Node → Memory Clerk / Buffer Pool → Memory Object。

Memory Node:OS 到 SQLOS 的橋樑

  • 每個 SQL 實例通常僅 1 個 Memory Node (NUMA 架構下對應多節點)。
  • DBCC MEMORYSTATUS 可查看分配統計:

Memory Node 資訊

按分配單位大小分類:

  1. SinglePage Allocator (≤ 8KB):用於快取 (Buffer Pool 頁面、Plan Cache 等)。
  2. MultiPage Allocator / MemToLeave (> 8KB):大塊連續記憶體,供 SQL CLR、Linked Server、備份緩衝、擴展預存程序等。

MemToLeave 預留計算 (32 位元啟動時):((CPU核心數 - 4) + 256) * 0.5MB + 256MB,通常約 384MB。

Memory Clerk:分配器與分類器

負責將分配出的記憶體按用途分類 (CACHESTORE_OBJCP, CACHESTORE_SQLCP, OBJECTSTORE_LOCK_MANAGER 等)。查詢分類統計:

SELECT type, SUM(pages_kb)/1024.0 AS Memory_MB
FROM sys.dm_os_memory_clerks
GROUP BY type
ORDER BY Memory_MB DESC;

Memory Clerk 分類統計

注意:Memory Clerk 僅管理非 Buffer Pool 記憶體,Buffer Pool 獨立管理。

Buffer Pool:核心快取引擎

虛擬記憶體 (VAS) 基礎

32 位元進程 VAS = 4GB (2GB User / 2GB Kernel)。Buffer Pool 向 VAS 保留位址空間,實際提交物理記憶體隨需求增長。

關鍵行為

  • sp_configure 'max server memory' 設定上限;min server memory 非啟動即佔用,而是超過後不再釋放。
  • DBCC MEMORYSTATUS 區塊顯示 Buffer Pool 詳細資訊:

Buffer Pool 資訊

  • 查詢實際物理記憶體用量:
SELECT (bpool_committed * 8192) / 1024.0 / 1024.0 AS BufferPool_MB
FROM sys.dm_os_sys_info;

Buffer Pool 物理記憶體

  • Buffer Pool 向 OS 申請記憶體直到 OS 發出低記憶體通知才可能釋放。
  • 頁面大小固定 8KB (8192 Bytes),與 SQLOS 頁面大小一致。其他元件借用 Buffer Pool 記憶體也以 8KB 為單位,物理上不連續。
  • Buffer Pool 不使用任何 Page Allocator,直接呼叫 VirtualAlloc/AWE 接口,自成體系。

SQL Server 總記憶體近似估算

Buffer Pool 佔用
+ 從 Buffer Pool 借用的頁面
+ MultiPage Allocator (MemToLeave) 非 Buffer Pool 部分

總記憶體估算公式

Buffer Pool 獨立管理示意

Memory Object:最底層堆結構

本質為堆,由 Page Allocator 分配。sys.dm_os_memory_objects 可查看,page_allocator_address 對應 Memory Clerk,表明隸屬關係。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved