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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...