sql server 性能調優 資源等待之PAGEIOLATCH

来源:https://www.cnblogs.com/MrHSR/archive/2018/07/10/9287226.html
-Advertisement-
Play Games

一.概念 在介紹資源等待PAGEIOLATCH之前,先來瞭解下從實例級別來分析的各種資源等待的dmv視圖sys.dm_os_wait_stats。它是返回執行的線程所遇到的所有等待的相關信息,該視圖是從一個實際級別來分析的各種等待,它包括200多種類型的等待,需要關註的包括PageIoLatch(磁 ...


一.概念

  在介紹資源等待PAGEIOLATCH之前,先來瞭解下從實例級別來分析的各種資源等待的dmv視圖sys.dm_os_wait_stats。它是返回執行的線程所遇到的所有等待的相關信息,該視圖是從一個實際級別來分析的各種等待,它包括200多種類型的等待,需要關註的包括PageIoLatch(磁碟I/O讀寫的等待時間),LCK_xx(鎖的等待時間),WriteLog(日誌寫入等待),PageLatch(頁上閂鎖)Cxpacket(並行等待)等以及其它資源等待排前的。 

  1.  下麵根據總耗時排序來觀察,這裡分析的等待的wait_type 不包括以下

SELECT  wait_type ,
        waiting_tasks_count,
        signal_wait_time_ms ,
        wait_time_ms,
        max_wait_time_ms
FROM    sys.dm_os_wait_stats
WHERE   wait_time_ms > 0
        AND wait_type NOT IN ( 'CLR_SEMAPHORE', 'CLR_AUTO_EVENT',
                               'LAZYWRITER_SLEEP', 'RESOURCE_QUEUE',
                               'SLEEP_TASK', 'SLEEP_SYSTEMTASK',
                               'SQLTRACE_BUFFER_FLUSH', 'WAITFOR',
                               'LOGMGR_QUEUE', 'CHECKPOINT_QUEUE',
                               'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT',
                               'BROKER_TO_FLUSH', 'BROKER_TASK_STOP',
                               'CLR_MANUAL_EVENT',
                               'DISPATCHER_QUEUE_SEMAPHORE',
                               'FT_IFTS_SCHEDULER_IDLE_WAIT',
                               'XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN',
                               'SQLTRACE_INCREMENTAL_FLUSH_SLEEP' )
ORDER BY signal_wait_time_ms DESC

  下圖排名在前的資源等待是重點需要去關註分析:

  通過上面的查詢就能找到PAGEIOLATCH_x類型的資源等待,由於是實例級別的統計,想要獲得有意義數據,就需要查看感興趣的時間間隔。如果要間隔來分析,不需要重啟服務,可通過以下命令來重置

DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);  

  wait_type:等待類型
  waiting_tasks_count:該等待類型的等待數
  wait_time_ms:該等待類型的總等待時間(包括一個進程懸掛狀態(Suspend)和可運行狀態(Runnable)花費的總時間)
  max_wait_time_ms:該等待類型的最長等待時間
  signal_wait_time_ms:正在等待的線程從收到信號通知到其開始運行之間的時差(一個進程可運行狀態(Runnable)花費的總時間)
  io等待時間==wait_time_ms - signal_wait_time_ms

二. PAGEIOLATCH_x

  2.1 什麼是Latch

    在sql server里latch是輕量級鎖,不同於lock。latch是用來同步sqlserver的內部對象(同步資源訪問),而lock是用來對於用戶對象包括(表,行,索引等)進行同步,簡單概括:Latch用來保護SQL server內部的一些資源(如page)的物理訪問,可以認為是一個同步對象。而lock則強調邏輯訪問。比如一個table,就是個邏輯上的概念。關於lock鎖這塊在"sql server 鎖與事務撥雲見日"中有詳細說明。

  2.2 什麼是PageIOLatch 

  當查詢的數據頁如果在Buffer pool里找到了,則沒有任何等待。否則就會發出一個非同步io操作,將頁面讀入到buffer pool,沒做完之前,連接會保持在PageIoLatch_ex(寫)或PageIoLatch_sh(讀)的等待狀態,是Buffer pool與磁碟之間的等待。它反映了查詢磁碟i/o讀寫的等待時間。
  當sql server將數據頁面從數據文件里讀入記憶體時,為了防止其他用戶對記憶體里的同一個數據頁面進行訪問,sql server會在記憶體的數據頁同上加一個排它鎖latch,而當任務要讀取緩存在記憶體里的頁面時,會申請一個共用鎖,像是lock一樣,latch也會出現阻塞,根據不同的等待資源,等待狀態有如下:PAGEIOLATCH_DT,PAGEIOLATCH_EX,PAGEIOLATCH_KP,PAGEIOLATCH_SH,PAGEIOLATCH_UP。重點關註PAGEIOLATCH_EX(寫入)和PAGEIOLATCH_SH(讀取)二種等待

2.1  AGEIOLATCH流程圖

  有時我們分析當前活動用戶狀態下時,一個有趣的現象是,有時候你發現某個SPID被自己阻塞住了(通過sys.sysprocesses了查看) 為什麼會自己等待自己呢? 這個得從SQL server讀取頁的過程說起。SQL server從磁碟讀取一個page的過程如下:

  (1):由一個用戶請求,獲取掃描X表,由Worker x去執行。

  (2):在掃描過程中找到了它需要的數據頁同1:100。

  (3):發麵頁面1:100並不在記憶體中的數據緩存里。

  (4):sql server在緩衝池裡找到一個可以存放的頁面空間,在上面加EX的LATCH鎖,防止數據從磁碟里讀出來之前,別人也來讀取或修改這個頁面。

  (5):worker x發起一個非同步i/o請求,要求從數據文件里讀出頁面1:100。

  (6):由於是非同步i/o(可以理解為一個task子線程),worker x可以接著做它下麵要做的事情,就是讀出記憶體中的頁面1:100,讀取的動作需要申請一個sh的latch。

  (7):由於worker x之前申請了一個EX的LATCH鎖還沒有釋放,所以這個sh的latch將被阻塞住,worker x被自己阻塞住了,等待的資源就是PAGEIOLATCH_SH。

  最後當非同步i/o結束後,系統會通知worker x,你要的數據已經寫入記憶體了。接著EX的LATCH鎖釋放,worker x申請得到了sh的latch鎖。

總結:首先說worker是一個執行單元,下麵有多個task關聯Worker上, task是運行的最小任務單元,可以這麼理解worker產生了第一個x的task任務,再第5步發起一個非同步i/o請求是第二個task任務。二個task屬於一個worker,worker x被自己阻塞住了。 關於任務調度瞭解查看sql server 任務調度與CPU

 2.2 具體分析

  通過上面瞭解到如果磁碟的速度不能滿足sql server的需要,它就會成為一個瓶頸,通常PAGEIOLATCH_SH 從磁碟讀數據到記憶體,如果記憶體不夠大,當有記憶體壓力時候它會釋放掉緩存數據,數據頁就不會在記憶體的數據緩存里,這樣記憶體問題就導致了磁碟的瓶頸。PAGEIOLATCH_EX是寫入數據,這一般是磁碟的寫入速度明顯跟不上,與記憶體沒有直接關係。

下麵是查詢PAGEIOLATCH_x的資源等待時間:

select wait_type,
waiting_tasks_count,
wait_time_ms ,
max_wait_time_ms,
signal_wait_time_ms
from sys.dm_os_wait_stats
where wait_type like 'PAGEIOLATCH%' 
order by wait_type

下麵是查詢出來的等待信息:

PageIOLatch_SH 總等待時間是(7166603.0-15891)/1000.0/60.0=119.17分鐘,平均耗時是(7166603.0-15891)/297813.0=24.01毫秒,最大等待時間是3159秒。

PageIOLatch_EX 總等待時間是(3002776.0-5727)/1000.0/60.0=49.95分鐘,    平均耗時是(3002776.0-5727)/317143.0=9.45毫秒,最大等待時間是1915秒。

關於I/O磁碟 sys.dm_io_virtual_file_stats 函數也做個參考

SELECT  
       MAX(io_stall_read_ms) AS read_ms,
         MAX(num_of_reads) AS read_count,
       MAX(io_stall_read_ms) / MAX(num_of_reads) AS 'Avg Read ms',
         MAX(io_stall_write_ms) AS write_ms,
        MAX(num_of_writes) AS write_count,
         MAX(io_stall_write_ms) /  MAX(num_of_writes) AS 'Avg Write ms'
FROM    sys.dm_io_virtual_file_stats(null, null)
WHERE   num_of_reads > 0 AND num_of_writes > 0 

  總結:PageIOLatch_EX(寫入)跟磁碟的寫入速度有關係。PageIOLatch_SH(讀取)跟記憶體中的數據緩存有關係。通過上面的sql統計查詢,從等待的時間上看,並沒有清晰的評估磁碟性能的標準,但可以做評估基準數據,定期重置,做性能分析。要確定磁碟的壓力,還需要從windows系統性能監視器方面來分析。 關於記憶體原理查看”sql server 記憶體初探“磁碟查看"sql server I/O硬碟交互" 。


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

-Advertisement-
Play Games
更多相關文章
  • [TOC] 本章通過幾個案例詳細講解MapReduce程式的編寫與運行。 5.1 案例分析:單詞計數 假如有這樣一個例子,需要統計過去10年電腦論文中出現次數最多的幾個單詞,以分析當前的熱點研究議題是什麼。那麼,在將論文樣本收集完畢之後,接下來應該怎樣做呢? 這一經典的單詞計數案例可以採用MapR ...
  • 介紹: 作為一名開發人員都會知道我們做的項目都要用到資料庫,資料庫都需要賬號和密碼,然而問題來了,做的東西多了那些沒用的賬號和密碼還在哪裡糾纏著我們。所有我們不能忍了刪除掉他。 網上很多都是2008的是刪除方案,知道我看到了這篇:http://stackoverflow.com/questions/ ...
  • 給mysql的root用戶設置密碼 1.剛安裝好的mysql是沒有設置密碼的 2.設置密碼 ******************************************************************************************************** ...
  • 在Linux上登錄MySQL時出現如下提示,如下圖: 通過查找資料瞭解到: MySQL有兩種連接方式: (1)TCP/IP (2)socket 對mysql.sock來說,其作用是程式與mysqlserver處於同一臺機器,發起本地連接時可用。 例如你無須定義連接host的具體IP地址,只要為空或l ...
  • MYSQL介紹 MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System ...
  • 1 資料庫事務處理 一個資料庫事務通常包含對資料庫進行讀或寫的一個操作序列 . 當一個事務被提交給了DBMS(資料庫管理系統),則DBMS需要確保該事務中的所有操作都成功完成且其結果被永久保存在資料庫中,如果事務中有的操作沒有成功完成,則事務中的所有操作都需要被回滾. 1 為資料庫提供了一個從失敗恢 ...
  • 1.MySQL具有以下優勢: (1)MySQL是一個關係資料庫管理系統。 (2)MySQL是開源的。 (3)MySQL伺服器是一個快速的、可靠的和易於使用的資料庫伺服器。 (4)MySQL伺服器工作在客戶/伺服器或嵌入系統中。 (5)有大量的MySQL軟體可以使用。 2.sqlserver 優點: ...
  • [TOC] 3.1 配置各節點SSH無密鑰登錄 【操作目的】 Hadoop的進程間通信使用SSH(Secure Shell)方式。SSH是一種通信加密協議,使用非對稱加密方式,可以避免網路竊聽。為了使Hadoop各節點之間能夠無密碼相互訪問,需要配置各節點的SSH無秘鑰登錄。 【登錄原理】 SSH無 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...