SQL Server 磁碟請求超時的833錯誤原因分析以及解決

来源:http://www.cnblogs.com/wy123/archive/2017/06/11/6984885.html
-Advertisement-
Play Games

本文出處:http://www.cnblogs.com/wy123/p/6984885.html 最近遇到一個SQL Server伺服器響應極度緩慢,並且出現客戶端請求報錯的情況,在資料庫中的errorlog中出現磁碟請求超過15s才完成的error消息。對於此類問題,到底是存儲系統或者磁碟的故障, ...


 

本文出處:http://www.cnblogs.com/wy123/p/6984885.html 

 

最近遇到一個SQL Server伺服器響應極度緩慢,並且出現客戶端請求報錯的情況,在資料庫中的errorlog中出現磁碟請求超過15s才完成的error消息。
對於此類問題,到底是存儲系統或者磁碟的故障,還是SQL Server 自己的問題,亦或是應用程式引發的呢?又要如何解決?
本文將對引起此問題的某一方面的因素進行簡單的分析,但是無法涵蓋所有潛在的可能性,因此遇到類似問題還要做具體的分析。

 

SQL Server中的磁碟請求超時

  該錯誤的英文版的錯誤信息如下:
  SQL Server has encountered %d occurrence(s) of I/O requests taking longer than %d seconds to complete on file [%ls] in database id %d. The OS file handle is 0x%p. 0
  The offset of the latest long I/O is: %#016I64x
  中文版的錯誤信息如下
  SQL Server 已遇到 %1! 次對資料庫 ID %4! 中的文件 [%3!] 進行的 I/O 請求超過 %2! 秒才完成。操作系統文件句柄為 0x%5!。最新的長時間 I/O 的偏移量為: %6!


  參考message信息中的833號錯誤消息

  

 

 

具體的833 error 申請磁碟請求超時現象

  具體報錯情況如下:
  SQL Server 已遇到 m 次對資料庫 n 中的文件***進行的 I/O 請求超過 15 秒才完成。操作系統文件句柄為 ***。最新的長時間 I/O 的偏移量為: ***
  也就是說在資料庫的文件自動增長的過程中遇到了錯誤。

  

  比較有意思的是某DBA將此錯誤信息報告給負責存儲(SAN存儲,並非掛的磁碟)的工程師,認為是可能存儲系統存在故障或者不穩定造成的,
  存儲工程師認為存儲沒有問題,檢查伺服器後說伺服器不正常,記憶體“幾乎占滿”,
  對於資料庫伺服器,記憶體“幾乎占滿”的情況可以說是完全正常的,鑒於負責存儲的工程師並非專業DBA,對於SQL Server資料庫伺服器的記憶體使用可能不是太瞭解,提出此疑問也可以理解。
  因為資料庫伺服器使用的存儲是高性能的SAN存儲,存儲是作為一個服務存在的,有N多伺服器共同來使用的,
  其他伺服器並沒有出現磁碟請求,不太可能說某一臺伺服器會出現疑似“存儲故障”就簡單認定為是存儲故障。
  那麼究竟原因在什麼地方呢?

 

資料庫引擎錯誤833的含義

  首先來看這個833錯誤的具體含義是什麼,就不自己裝13解釋一通了,那本經典的書上寫的很清楚了。
  總之,意思就是,SQL Server在請求磁碟讀寫的時候,遇到磁碟繁忙或者其他一些因素,超過了15秒還沒有完成
  比如數據的讀寫的時候需要向磁碟發起請求,而磁碟正忙或者其他問題,來不及或者相應的不夠及時,這樣無疑會嚴重影響SQL Server對外提供伺服器的響應時間。
  上面簡單分析了,因為該問題並非普片發生的,存儲系統不太可能出現問題,那就很有可能定位到當前伺服器自身的因素了。

  

 

 

原因分析

  因為是專門的SQL Server伺服器,沒有其他應用程式的請求,很有可能跟向sqlserver資料庫發起的請求有關。
  其實發生這個問題之前,早就有預兆了,平時還算穩定的伺服器(CPU很少超過60%,記憶體的PLE也可以穩定在20分鐘以上,磁碟IO延遲較低等等),只是偶爾會存在抽風一陣子的情況
  抽風的時候表現為CPU狂飆到80%左右,記憶體的PLE會嚴重下降,IO延遲嚴重增高。
  現在只能從SQL Server的Session入手,在觀察SQL Server中的活動Session的時候,發現某一類的SQL語句的查詢時間非常長,
  平時這類SQL在某一個時間段內執行的頻率還算比較高。
  但是正常情況下,這類SQL的執行效率還是比較高的,為什麼突然就變的非常之底?
  在檢查活動Session的對應的執行計劃的時候,發現這類活動Session的等待狀態都是IO等待(PAGEIOLATCH_SH),同時SQL的執行完全是意料之外的執行方式。
  因為類似查詢還是執行的比較頻繁的,此類Session會從不同的客戶端發起,一旦SQL的執行效率降下來,伺服器上會積壓大量的活動Session
  為什麼平時執行的好好的SQL語句突然就變的很慢很慢,
  原因就在於在某一點,SQL Server自動觸發了統計信息的更新,但是這是一個比較大的表,但是預設統計信息更新的取樣比例是不夠的,如果取樣百分比不夠,這個統計信息完全是不可用的。
  參考之前的文章:http://www.cnblogs.com/wy123/p/5875237.html
  一旦自動收集統計信息完成之後,會根據當前收集到的統計信息,向之前的SQL語句發出一種它認為高效的方式(table scan而不是index seek),其實這種方式並非是合理的,
  由此引發對應的SQL利用一種並非合理的執行計劃來實現查詢,同時會引發Session的擁堵,客戶端發過來大量的Session同時在利用一種低效的方式緩慢執行。
  所以CPU會飆升,IO延遲增加,記憶體的PLE嚴重下降。
  由此也不難理解,數十個查詢的Session正在以一種不合理的方式瘋狂地想磁碟發出請求,磁碟正在忙於活動Session的數據請求,
  出現無法響應因為數據或者索引文件的自動增長請求,造成一開始說的問題。

  最後經過索引重建(促使統計信息更新,當然純粹的統計信息更新也可以)解決,長期預防的話,需要安排job人為地定義統計信息更新的閾值以及取樣百分比。

 

總結:

  資料庫伺服器上的問題,很多問題都是一個連鎖反應的過程,對應觀察到的一部分現象,很有可能並不是錶面上的反應的那樣(磁碟請求超時,問題出在存儲上?)
  專業的位置上必須要有專業的素養,比如一開始DBA誤以為是存儲問題,存儲工程師認為伺服器記憶體用滿了是不正常的等,其實都不是問題的根本原因所在。
  面對問題,要追本溯源,找出來最根本的原因,才是解決問題的關鍵。

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

-Advertisement-
Play Games
更多相關文章
  • 簡單的說,就是當dispatchTouchEvent在進行事件分發的時候,只有前一個事件(如ACTION_DOWN)返回true,才會收到ACTION_MOVE和ACTION_UP的事件。 dispatchTouchEvent 和 onTouchEvent 可以通過return true 消費事件, ...
  • 在WWDC 2017開發者大會上,蘋果宣佈了一系列新的面向開發者的機器學習 API,包括面部識別的視覺 API、自然語言處理 API,這些 API 集成了蘋果所謂的 Core ML 框架。Core ML 的核心是加速在 iPhone、iPad、Apple Watch 上的人工智慧任務,支持深度神經網 ...
  • iOS CAEmitterLayer 實現粒子發射動畫效果 效果圖 代碼已上傳 GitHub:https://github.com/Silence GitHub/CoreAnimationDemo 動畫效果用 CAEmitterLayer 實現。CAEmitterLayer 顯示粒子發射動畫,具體的 ...
  • OkHttp介紹 Android系統提供了兩種HTTP通信類,HttpURLConnection和HttpClient,HttpURLConnection相對來說比HttpClient難用,google自從2.3版本之後一直推薦使用HttpURLConnection,並且在6.0版本的sdk中直接刪 ...
  • 在iOS開發裡面我們經常會進行NSMutable(可變類型的類,常用的如NSMutableString,NSMutableArray,NSMutableDictionary,NSMutableData等)屬性的聲明,在聲明時我們都知道要使用strong(強引用)來進行標識,但是很多人不知道為什麼不能 ...
  • 1。不要充滿至 100% 。 2。不要放電至 0% 。 3。電池的容量儘量維持在 50%。 4。不要在高溫下操作。 5。不要使用快充功能的充電器。 6。使用一般的充電器,如,500mA 或是 800mA。 ...
  • 本文想要完成對twemproxy發送流程——msg_send的探索,對於twemproxy發送流程的數據結構已經在《twemproxy接收流程探索——剖析twemproxy代碼正編》介紹過了,msg_send和msg_recv的流程大致類似。請在閱讀代碼時,查看註釋,英文註釋是作者對它的代碼的註解, ...
  • 登錄到安裝oracle資料庫伺服器的操作系統。打開命令視窗:(我的演示機器是windows) 登錄到安裝oracle資料庫伺服器的操作系統。打開命令視窗:(我的演示機器是windows) 查看環境變數ORACLE_SID的設置情況: windows: echo %ORACLE_SID% linux: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...