I/O 子系統是 SQL Server 效能的命門。本文提供系統化的 I/O 瓶頸識別方法論:效能計數器 (PerfMon) 關鍵指標 → DMV 等待統計/虛擬檔案統計/掛起 I/O → 磁碟碎片影響 → RAID/儲存配置最佳實務,助您精準定位並解決 I/O 爭用。
| 計數器 | 物件 | 健康閾值 | 異常含義 |
|---|---|---|---|
| Avg. Disk Queue Length | PhysicalDisk | < 2 (每磁碟) | 請求排隊,I/O 等待 |
| Avg. Disk sec/Read | PhysicalDisk | < 10 ms (優), < 20 ms (可接受) | 讀取延遲高 |
| Avg. Disk sec/Write | PhysicalDisk | < 10 ms (優), < 20 ms (可接受) | 寫入延遲高 |
| % Disk Time | PhysicalDisk | < 50% | 磁碟忙碌,飽和風險 |
| Disk Reads/sec | PhysicalDisk | < 85% 磁碟理論 IOPS | 讀取吞吐逼近上限 |
| Disk Writes/sec | PhysicalDisk | < 85% 磁碟理論 IOPS | 寫入吞吐逼近上限 |
多磁碟修正: RAID 陣列下,Queue Length 需除以物理磁碟數。例:4 顆磁碟 RAID 10,Queue=10 → 平均 2.5,仍需關注。
-- 讀寫比例假設:Reads=R, Writes=W
RAID 0: IOPS/磁碟 = (R + W) / N
RAID 1: IOPS/磁碟 = (R + 2W) / 2
RAID 5: IOPS/磁碟 = (R + 4W) / N -- 寫入懲罰 4x
RAID 10: IOPS/磁碟 = (R + 2W) / N -- 寫入懲罰 2x
實測範例:RAID 1, R=90, W=75 → (90 + 2*75)/2 = 120 IOPS/磁碟。若單顆 SAS 15K 磁碟 ~180 IOPS,尚有餘裕;若 SATA 7.2K ~75 IOPS,則嚴重超載。
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_time_ms DESC;
PAGEIOLATCH_SH:讀取頁面等待 (SELECT、掃描)PAGEIOLATCH_EX:寫入/修改頁面等待 (INSERT/UPDATE、Checkpoint、Lazy Writer)signal_wait_time_ms 高 → CPU 排程壓力;wait_time_ms - signal_wait_time_ms 高 → 純 I/O 延遲
SELECT
DB_NAME(vfs.database_id) AS DatabaseName,
vfs.file_id,
mf.physical_name,
vfs.io_stall_read_ms, vfs.io_stall_write_ms,
vfs.num_of_reads, vfs.num_of_writes,
vfs.io_stall / NULLIF(vfs.num_of_reads + vfs.num_of_writes, 0) AS Avg_Latency_ms,
iopior.io_pending_ms_ticks,
iopior.scheduler_address
FROM sys.dm_io_virtual_file_stats(NULL, NULL) vfs
JOIN sys.master_files mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id
LEFT JOIN sys.dm_io_pending_io_requests iopior ON vfs.file_handle = iopior.io_handle
ORDER BY vfs.io_stall DESC;
重點關注 Avg_Latency_ms > 20 或有 io_pending_ms_ticks 累積的檔案。
SELECT
(cntr_value / 1024.0) AS CheckpointPagesPerSec
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Checkpoint pages/sec';
-- 持續高值表示記憶體壓力或 I/O 寫入跟不上
sys.dm_db_index_physical_stats 監控 avg_fragmentation_in_percent。>30% → REBUILD (ONLINE=ON);5-30% → REORGANIZE。| 檔案類型 | I/O 特徵 | 建議配置 |
|---|---|---|
| 資料檔 (.mdf/.ndf) | 隨機讀寫、大量掃描 | 專用 RAID 10 / 全閃陣列 / 多檔案多檔案群 (每檔案群 1 檔/核心) |
| 日誌檔 (.ldf) | 順序寫入 (99%)、極少讀取 | 專用 RAID 1 (鏡像)、低延遲磁碟、絕不可與資料檔共用磁碟 |
| TempDB | 高並發隨機讀寫、版本存儲 | 專用快速儲存 (NVMe/RAID 10)、多資料檔 (1:1 邏輯核心、<8 核心時同核心數、>8 核心 8 檔起步) |
| 備份檔 | 大量順序寫入/讀取 | 獨立磁碟/網路共享/異地儲存,不佔用生產 I/O |
FILE_FLAG_WRITE_THROUGH + FILE_FLAG_NO_BUFFERING,繞過 OS 快取,直接命中控制器快取。I/O 調優是「測量 → 定位 → 優化儲存/配置/查詢 → 再測量」的閉環。建立基線指標庫,異動前後對比,才能量化成果。