Performance Monitor3:監控SQL Server的記憶體壓力

来源:http://www.cnblogs.com/ljhdo/archive/2016/09/28/5153603.html
-Advertisement-
Play Games

SQL Server 使用的資源受到操作系統的調度,同時,SQL Server在內部實現了一套調度演算法,用於管理從操作系統獲取的資源,主要是對記憶體和CPU資源的調度。一個好的資料庫系統,必定在記憶體中緩存足夠多的信息,以減少從物理硬碟中讀取數據的次數;如果記憶體是系統瓶頸,那麼SQL Server一定會 ...


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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • EventBus是一個通過發佈、訂閱事件實現組件間消息傳遞的工具。 它存在的目的,就是為了優化組件之間傳遞消息的過程。傳統組件之間傳遞消息的方法有使用廣播,回調等,而這些方法使用都比較複雜。 工作原理: 依賴: 註:EventBus是事件-訂閱模型,實際上事件就是消息,訂閱就是接收,本文不會很嚴格區 ...
  • Android控制項基本介紹 Android本身提供了很多控制項比如我們常用的有文本控制項TextView和EditText;按鈕控制項Button和ImageButton狀態開關按鈕ToggleButton單選覆選按鈕RadioButton和RadioGroup單選按鈕和覆選按鈕CheckBox圖片控制項I ...
  • 1. UITableView //去除tableviews的點擊效果 //去除tableviews的點擊效果 cell.selectionStyle = UITableViewCellSelectionStyleNone; //隱藏tableView的分割線 cell.tableView.separ ...
  • 更新到Xcode 8的同學應該都遇到了這個問題:用Xcode 8運行項目,日誌會瘋狂的刷,就像下麵這種圖一樣: 日誌輸出 日誌輸出 於是,簡單搜尋了下,“歪果仁”給出瞭如下解決方法: Edit Scheme-> Run -> Arguments, 在Environment Variables裡邊添加 ...
  • easy_install mysql-connector-python >>>import mysql.connector as conner >>> conn = conner.connect(user="root", passwd="kaimen", db="zentao", port=3306 ...
  • SHOW PROCESSLISTor show status where `variable_name` = 'Threads_connected'; ...
  • 目錄: Prerequisites 集群配置規劃 創建域控伺服器 polybase install firewall config 集群配置 刪除計算節點 install Prerequisites Microsoft .NET Framework 4.5 Oracle Java SE RunTim ...
  • 回到目錄 兩雄爭霸 使用StackExchange.Redis的原因是因為它開源,免費,而對於商業化的ServiceStack.Redis,它將一步步被前者取代,開源將是一種趨勢,商業化也值得被我們尊重,畢竟人家研究代碼也不容易,做商品也很正常,當然這不是我們今天的重點,今天主要說一下對StackE ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...