Performance Monitor4:監控SQL Server的IO性能

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

SQL Server的IO性能受到物理Disk的IO延遲和SQL Server內部執行的IO操作的影響。在監控Disk性能時,最主要的度量值(metric)是IO延遲,IO延遲是指從Application創建IO請求,到Disk完成IO請求的時間延遲。如果物理Disk不能及時完成IO請求,跟不上請求 ...


SQL Server的IO性能受到物理Disk的IO延遲和SQL Server內部執行的IO操作的影響。在監控Disk性能時,最主要的度量值(metric)是IO延遲,IO延遲是指從Application創建IO請求,到Disk完成IO請求的時間延遲。如果物理Disk不能及時完成IO請求,跟不上請求負載的速度,那麼SQL Server就容易出現性能問題。SQL Server內部在執行一些特定的操作時,會和Disk做讀寫交互,這也會影響物理硬碟響應SQL Server的IO請求的性能,使查詢進程處於PageIOLatch或WriteLog等待。

一,在系統級別監控物理Disk的IO性能

1,監控物理Disk的IO延遲

在Windows級別上對Physical Disk的IO延遲進行分析,主要依賴於Performance Monitor的計數器,衡量物理Disk的IO延遲的計數器主要有三個:

  • Avg. Disk sec/Transfer:Disk每一次讀寫操作所用的平均時間
  • Avg. Disk sec/Read:Disk每一次讀操作所用的平均時間 
  • Avg. Disk sec/Write:Disk每一次寫操作所用的平均時間

avg.Disk sec/(Transfer,Read,Write),能夠很好的反映Disk的IO速度,推薦的衡量Disk的IO速度的基線(baseline):

  • 很快:<10ms
  • 一般:10-20ms
  • 有點慢:20-50ms
  • 非常慢:>50ms

2,分析Data Collector收集的計數器數值

下圖是產品環境中一臺Server的計數器數值圖表,將IO延遲的度量值按比例放大1000倍,這樣圖表顯示的單位就是ms。

  • %Idle Time:在60%左右浮動,說明Disk不是很忙碌
  • Avg.Disk sec/Write:大多數情況下都是10ms以下,偶爾波動,說明Disk的寫延遲比較低
  • Avg.Disk sec/Read:讀延遲大多數情況下都是在40ms以上,鮮有低於40ms,偶爾達到峰值,說明Disk的讀延遲非常高
  • Avg.Disk sec/Transfer:讀寫延遲的均值在30ms左右,時有波動,在%Idle Time曲線不波動時,Disk的讀寫延遲也有波動,說明Disk的讀寫延遲不穩定

初步判斷,Disk的讀寫延遲非常高,Disk的IO性能較差,IO速度慢

3,監控物理Disk的IO次數

根據Disk的IO次數來界定Disk性能,沒有統一的閾值,一般通過監控計數值來獲取一個趨勢,設置一個基線,如果在Disk比較忙碌時,遇到異常的谷值,那麼就需要查看是否出現參數嗅探問題和Disk IO密集的查詢,異常的谷值一般是由查詢語句請求的數據量太多造成的,需要對查詢語句進行性能調優。

系統級經常用到的Disk性能計數器是PhysicalDisk計數器:

  • Avg. Disk Queue Length :提供Disk阻塞程度的主要度量值,表示在 sample interval期間,Disk等待處理的IO請求隊列的平均長度,即等待被Disk處理的IO請求的數量
  • % Idle Time:Disk的空閑程度,可以反推出Disk的忙碌程度
  • Disk (Reads/Writes/Transfers)/sec:每秒Disk執行讀寫操作數量

隊列長度波動很大,在%Idle Time 升高時,IO數量降低,沒有發現明顯的異常谷值。

4,監控物理Disk讀寫的數據量

這幾個計數值,對監控物理Disk的讀寫性能,意義不大,僅僅作為參考。

  • Avg.Disk Bytes/(Read,Write,Transfer)表示:在物理Disk執行讀寫操作時,物理Disk從Disk讀取到記憶體的位元組數量,從記憶體寫入到Disk的位元組數量,以及兩者的總位元組數量
  • Disk Bytes/sec:在物理Disk執行讀寫操作時,數據從Disk傳輸到記憶體,或從記憶體寫入到Disk的位元組速度,好的Disk,其值在20-40MB之間,一般Disk,其值在20MB以下

二,SQL Server內部操作對Disk IO性能的影響

SQL Server能夠緩存從Disk載入的數據頁,正常情況下,大部分操作不需要任何物理讀操作,不需要Disk的物理IO參與就能完成,但是,有一些操作,必須和物理Disk進行IO操作,才能完成。SQL Server和物理Disk進行IO交互的操作:

  • 對於記憶體中沒有緩存的數據,第一次訪問時,需要將數據從數據文件讀取到記憶體中,SQL Server訪問的任何數據必須緩存到記憶體中,如果不在記憶體中,SQL Server發送讀請求,將數據頁從物理Disk讀取到記憶體中,這個過程叫做物理讀;如果數據存在於記憶體中,SQL Server直接訪問,這個過程叫做邏輯讀。
  • 在任何修改操作提交之前,預寫事務日誌記錄到日誌文件,在CheckPoint和LazyWriter運行時,數據被寫入數據文件。
  • 執行CheckPoint時,將緩存中的臟頁寫入數據文件,臟頁是指載入記憶體之後被修改過的數據頁,記憶體中的數據和數據文件中的數據不一致,由CheckPoint觸發的物理寫操作和內壓沒有關係,和用戶修改的數據量有關,用於控制還原的時間間隔。
  • 當Buffer Pool空間不足,Free Buffer List減少到臨界值時,LazyWriter進程主動將記憶體中的一些很久沒有訪問過數據頁面和執行計劃清空,如果數據頁面是臟頁,那麼將其寫入到數據文件,LazyWriter和記憶體壓力有關,由於記憶體可用的Free Buffer不足導致LazyWriter進程執行清理操作。
  • IO密集型操作,比如檢查資料庫的一致性(DBCC CheckDB),重建索引,更新統計信息,資料庫備份等,會帶來大量的Disk IO操作

SQL Server只會讀取數據文件,只要數據緩存在記憶體中,理想情況下,SQL Server不會執行任何物理讀操作,也不需要從物理Disk載入數據到記憶體,SQL Server執行讀取操作性能和記憶體的緩存能力有直接關係,也和用戶讀取的數據量有關。

SQL Server的寫操作分為寫數據文件和寫日誌文件。寫入日誌文件的數據量,完全由數據修改量決定,和記憶體壓力沒有關係;寫入數據文件的數量,主要和修改量有關。LazyWriter和記憶體壓力有關係,一旦記憶體有壓力,LazyWriter自動啟動,負責清理最久未被訪問的緩存,釋放記憶體,增加可用的Free buffer數量。

因此,SQL Server請求的物理Disk的讀操作數量和記憶體有直接關係,記憶體越充足,緩存的數據量越多,物理Disk的讀操作的數量就會越少,邏輯讀的數量不會減少;SQL Server請求的物理Disk的寫操作數量和用戶執行的數據修改量有直接關係,和記憶體是否存在壓力關係很微小。在執行物理disk的讀寫請求時,SQL Server的查詢進程產生PageIOLatch等待,表示進程正在執行物理讀操作,該等待可以從DMV:sys.dm_exec_requests 查看到:

select  r.session_id,
        r.blocking_session_id as blocking,
        r.wait_type as Current_Wait_Type,
        r.wait_resource, 
        r.last_wait_type,
        r.wait_time,
        r.status,
        r.command,
        r.cpu_time,r.reads,r.writes,r.logical_reads,
        r.total_elapsed_time,
        r.start_time,
        db_name(r.database_id) as database_name,
        SUBSTRING(  st.text, 
                    r.statement_start_offset/2+1,
                    (    CASE WHEN r.statement_end_offset = -1 
                                THEN LEN(CONVERT(NVARCHAR(MAX), st.text))
                            ELSE (r.statement_end_offset - r.statement_start_offset)/2
                        END 
                    )
                ) as IndividualQueryStatement
from sys.dm_exec_requests r
outer APPLY sys.dm_exec_sql_text(r.sql_handle) as st
where (r.wait_type<>'MISCELLANEOUS' or r.wait_type is null)
    and r.session_id>50
    and r.session_id<>@@spid
View Code

PageIOLatch 等待:表示進程正在從物理Disk載入數據到記憶體,即進程在進行物理讀操作,從Reads欄位能夠看到物理讀的數量

WriteLog 等待:表示事務正在修改數據,SQL Server將預先將事務日誌記錄寫入到事務日誌文件

 

參考文檔:

Memory - Lazy Writer and Checkpoint

SQL Server disk performance metrics – Part 1 – the most important disk performance metrics

Measuring Disk Latency with Windows Performance Monitor (Perfmon)


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

-Advertisement-
Play Games
更多相關文章
  • table標簽製作表格代碼繁瑣,且不方便後期代碼維護。 li標簽加上css的浮動樣式可以製作多種樣式的表格。 代碼如下: <ul id="ttttt" style="width:404px;text-align:center;line-height:30px;border-left:1px soli ...
  • 當我們的網頁需要插入很多圖片的時候,為了美觀,我們可以選擇用瀑布流的方法插入圖片 首先我們在body裡面放入我們需要展示的圖片 <div id="box"> <div class="dinwei"> <div class="pic"> <img src="image/1.jpg"> </div> < ...
  • 好一段時間沒有更新博文了。剛學習完JS基礎知識後,也進入到了JQ的學習。為了能熟練掌握JQ的使用,最好的方法就是反覆多練,講JQ中的API的每個知識點都練習一遍。如果能做到這個,那麼對JQ就沒那麼陌生了。這一天,先將JQ中的選擇器的每個點熟悉一遍。註:記得先將JQ庫引入,並且<script></sc ...
  • 前幾天寫一個頁面 發現寬度為900px的div居然放不下3個寬度為300px的內聯元素li,只好改用了float:left來佈局。後來上網一查,才知道inline-block是有預設間距的,預設間距為4px,並且inline也是有預設間距。現在就來盤點一些解決inline-block元素和inlin ...
  • The Write Less , Do More ! jQuery選擇器 1. #id : 根據給定的ID匹配一個元素 結果: 這是第一個p標簽 這是第二個p標簽 2. element : 根據給定的元素標簽名匹配所有元素 結果: 這是div標簽1 這是div標簽2 這是p標簽 3. .class ...
  • 前面的話 前面分別介紹了拖拽模擬和磁性吸附,當可視區域記憶體在多個可拖拽元素,就出現碰撞檢測的問題,這也是javascript動畫的一個經典問題。本篇將詳細介紹碰撞檢測 原理介紹 碰撞檢測的方法有很多,接下來使用九宮格分析法 假設黃色元素要與紅色元素進行碰撞。將紅色元素所處的區域分為9部分,自身處於第 ...
  • SQLSERVER編譯與重編譯 編譯的含義 當SQLSERVER收到任何一個指令,包括查詢(query)、批處理(batch)、存儲過程、觸發器(trigger) 、預編譯指令(prepared statement)和動態SQL語句(dynamic SQL Statement)要完成語法解釋、語句解 ...
  • 將Mahout on Spark 中的機器學習演算法和MLlib中支持的演算法統計如下: 主要針對MLlib進行總結 分類與回歸 分類和回歸是監督式學習; 監督式學習是指使用有標簽的數據(LabeledPoint)進行訓練,得到模型後,使用測試數據預測結果。其中標簽數據是指已知結果的特征數據。 分類和回 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...