像 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 可能不再阻塞或延遲。)
有關 SQL Server 2000 I/O 模式的更完整信息,請參閱 SQL Server 20I/O Basics。
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 個報告不會再次發生。