SQL Server內存性能分析

內存概念:數據庫

Working Set = Private Bytes + Shared Memory緩存

Working Set:某個進程的地址空間中,存放在物理內存的那一部分服務器

Private Bytes:某個進程提交的地址空間(Commited Memory)中,非共享的部分數據庫設計

Shared Memory:對多個進程可見的內存,或存在於多個進程的虛擬地址空間。例如若是兩個進程使用相同的DLL,只要該DLL代碼裝入內存一次,其餘全部映射這個DLL的進程只要共享這些代碼就能夠了ide

 

Virtual Address Space :2的64次方。Windows會自行決定何時放在Physical Memory,何時放在Paging file性能

Reserved Memory:應用程序會先Reserve一塊內存的地址空間優化

Committed Memory:將Reserve的內存頁面正式Commit使用,Commit的頁面會最終轉換到Physical Memory中的有效頁面spa

Memory Leak:一直不斷的Reserve或Commit內存資源,即便再也不被使用也不會釋放給其餘用戶使用設計

 

Page Fault:訪問一個存放於Viratul Address Space,但不存在於物理內存(Working Set)的頁面,就會發生Page Fault。若是目標頁面存放於硬盤(例如Pageing File),則會進行硬盤讀寫,稱之爲Hard Fault。若是已經存在在物理內存中,可是尚未直接放在這個進程的Working Set下,則須要Windows從新定向一次,不會帶來硬盤讀寫,稱之爲Soft Fault。因爲Soft Fault通常不會帶來性能影響,所以通常不使用該計數器,而是使用Pages/sec  

排序

Committed Bytes:整個Windwos系統(包括Windows自身及其全部用戶進程)使用的內存總數,包括Physical Memory和Paging file中的數據

Pages/sec:Hard Page Fault每秒鐘須要從磁盤上讀取或寫入的頁面數目(包括Windows和全部應用進程的全部磁盤Paging動做)
Pages/sec = Memory:Pages Input/sec + Pages Output/sec

Page File:%Usage和Page File:%Peak Usage :反映Paging File使用量的多少。數據在Paging File中存的越多,說明Physical Memory和實際需求量差距越大,性能越差 

=================================================================================

Windows系統自身內存使用狀況:
通常狀況下在64爲機器上,使用1-2GB左右。若是因爲一些硬件驅動形成了內存泄露,則Windows可能會佔用到幾GB甚至更多的內存。

系統的Working Set,也就是系統使用的物理內存量,包括高速緩存、頁交換區、可調頁的ntoskrnl.exe、驅動程序代碼和系統映射圖等

Cache Bytes:系統使用的物理內存數目

Cache Bytes = System Cache Resident Bytes + System Driver Resident Bytes + System Code Resident Bytes + Pool Paged Resident Bytes

Memory:System Cache Resident Bytes(System Cache):系統高速緩存消耗的物理內存。高速緩存的主要功能是提升文件讀寫速度(例如讀寫超大文件)

賦予SQL服務帳號「Lock Pages in Memory」權限,以便SQL Server能夠將本身所申請的內存鎖定放在物理內存中,企業版自動啓用該功能。可是NonbufferPool的內存不受限制 

SQL Server做爲一個用戶態爲主的應用程序,仍是會受限於核心態。若是核心態裏發出內存要求,SQL Server就會被迫把本身的內存釋放出來。用戶態永遠也搶不過核心態。

  

=================================================================================

檢查某個進程的內存使用狀況:
Process:Working Set

Process:Private Bytes

Process:Virtual Bytes:某個進程所申請的Virtual Address Space,包括Reserved Memory和Committed Memory

若是系統內存有瓶頸,磁盤通常也會很忙,paging也會較多;但若是磁盤很忙,可是paging不高,就不能說明系統內存有瓶頸

 

=================================================================================

SQL Server內存:
Traget Server Memory:SQL Server在理論上可以使用的最多的內存量。若是在SQL Server中設置了 Max Server Memory,則會使用該值做爲內存上限

Total Server Memory:SQL Server本身分的代碼申請的Buffer Pool空間大小,全部的Database Cache和大部分的Consumer(Connection、Query Plan、
Optimizer等)都保存在Buffer Pool中,對於一些特別長的語句的Query Plan、Optimizer等內存使用一部分的Multi-Page

Buffer Pool = Max Server Memory 或 SQL physical memory-Multi-page

Max Server Memory是Buffer Pool的上限,但不是SQL Server全部內存使用的上限。SQL Server內存的使用包括Buffer Pool和MemToLeave,因此SQL Server實際內存使用量必定大於Max Server Memory。但在正常狀況下,MemToLeave的使用會遠小於Buffer Pool,控制好Buffer Pool,基本上就控制住了SQL Server的總體內存使用量。 
 
Traget Server Memory和Total Server Memory都是指邏輯上的內存空間大小,而不是物理內存空間大小。數據是存放在page file仍是物理內存中是由Windows決定的。 

SQL Server內存使用分類:

按申請方式分類:

對Database Cache,會先Reserve,再Commit。其餘的全部內存使用,基本都是直接Commit,都是Stolen(Memory Leak)


按申請大小分類:

對於全部小於或等於8KB的,直接分配給一個頁面:8KB。全部這些頁面都集中管理,這塊內存被稱爲Buffer Pool,一次一個頁面的分配被稱爲Single page Allocation  

對於大於8KB的內存申請,會被集中在另一個區域,成爲Multi-Page(或MemToLeave),這種分配稱爲Multipl Page Allocation

 


SQL Server性能計數器使用:

Memory Manager:監視服務器內存整體使用狀況

Ttotal Server Memory(KB)

Traget Server Memory(KB)
Optimizer Memory(KB):服務器正在用於查詢優化的動態內存總數

SQL Cache Memory(KB):服務器正在用於動態SQL Server高速緩存的動態內存總數

Lock Memory(KB):服務器用於鎖的動態內存總量

Connection Memory(KB):服務器正在用來維護鏈接的動態內存總量

Granted Workspace Memory(KB):當前給予執行哈希、排序、大容量複製和索引建立等操做進程的內存總量

Memory Grants Pending:等待工做空間內受權的進程總數。若是該值不等於0,就說明當前有一個用戶的內存申請因爲內存壓力而被延遲。通常來說,這就意味着有比較嚴重的內存瓶頸 

 

Buffer Manager:用於監視內存如何使用

Buffer Cache Hit Ratio:在緩衝區高速緩存中找到而不須要從磁盤中讀取的頁的百分比。通過很長時間後,該比率的變化應該很小,基本應該在99%以上。若是小於95%,一般就有了內存不足的問題。能夠經過增長SQL Server的可用內存來提升

Database Pages:緩衝池中有數據庫內容的頁數。也就是所謂的Database Cache的大小

Free pages:全部空閒可用的總頁數。當這個值下降是就說明SQL Server正在分配內存給一些用戶。當這個值降低到比較低的值時(例如只剩幾百個page了),SQL Server就會開始作Lazy Write,把一些內存讓出來,因此該值通常不會爲0.但若是該值反覆下降,就說明內存存在瓶頸。一個沒有內存瓶頸的SQL Server的Free Pages會維持在一個穩定的值 
 
Lazy writes/sec:每秒被緩衝區管理器的Lazy writer寫入的緩衝區數。Lazy writer是一個系統進程,用於呈批刷新髒的老化的緩衝區(包括更改的緩衝區,必須將這些更改寫回磁盤,才能將緩衝區重用於其餘頁),並使他們可用於用戶進程。當SQL Server感受到內存壓力時,就會將最久沒有被重用到的數據頁和執行計劃清理出內存。這些數據頁和執行計劃,就被稱爲「老化的緩衝區」,這個清理動做就是由Lazy writer完成的。因此若是SQL Server內存壓力不大,Lazy writer就不會被常常觸發。若是被常常觸發,就應該是有內存瓶頸 
  
Page life expentancy:頁若不被引用,將在緩衝池中停留的秒數。若是SQL Server沒有新的內存需求,或者有空餘的空間來完成新的內存需求,那麼Lazy writer就不會被觸發,頁面會一直放在緩衝池中,Page life expentancy就會維持在一個較高的值。若是SQL Server出現了內存壓力,Lazy writer就會被觸發,Page life expentancy也會忽然降低。因此若是Page life expentancy老是高高低低,SQL Server應該就出現了內存瓶頸 
 
Page reads/sec:每秒發出的物理數據庫頁讀取數。此統計信息顯示的是全部數據庫間的物理頁讀取總數。若是用戶訪問的數據都緩存在了內存裏,那麼SQL Server就不須要從磁盤讀取頁面,不準須要作任何的Page reads。當SQL Server須要讀取這些頁面時,必需要爲他們騰出內存空間。因此當Page reads/sec高時,通常Page life expentancy會降低,Lazy writes/sec會上升 
因爲物理I/O開銷大,Page Reads動做必定會影響SQL Server性能,能夠經過使用更大的數據緩存、智能索引、更有效的查詢或更改數據庫設計等方法下降Page Reads

Page writes/sec:每秒執行的物理數據庫頁寫入數。該值和內存使用沒有什麼關係,和Checkpoint pages/sec同樣,更用戶的修改量有關

Checkpoint pages/sec:由要求刷新全部髒頁的檢查點或其餘操做每秒刷新到磁盤的頁數。該值和內存壓力沒有直接關係,和用戶行爲有關。若是用戶操做主要是讀,Checkpoint值就比較小。若是不少操做都是Insert/Update/Delete,name內存中修改過的數據髒頁就會比較多,每次Checkpoint的量也會較大。主要用來分析磁盤I/O  

Stolen Pages:用於非Database Pages(包括執行計劃緩存)的頁數。這裏就是Stolen Memory在Buffer Pool裏的大小

Target Pages:緩衝池中理想的頁數,乘以8KB,就應該是Target Server Memory的值

Total Pages:緩衝池中的頁數(包括數據庫頁、可用頁和Stolen頁)乘以8KB,就應該仍是Total Server Memory的值

 

SQL性能分析步驟:

1)當內存出現瓶頸時,會出現大量的paging動做,磁盤也就會很繁忙。因此要先解決內存瓶頸,才能下降I/O

2)分析磁盤性能是否正常,讀/寫是否已達到預期值,是讀仍是寫繁忙

3)查看引發高I/O的操做類型(Page Reads、Page Writes、Lazy Writes、Checkpoints、Log Writes等)

 

動態性能視圖:
select * from sys.sysprocesses

select * from sys.dm_os_wait_stats

select *from sys.dm_exec_requests

 

=================================

計數器(2分鐘):

Processor\% Privileged Time
Processor\% Processor Time
Memory\Available Mytes
PhysicalDisk\Avg. Disk sec/Read
PhysicalDisk\ Avg. Disk sec/Write
SQLServer:SQL Statistics\Batch Requests/sec
SQLServer:Memory Manager\Target Server Memory (KB)
SQLServer:Memory Manager\Total Server Memory (KB)

Process(w3wp)\Working SetProcess(w3wp)\Private Bytes

相關文章
相關標籤/搜索