1. 程式人生 > >Performance Monitor3:監控SQL Server的內存壓力

Performance Monitor3:監控SQL Server的內存壓力

gre server 異常 基本 cati -c eba 技術 buffer

SQL Server 使用的資源受到操作系統的調度,同時,SQL Server在內部實現了一套調度算法,用於管理從操作系統獲取的資源,主要是對內存和CPU資源的調度。一個好的數據庫系統,必定在內存中緩存足夠多的信息,以減少從物理硬盤中讀取數據的次數;如果內存是系統瓶頸,那麽SQL Server一定會運行的非常慢。監控SQL Server的內存壓力,需要從Widnows級別上,對內存使用的整體使用情況進行監控:從SQL Server級別上,監控SQL Server對內存資源的使用情況。

一,從Windows級別來監控內存資源的使用

操作系統能夠調度的內存,有兩個來源:物理內存和虛擬內存。物理內存是內存硬件提供的高速訪問設備,虛擬內存是物理內存的擴展,操作系統開辟一塊物理Disk空間,作為內存空間使用,用於存儲緩存數據的文件,叫作緩存文件(Paging File),路徑名是C:\pagefile.sys,默認是隱藏的。操作系統透明地使用Paging File來存儲數據,Application是無法控制和感知數據是存儲在物理內存還是在虛擬內存中,即,操作系統決定使用物理內存,或Paging file來存儲緩存數據。一般,通過Performance Monitor來監控Windows級別的內存資源使用情況。

1,監控物理內存

常用的系統級別的內存計數器跟硬缺頁中斷有關:

  • Memory:Page Faults/sec :每秒發生的Page Fault的數量,Page Fault包括Hard Fault 和 Soft Fault,Hard fault表示需要從Disk中讀取數據頁,Soft fault表示需要從Physical Memory中讀取數據頁,Soft Fault不會影響性能,由於Hard Fault需要訪問Disk,會產生顯著的延遲。
  • Memory:Pages Input/sec:每秒發生的Hard Fault的數量,用於計算Hard Fault的百分比: Pages Input / Page Faults = % Hard Page Faults,如果百分比經常大於40%,說明系統需要經常訪問Disk獲取數據,在一定程度上說明系統存在內存壓力。
  • Memory:Pages/sec:每秒從Disk讀取或寫入Disk的Page數量,表示內存和Disk交互的Page的數量:將Page存儲到Disk或從Disk讀取數據到內存的Page的數量。

如下圖,Page Faults/sec的數量,均值在6000/s左右,Pages Input/sec波動明顯,時高時低,持續的時間很短,均值在50/s左右,兩者的比例關系均值低於1%,低於40%,可以認為內存壓力較小。Pages/sec 和 Pages Input/sec幾乎完全重合,說明,操作系統當時在進行大量的物理讀操作。

技術分享

2,監控虛擬內存

操作系統會同時消耗物理內存和虛擬內存,虛擬內存計數器主要有兩個:

  • Paging File:% Usage 用於監控Paging file實例的使用比例
  • Process: Paging File Bytes 用於監控虛擬內存的大小

存儲在虛擬內存中的數據越多,說明物理內存數量和實際需求量的差距越大,比值 % Usage 僅僅作為參考值,如果長時間接近100%,那麽系統很可能出現異常。

二,從SQL Server級別上,監控SQL Server對內存資源的使用情況

1,從Buffer Pool計數器監控服務器內存總體使用情況

由於Buffer Pool是SQL Server內存最活躍,使用最多的部分,所以也是最容易出現性能瓶頸的部分,計數值尤其重要:

  • Lazy Writes/sec:被LazyWriter刷新的buffer數量,如果是臟頁,那麽將buffer寫入到Disk,並將buffer空間標記為Free,如果不是臟頁,那麽該buffer空間也被標記為Free,LazyWriter的作用是維護一定數量的Free buffer,SQL Server使用Free buffer來加載新的數據頁。
  • Page Life Expectancy:PLE,數據頁駐留在內存中的時間。如果SQL Server沒有新的內存需求,或有空閑的內存來完成新的內存需求,那麽Lazy Writer不會被處罰,Page會一直駐留在Buffer Pool中,那麽Page Life Expectancy會維持在一個比較高的水平;如果Page Life總是高高低低,表明SQL Server存在內存壓力。PLE的參考數值是:Max Server Memory/4GB*300s,如果PLE值長期低於參考值,內存可能存在瓶頸。
  • Page Reads/sec:每秒從Disk讀取的數據頁數,即物理讀的次數,如果用戶訪問的數據都緩存在內存中,那麽SQL Server不需要從物理Disk上讀取頁面。由於物理IO的開銷大,Page Reads操作一定會影響SQL Server的性能。
  • Free list stalls/sec:等待一個Free Page的請求數量,SQL Server申請從Disk加載一個Page到內存中,必須在內存中分配一個Buffer,Buffer Manager負責維護Free Buffer List,如果Free List沒有任何Free Buffer,那麽請求必須等待,直到有空閑的Buffer使用,才能將Disk中的Page加載到內存中。

根據圖表數據分析,SQL Server執行大量的物理讀操作,導致PLE大幅降低;從Free List Stall和 Lazy Write的測量值推斷,SQL Server內存壓力較小:

  • PLE:大幅度降低,從50Ks降低到均值2Ks左右,說明內存數據頁被大量替換;
  • Free List Stalls/sec: 波動明顯,總體數值很小,說明系統中的Free Buffer能夠滿足SQL Server的需求;
  • Lazy Write/sec:均值在4/sec,比較小;
  • Page Reads/sec:均值在4000/sec,說明SQL Server在進行大量的物理讀操作

技術分享

BCHR(Buffer cache hit ratio)表示:SQL Server 直接從內存中讀取數據的百分比,跟預讀有很大的關系。一次命中意味著在SQL Server讀取數據時,數據存在於內存中,跟數據駐留在內存中的時間長短,以及內存是否有壓力關系不大,僅供參考。

邏輯讀是指直接從內存中讀取數據,物理讀是指從物理Disk文件中加載數據到內存,從SQL Server角度來看,BCHR=邏輯讀/(邏輯讀+物理讀)。

如果數據緩存在內存中,那麽SQL Server從內存中直接讀取數據,而不需要從物理Disk加載到內存。物理Disk能夠執行預讀操作,操作系統將物理Disk上的數據預先加載到內存中,在SQL Server進程訪問數據時,該數據已經存在於內存中了。雖然SQL Server申請了物理讀操作,但是,BCHR的測量值沒有體現物理讀操作,這是因為,在SQL Server讀取數據時,數據是存在於內存中的,SQL Server執行的是邏輯讀操作。

推薦閱讀《Great SQL Server Debates: Buffer Cache Hit Ratio》:

BCHR only responds to significant memory pressure in conjunction with I/O subsystem pressure, or possibly fragmentation i.e. under conditions that impedes page read-ahead to the point that SQL Server becomes much less effective at populating the data cache with the required pages, before the query processor actually requires them for use.

2,從Memory Manager計數器監控服務器內存總體使用情況

在一個非常繁忙的系統中,Lock內存和授予內存是常用的計數器:

  • Total Server Memory (KB):SQL Server當前使用的內存總量
  • Target Server Memory (KB):SQL Server能夠使用的內存總量
  • Lock Memory (KB):SQL Server用於鎖的內存總量
  • Grant Workspace Memory (KB):授予內存,SQL Server用於執行hash,排序和創建Index操作而消耗的內存總量
  • Memory Grants Pending (KB):等待內存授予的進程數量,如果進程不能獲得指定數量的內存,那麽進程將不會開始執行

分析圖表,除了Grant Workspace Memory 有變化之外,其余4個計數值都沒有變化,說明SQL Server執行的操作需要授予內存,而Memory Grants Pending 計數值很小,幾乎為0,說明SQL Server 不存在內存壓力。

技術分享

結論:內存是數據庫系統最重要的資源,操作系統和SQL Server對其的管理比較復雜,根據以上計數器的測量值,基本上能夠推斷出SQL Server是否存在內存壓力,可以結合其他測量值進行佐證,例如,Committed Memory,Stolen Memory,Working Set,Paged Pool,Nonpaged Pool等,這裏就不展開了。

拓展閱讀:

Process:Page File Bytes is the current amount of virtual memory, in bytes, that this process has reserved for use in the paging file(s). Paging files are used to store pages of memory used by the process that are not contained in other files. Paging files are shared by all processes, and the lack of space in paging files can prevent other processes from allocating memory. If there is no paging file, this counter reflects the current amount of virtual memory that the process has reserved for use in physical memor

參考doc:

Windows Performance Counters Explained

Buffer cache hit ratio性能計數器真的可以作為內存瓶頸的判斷指標嗎?

Great SQL Server Debates: Buffer Cache Hit Ratio

SQL Server memory performance metrics – Part 1 – Memory pages/sec and Memory page faults/sec

Performance Monitor3:監控SQL Server的內存壓力