一、問題:
1、SQL Server 所占用內存數量從啟動以后就不斷地增加:
首先,作為成熟的產品,內存溢出的機會微乎其微。對此要了解SQL SERVER與windows是如何協調、共享內存。並且SQL SERVER的內部對內存的管理機制。
2、在Windows 2003以上版本運行的SQL Server,內存使用量突然急劇下降:
內存是Sqlserver的生命線。在errorlog中,出現一下情況: 
這類問題往往不是sql server導致的,而是Windows感覺到急迫的內存壓力,迫使sql server 釋放內存。
3、用戶在做操作時,遇到內存申請失敗:不是用戶想申請多少就有多少
4、內存壓力導致的性能下降:內存壓力是性能問題最常見的原因之一。
二、操作系統層面看SQL SERVER 內存分配:
操作系統不缺內存不代表sql server不缺內存
專用術語:
Virtual Address Space(虛擬地址空間):一個應用程序能訪問的最大地址空間。虛擬地址空間存放的數據信息不一定在物理內存中,可能會放在緩存文件中(Paging file)
Physical Memory(物理內存):要頻繁訪問的數據對象必須能長時間地緩存在物理內存中,才能達到最優化的效率。
Reserved Memory(保留內存):是虛擬地址空間的一段地址,不是真正物理空間,由某些API提前申請保留。
Committed Memory(提交內存):將保留內存的頁面正式提交。最終到物理內存中,
Shared Memory(共享內存):windows提供了在進程和操作系統間共享內存的機制。可理解為在多個進程中可見的內存。
Private Bytes:某個進程提交的地址空間中,非共享部分。
Working Set:某個進程的地址空間中,存放在物理內存的那一部分。
Page Fault(頁面訪問錯誤):分為Soft/Hard ,訪問一個存在虛擬地址空間,但不存在物理內存中的頁面時,就會發生PageFault,如果不是訪問越界而導致的,一種目標頁面存在於硬盤,會產生硬盤讀寫,成為Hard Fault。另一種存在物理內存中,但沒有直接放在這個進程的working set下。需要windows重定向,這種不會導致硬盤操作,成為soft fault,一般soft帶來的性能影響可以忽略,只要關系hard fault。
System Working Set:Windows系統也有Working set 可以通過性能監視器里的memory:cache bytes來監控,發生在系統內存上的page fault可以用過Mmeory:cache faults/sec看到。
System Cache(系統高速緩存):提高磁盤I/O速度,可以用過性能監視器:Memory:cache resident bytes監控。
Non Paged Pool (非頁交換區):包含一定范圍內的系統虛擬地址的內存交換區,可以保證在任何時候都駐留在物理內存中,可以通過Memory:pool Nonpaged Bytes來監控。這一塊緩存可以被所有的經常共享,一個最常見的用途是存放所有對象的指針(Object Handles)
Paged pool(頁交換區):系統空間中可以調入或調出系統進程工作集(Working set)的虛擬內存區域。可以通過Memory:pool Paged Bytes和Memory:pool paged resident bytes監控。
Stack(棧):每個線程有兩個棧,一個給內核模式(kernel mode),一個給用戶模式(user mode)。每個棧是一塊內存空間,存放線程運行的過程或函數的調用地址,以及所有參數的值。
In Process:運行在同一個進程的地址空間里。
Out of Process:運行在不同的進程地址空間里。
Memory Leak(內存泄漏):一種是sql server作為進程,不斷地向windows申請內存資源知道整個windows內存耗盡。另一種是sql server 內部,某個sql server組件不斷地申請內存,知道把能申請到的內存耗盡,使得其他組件不能正常運行。前一種情況非常少見。
32位下windows的地址空間及AWE:
默認情況下,windows進程有4G虛擬地址空間,2G給核心態(kernel mode),剩下的2G給用戶態(user mode)。這兩部分會嚴格區分。
任何一個用戶進程的地址空間分布圖:

方法1:在boot.ini文件中使用/3GB參數,可以在企業版的windows下講核心態降到1G,講用戶態升到3G。

方法2:使用Address Windowsing Extensions(地址空間擴展,awe),是一種允許32位應用分配64GB物理內存,並把視圖或窗口映射到2G虛擬地址空間的機制。不是所有的內存申請都使用awe,只有先reserve,再commit的內存調用才使用awe。
Windows層面上的內存使用檢查:
需要檢查的內容有:windows系統自身內存使用數量及內存分布。是否有內存壓力,壓力是否比較嚴重。甚至每個進程的內存使用情況。最后就是是否互相影響。
可以使用性能監視器實現。
Windows系統使用情況:
1、整體使用分析:
Committed bytes:
整個windows系統的內存總數,包括物理內存的數據和文件緩存中的數據。
Commit Limit:
整個windows系統能夠申請的最大內存數,等於物理內存加上文件緩存的大小。如果Commit Limit≈Committed bytes,說明系統內存接近極限。如果緩存文件不能自動增長,系統將不能提供更多的內存空間。
Available MBytes:
現在系統空閑的物理內存,直接反映windows層面有沒有內存壓力。
Page File:%Usage 和Page File:%Peak Usage:
反映緩存文件使用量的多少,數據在文件緩存中存得越多,說明物理內存數量和實際需求量的差距越大,性能也越差。
Pages/sec:
Hard Page Fault每秒需要從磁盤讀取或寫入的頁面數目。是Memory:pages input/sec + Memory:pages output/sec之和。
Memory:page faults/sec 是soft page fault 和 hard page fault的總和。但由於soft page fault 對性能影響不大,所以用處沒pages/sec那么有用。pages/sec不能長時間保持在一個比較高的值。
2、Windows系統自身內存使用情況:
Memory:cache bytes:
系統的working set ,也就是系統使用的物理內存數目。
Memory:System cache resident bytes (system cache):系統告訴緩存消耗的物理內存。
Memory:Pool paged resident bytes:頁交換區消耗的物理內存。
Memory:System Driver resident bytes:可調頁的設備驅動程序代碼消耗的物理內存。
Memory:System Code resident bytes:Ntoskrnl.exe中可調頁代碼消耗的內存。
3、System pool:Memory :pool Nonpaged bytes(非頁交換區)和Memory:pool paged resident bytes(頁交換區)
單個Process使用情況:
Process:%processor Time:目標進程消耗的CPU資源數,包括用戶態和核心態的時間。
Process:Page Faults/sec 目標進程上發生的PageFaults的數目。
Process:Handle Count 目標進程handle數據,如果進程內部有對象老是創建不及時回收,就會發生Thread Leak
Process:Pool Paged Bytes目標進程所使用的Paged Pool的大小。
Process:Pool Nonpaged Bytes目標進程所使用的Non-Paged pool大小。
Process:working set 某個進程的地址空間中,存放在物理內存的那部分。
Process:Virual Bytes:某個進程所申請的虛擬地址空間大小。
Process:Private bytes:某個進程提交了地址空間中非共享的部分。
內存永遠是最重要的系統資源。
SQL SERVER內存使用和Windows之間的關系:
Target Server Memory:理論上能夠使用的最多內存數目。
