通過分析等待類型解決系統產生問題

来源:http://www.cnblogs.com/zhuancloud/archive/2017/02/13/6393245.html
-Advertisement-
Play Games

等待分類與解決基本流程: 步驟1.定位問題 系統等待往往能直觀的反映出系統問題。通過一些常見的等待類型,同樣可以找到系統瓶頸,結合性能計數器往往定位更準確。 步驟1.定位問題 如:系統中存在大量IO類等待,那麼可能表示你的磁碟或記憶體是語句運行緩慢的原因,也是系統的瓶頸所在。 常見的等待類型 CXPA ...


等待分類與解決基本流程:  

 

步驟1.定位問題

系統等待往往能直觀的反映出系統問題。通過一些常見的等待類型,同樣可以找到系統瓶頸,結合性能計數器往往定位更準確。 如:系統中存在大量IO類等待,那麼可能表示你的磁碟或記憶體是語句運行緩慢的原因,也是系統的瓶頸所在。

常見的等待類型

      • CXPACKET : 當嘗試同步查詢處理器交換迭代器時出現。如果針對該等待類型的爭用成為問題時,可以考慮降低並行度。
      • IO_COMPLETION :   在等待 I/O 操作完成時出現。通常,該等待類型表示非數據頁 I/O。
      • PAGEIOLATCH_ : 在任務等待 I/O 請求中緩衝區的閂鎖時發生。
      • PAGELATCH_ : 在任務等待不處於 I/O 請求中的緩衝區閂鎖時發生。
      • LCK_ :等待閂鎖時出現。
      • ASYNC_NETWORK_IO : 當任務被阻止在網路之後時出現在網路寫入中。驗證客戶端是否正在處理來自伺服器的數據。 
      • OLEDB :當 SQL Server 調用 Microsoft SQL Native Client OLE DB 訪問介面時出現。該等待類型不用於同步。而是用於指示調用 OLE DB 訪問介面的持續時間 
      • WRITELOG :等待日誌刷新完成時出現。導致日誌刷新的常見操作是檢查點和事務提交。 
         

步驟2.分析

問題與解決

CXPACKET 

CXPACKET 這個等待可以簡單理解成CPU相關的等待,主要發生在並行計劃中。由於並行計劃需要協同多個task同時工作,那麼“協同”分配等等操作的時候出現的就是這個等待。

如果 CXPACKET 在你系統中是最為嚴重的等待,這時候一般的表現是你的CPU很高。

 

解決方案:適當調整並行度

 

 

 

 

 一般建議系統如果超過32個CPU 那麼設置成8或者4,如果系統中都是特別短小且頻繁的語句建議設置成1(取消語句並行,要慎重真的符合你的場景才好)

    並行開銷的閥值,主要控制SQL優化器何時選用並行計劃,建議預設值,此值設置的越小優化器越容易選擇並行計劃。

    並行度的設置是針對實例級別的設置(2016中可以對單獨資料庫設置)

IO類

  IO_COMPLETIONPAGEIOLATCH_WRITELOG 這三個等待是最為常見的和磁碟相關的等待。他們的不同點是 IO_COMPLETION  主要針對非數據頁 I/O ,如備份操作所需的磁碟交互。PAGEIOLATCH_ 是數據頁相關的磁碟等待。WRITELOG 是日誌相關。

  如果系統中這三個等待是主要等待,說明系統磁碟存在壓力或已經成為瓶頸。

  這裡用PAGEIOLATCH_ 為例進行說明

  PAGEIOLATCH_的 官方解釋:在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“XX”模式。長時間的等待可能指示磁碟子系統出現問題。

    PAGEIOLATCH_的相關等待:

 

PAGEIOLATCH_DT

在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“破壞”模式。長時間的等待可能指示磁碟子系統出現問題。

PAGEIOLATCH_EX

在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“獨占”模式。長時間的等待可能指示磁碟子系統出現問題。

PAGEIOLATCH_KP

在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“保持”模式。長時間的等待可能指示磁碟子系統出現問題。

PAGEIOLATCH_NL

僅供內部使用。

PAGEIOLATCH_SH

在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“共用”模式。長時間的等待可能指示磁碟子系統出現問題。

PAGEIOLATCH_UP

在任務等待 I/O 請求中緩衝區的閂鎖時發生。閂鎖請求處於“更新”模式。長時間的等待可能指示磁碟子系統出現問題。

     怎麼來理解這個官方解釋呢? 首先明確一點,操作系統CPU操作的任何數據都是從記憶體中讀取的,也就是說讀取數據要經過這樣的一條路:

      磁碟中 ——>  記憶體中 ——>  最終使用  

這裡的PAGEIOLATCH_ 就是發生在, 磁碟中 ——>  記憶體中 

  以讀取為例:要讀取的數據頁不在記憶體中,所以就要去磁碟上讀取這部分數據頁,去磁碟讀取數據的時候就會產生PAGEIOLATCH_的相關等待,如果磁碟壓力大,長時間不能反回數據,那麼PAGEIOLATCH_的時間也會越長,語句執行的時間也會越長。

 

註 : 當你的系統出現大量的 PAGEIOLATCH_ 類等待,說明你磁碟可能存在壓力(磁碟速度不能滿足當前業務需求)或你的記憶體不夠用,不能緩存業務常用數據而經常要與磁碟交互!

 

 

WRITELOG  和磁碟有關的另一個等待狀態,正在等待寫日誌記錄,意味著寫入速度也明顯跟不上。而速度跟不上一般有兩種情況:磁碟壓力大響應時間長或真的速度不能滿足讀寫需要。

 

PAGELATCH_ 

PAGELATCH_和 上面講述的PAGEIOLATCH_  看似很像,但中間少了 IO 這個關鍵。

      磁碟中 ——>  記憶體中 ——>  最終使用  

磁碟中——>記憶體中 的等待為PAGEIOLATCH_   而 記憶體中——> 最終使用 的等待為 PAGELATCH_

 當數據已經在記憶體中的時候SQL SERVER 想要使用這個數據頁就要給這個數據頁加鎖。

當等待中出現很多PAGELATCH_ 等待,那麼可以說明:

  1. SQL Server沒有明顯的記憶體和磁碟瓶頸。
  2. 應用程式發來大量的併發語句在修改同一張表格裡的記錄,而表格架構設計以及用戶業務邏輯使得這些修改都集中在同一個頁面,或者數量不多的幾個頁面上。這些頁面有的時候也被稱為Hot Page。這樣的瓶頸通常只會發生在併發用戶比較多的、典型的OLTP系統上。
  3. 這種瓶頸是無法通過提高硬體配置解決的,只有通過修改表格設計或者業務邏輯,讓修改分散到儘可能多的頁面上,才能提高併發性能。

 

TempDB造成的 PAGELATCH_(其實也是一種Hot Page),這裡簡單的看一個例子:

 

    系統中存在大量的 PAGELATCH_UP等待那麼是什麼成為了Hot Page 呢?為什麼說和TempDB有關呢?

     

 

     等待資源 “2:X:X: ”開頭是TempDB,系統中存在大量且高併發的語句使用臨時表和表變數,所以引起TEMPDB瓶頸。請參見:TempDB的診斷和優化

 

LCK_ 

 LCK_類型中的所有很多,如果這種等待在系統中大量存在,可以說明,系統語句間的相互阻塞嚴重。如大家都知道的當你update一張表的時候,你的select會被阻塞直到update完成。這裡就不過多介紹場景了,主要看一下解決此類等待的主要方法:

    1. 語句優化,讓語句執行的更快,減少等待時間。
    2. 採用批量操作代替迴圈方式。
    3. 儘量減少事務的長度。
    4. 嘗試降低事務隔離級別。
    5. 上述都不能緩解...請選用讀寫分離。
 

 LCK_類型中包含:(這裡不做詳細解讀了)

LCK_M_RIn_NL

當某任務正在等待獲取當前鍵值上的 NULL 鎖以及當前鍵和上一個鍵之間的插入範圍鎖時出現。鍵上的 NULL 鎖是指立即釋放的鎖。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_RIn_S

當某任務正在等待獲取當前鍵值上的共用鎖以及當前鍵和上一個鍵之間的插入範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_RIn_U

任務正在等待獲取當前鍵值上的更新鎖以及當前鍵和上一個鍵之間的插入範圍鎖。有關鎖相容性矩陣,請參閱sys.dm_tran_locks

LCK_M_RIn_X

當某任務正在等待獲取當前鍵值上的排他鎖以及當前鍵和上一個鍵之間的插入範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_RS_S

當某任務正在等待獲取當前鍵值上的共用鎖以及當前鍵和上一個鍵之間的共用範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_RS_U

當某任務正在等待獲取當前鍵值上的更新鎖以及當前鍵和上一個鍵之間的更新範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_RX_S

當某任務正在等待獲取當前鍵值上的共用鎖以及當前鍵和上一個鍵之間的排他範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_RX_U

當某任務正在等待獲取當前鍵值上的更新鎖以及當前鍵和上一個鍵之間的排他範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_RX_X

當某任務正在等待獲取當前鍵值上的排他鎖以及當前鍵和上一個鍵之間的排他範圍鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_S

當某任務正在等待獲取共用鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_SCH_M

當某任務正在等待獲取架構修改鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_SCH_S

當某任務正在等待獲取架構共用鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_SIU

當某任務正在等待獲取共用意向更新鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_SIX

當某任務正在等待獲取共用意向排他鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_U

當某任務正在等待獲取更新鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_UIX

當某任務正在等待獲取更新意向排他鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

LCK_M_X

當某任務正在等待獲取排他鎖時出現。有關鎖相容性矩陣,請參閱 sys.dm_tran_locks

ASYNC_NETWORK_IO 

  此等待狀態出現在SQLServer已經把數據準備好,但是網路沒有足夠的發送速度跟上,所以SQLServer的數據沒地方存放。

  1. 出現這種情況一般不是資料庫的問題,調整資料庫配置不會有大的幫助。
  2. 網路層的瓶頸當然是一個可能的原因:對此要考慮是否真有必要返回那麼多數據?
  3. 應用程式端的性能問題,也會導致SQLServer里的ASYNC_NETWORK_IO等待。如果見到了這個類型的等待,就要檢查應用程式的健康狀況,也要檢查應用是否有必要想SQLServer申請這麼大的結果集。
  4. 程式返回結果集的方式 。

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

-Advertisement-
Play Games
更多相關文章
  • 1. Java語言基本數據類型有哪些?分別占用的記憶體空間是多少? 答: byte(1位元組),boolean(1位元組),char(2位元組),short(2位元組),int(4位元組),float(4位元組),long(8位元組),double(8位元組)。 答: &:數值運算時為按位與運算,邏輯值運算時分別計算 ...
  • 在iOS 8中,蘋果引入了UITableView的一項新功能--Self Sizing Cells,對於不少開發者來說這是新SDK中一項非常有用的新功能。在iOS 8之前,如果想在表視圖中展示可變高度的動態內容時,你需要手動計算行高,而Self Sizing Cells為展示動態內容提供了一個解決方... ...
  • 下載MySQL安裝包:http://dev.mysql.com/downloads/mysql/ 如圖,選擇dmg包,下載完成,雙擊後打開對應的pkg包,一直點擊下一步,直到安裝成功 啟動和停止MySQL服務 啟動MySQL服務 sudo /usr/local/mysql/support-files ...
  • Oracle游標使用詳解: 游標: 用來查詢資料庫,獲取記錄集合(結果集)的指針,我們所說的游標通常是指顯式游標,因此從現在起沒有特別指明的情況,我們所說的游標都是指顯式游標。要在程式中使用游標,必須首先聲明游標分類: 靜態游標:分為顯式游標和隱式游標。 REF游標:是一種引用類型,類似於指針。 顯 ...
  • 昨天在修改欄位類型的時候引起了死鎖,我一般會使用REORG命令處理,在控制中心下 只需要執行 REORG TABLE TABLENAME 命令就可以, 但是在 RazorSQL 下執行此命令會報缺失字元,這是我們在前面加上一個過程 CALL SYSPROC.ADMIN_CMD('REORG TABL ...
  • update 表名 set 欄位 = replace(欄位,' ','') //去空格update 表名set 欄位 = replace(欄位,char(10),'') //去LFupdate 表名set 欄位 = replace(欄位,char(13),'') //去CRupdate 表名set ...
  • DATEADD 在向指定日期加上一段時間的基礎上,返回新的 datetime 值。語法 DATEADD ( datepart , number, date ) 參數 (1) datepart:是規定應嚮日期的哪一部分返回新值的參數。 下表列出了 Microsoft® SQL Server™ 識別的日 ...
  • 一.設置客戶端網路實用工具 點擊“開始”-“程式”,在“Microsoft SQL Server”菜單中選擇“客戶端網路實用工具”。 在“別名”選項中點擊“添加”。 在“伺服器別名”中,填入您網站功能變數名稱,在“網路庫”區域中點擊“TCP/IP”,在“連接參數”區域取消“動態決定埠”,指定“埠號”為2 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...