程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 檢測解決SQLServer延遲阻塞I/O問題

檢測解決SQLServer延遲阻塞I/O問題

編輯:關於SqlServer

摘要:本文探討了 SQL Server 2005 Service Pack 4 中的報告工具如何顯著減少為識別和確定延遲和阻塞 I/O 操作的根源所花費的時間。

簡介

  像 SQL Server 這樣的數據庫管理系統依賴於文件輸入/輸出操作的及時進行。有故障或配置不當的硬件、固件設置、篩選器驅動程序、壓縮、程序錯誤以及 I/O 路徑內的其他情況都可能導致阻塞或延遲 I/O 問題,並且很快對 SQL Server 性能產生消極影響。

  上述問題對 SQL Server 的影響因問題細節的不同而差異很大,但它們通常導致阻塞、鎖存器爭用和超時、過長的響應時間以及資源的過度利用。

  阻塞 I/O 是指必須進行外部干預才能完成的 I/O 請求(通常是 I/O 請求包 (IRP))。這種狀況通常需要執行完整的系統重新啟動或類似操作才能解決,並且強烈表明硬件有故障或者在 I/O 路徑組件中存在程序錯誤。

  延遲 I/O 是指無需干預即可完成但所花時間超過預期時間的 I/O 請求(同樣,這通常是 IRP)。這種狀況的原因通常是硬件配置、固件設置或篩選器驅動程序干預,需要硬件或軟件供應商提供幫助以便跟蹤和解決。

  SQL Server 2000 SP4 包含數據庫和日志文件 I/O(讀和寫)邏輯以便檢測延遲和阻塞狀況。當 I/O 操作經過 15 秒鐘或更長時間仍未完成時,SQL Server 會檢測到並報告這一狀況。以下消息將被記錄到 SQL Server 錯誤日志中:

2004-11-11 00:21:25.26 spid1 SQL Serverhas encountered 192
occurrence(s) of IO requests taking longer than 15 seconds to complete
on file [E:\SEDATA\stressdb5.ndf] in database [stressdb] (7). The OS
file handle is 0x00000000000074D4. The offset of the latest long IO is:
x00000000022000".


  該消息表明,當前工作負載需求超出了 I/O 路徑或當前系統配置和功能,或者 I/O 路徑含有不能正常工作的軟件(固件、驅動程序)或硬件組件。

  所記錄的錯誤信息提供了以下信息:

  ### occurrences — 未能在 15 秒鐘以內完成讀或寫操作的 I/O 請求的數量。

  File information — 完整的文件名、數據庫名和受影響文件的 DBID。

  File handle — 該文件的操作系統句柄。可以通過調試器和其他實用工具來使用這一信息跟蹤 IRP 請求。

  Offset — 上一個阻塞或延遲 I/O 的偏移量。可以通過調試器和其他實用工具來使用這一信息跟蹤 IRP 請求。(注:在記錄該消息的時候,該 I/O 可能不再阻塞或延遲。)


記錄與報告

  I/O 的報告和記錄是按照文件執行的。延遲和阻塞 I/O 請求的檢測和報告是兩個不同的操作。

  檢測(記錄)是在 SQL Server 內部的兩個位置處理的。第一個位置是在 I/O 實際完成的時候。如果請求花費了 15 秒鐘以上,則發生記錄操作。第二個位置是在延遲寫入器進程執行的時候。當延遲寫入器執行時,它包含新的對所有掛起的數據和日志文件 I/O 請求進行檢查的操作,並且,如果已經超過了 15 秒鐘的阈值,則會發生記錄操作。

  報告是按照不低於 5 分鐘的時間間隔執行的。當對文件進行下一次 I/O 請求時,發生報告操作。如果記錄操作已經發生,並且自上一次報告發生以來已經過去了 5 分鐘或更長時間,則向錯誤日志中寫入新的報告(上面顯示的錯誤消息)。

  15 秒鐘的阈值當前是不可調整的。盡管不推薦這樣做,但您可以用跟蹤標志 830 完全禁用延遲和阻塞 I/O 檢測。在 SQL Server 啟動期間設置啟動參數 –T830 可以禁用延遲/阻塞 I/O 檢測。使用 dbcc traceon(830, -1) 可以禁用對當前正在運行的 SQL Server 實例的檢測。只有重新啟動 SQL Server,Dbcc traceon 才會生效。

   延遲或阻塞的給定 I/O 請求只會報告一次。如果消息報告 10 個 I/O 被延遲,則這 10 個報告不會再次發生。如果下一個消息報告 15 個 I/O 被阻塞,則表明 15 個新的 I/O 請求已經被延遲。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved