程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 淺談SQL Server對於內存的管理(2)

淺談SQL Server對於內存的管理(2)

編輯:關於SqlServer

SQL Server OS的三層內存分配

SQL Server OS對於內存的分配分為三個層級,依賴關系如圖4所示。

2
圖4.SQL Server OS內存依賴關系

Memory Node

首先最底層的是Memory Node,Memory Node的作用是使得分配內存由Windows移交到SQL Server OS層面執行。每個SQL Server實例通常都只擁有一個Memory Node,Memory Node的多寡只取決於NUMA構架的硬件配置。我們通過 DBCC MEMORYSTATUS 可以看到Memory Node的一些信息,如圖5所示。

5
圖5.查看Memory Node信息

我們可以看出 ,按照申請內存大小分類,可以分為兩部分

1.申請小於等於8KB為一個單位的內存,這些內存被用於緩存。(圖5中的SinglePage Allocator)

2.申請大於8KB為一個單位的內存,這些內存稱為Multi-Page(或MemToLeave)(圖5中的MultiPage Allocator)

對於為什麼叫MemToLeave,被稱為MemToLeave的原因是由於SQL Server雖然大部分內存被用於緩沖區,但還需要一些連續的內存用於SQL CLR,linked server,backup buffer等操作,32位SQL Server在啟動實例時會保留一部分連續的虛擬地址(VAS)用於進行MultiPage Allocator。具體保留多少可以用如下公式計算:

保留地址=((CPU核數量-4)+256)*0.5MB+256MB,通常在384MB左右。

Memory Clerk

讓我們再來看Memory Clerk,Memory Clerk用於分配內存,用於將Allocate出去的內存進行分類,可以簡單的進行如下語句,如圖6所示.

6
圖6.按照Memory Clerk的類別進行分類

注意:由圖4可以看到,Memory Clerk只是分配內存的一部分,另一部分是數據緩存(Buffer Pool)

Buffer Pool

在開始講述Buffer Pool之前,首先想講一下虛擬內存。

在Windows中每個進程都有一個虛擬內存(Virtual Address Space VAS),32位系統是2的32次方,也就是4G,這4G被Windows劃為兩部分,一部分是Windows使用,另一部分才是應用程序使用。虛擬內存並不是實際的物理內存,而是對於物理內存的映射,當物理內存不存在虛擬內存指向的內容時,產生缺頁中斷,將一部分頁面置換出內存,然後將需要的部分從硬盤讀到內存,關於這塊,可以讀我之前寫的一篇文章:淺談操作系統對內存的管理

因此Buffer Pool的作用時緩沖數據頁,使得未來讀取數據時減少對磁盤的訪問。

這個Buffer Pool這部分就是圖2中設置最大最小服務器內存所占用的空間。這個最小值並不意味著SQL Server啟動時就能占用這麼多內存,而是SQL Server Buffer Pool的使用一旦超過這個值,就不會再進行釋放了。

在DBCC MEMORYSTATUS 其中有一部分我們可以看到Buffer Pool的信息,如圖7所示。

7
圖7.Buffer Pool的相關信息

在SQL Server實例啟動時,Buffer Pool所保留的VAS地址空間取決於多個因素:包括實際的物理內存和SQL Server是32位或是64位(這個限制32位是4G,還要劃一半給Windows和減去MemToLeave空間),而對於實際上SQL Server所使用的物理內存,可以通過如下語句查看,如圖8所示。

8
圖8.查看Buffer Pool所使用物理內存

Buffer Pool會按照需要不斷的提出內存申請。Buffer Pool如果需要,Buffer Pool會不斷消耗內存,直到Windows通知SQL Server內存過低時,Buffer Pool才有可能釋放內存,否則Buffer Pool占據了內存不會釋放。

另外值得注意的一點是,Buffer Pool所分配的頁面和SQL Server OS頁面大小是一致的,也就是8192字節,當SQL Server其它部分需要向”Buffer Pool”借內存時,也只能按照8k為單位借,並且這部分內存在物理內存中是不連續的,這聽上去像是Buffer Pool內存管理自成體系微笑,可以這麼理解,因為Buffer Pool 不使用任何SQL Server的page allocator,而直接使用virtual或AWE SQLOS's的接口。

所以SQL Server所占用的內存可以用這個公式粗略估算出來: buffer pool占用的內存+從buffer pool借的頁占得內存+multiPageAllocator分配的非buffer pool內存,如圖9所示。

9
圖9.可以近似的估算出SQL Server所占的內存

Memory Object

menory object本質上是一個堆,由Page Allocator進行分配,可以通過sys.dm_os_memory_objects這個DMV進行查看,這個DMV可以看到有一列 Page_Allocator_Address列,這列就是Memory Clerk的標識,表明這個Memory Object是由哪個Memory Clerk進行分配的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved