一個典型的磁盤包含若干個盤片(Platters),它們以固定速度繞共用的主軸(Spindle)旋轉。每個盤片的表面覆蓋着一層可磁化的物質。每個磁盤通過磁臂(Arm)末端的磁頭(Head)來讀寫。磁臂是物理連接在一起的,它們可以將磁頭移近或遠離主軸。當一個給定的磁頭靜止時,由它底下經過的盤表面稱為一個磁道(Track)。讀寫磁頭始終是垂直的,因此它下面的一組垂直的磁道被同時存取,這樣的一組磁道稱為柱面(Cylinder)。
雖然磁盤比內存便宜而且容量大,但它的速度很慢,因為磁盤有機械移動的部分:盤旋轉(Platter Rotation)和磁臂移動(Arm Movement)。通常,商用磁盤以每分鍾 5400~15000 轉的速度旋轉,而 7200 RPT(Revolutions per minute)是最常見的。雖然 7200 RPM 看起來很快,但是旋轉一圈需要 8.33 毫秒,比內存常見的存取時間 50 納秒要大 5 個數量級。也就是說,在磁盤轉一圈的時間里,可以對內存進行 100000 次的存取。商用磁盤的存取時間在 8~11 毫秒范圍內。
為了平攤等待機械移動所花費的時間,磁盤會一次存取多個數據項,而不僅僅是一個。對於柱面內的連續出現的頁面,每次磁盤讀寫的都是一個或多個完整頁面。一頁的長度可能為 211 到 214 個字節。一旦磁頭正確定位,並且盤片已經旋轉至所希望的頁面起始位置,對磁盤的讀寫完全是電子化的,大量數據的讀寫可以迅速的完成。
磁盤存取的次數是按需要從盤中讀出或向盤中寫入的信息的頁數來度量的。
磁盤 I/O 活動的監控
對磁盤 I/O 活動的監控可通過如下幾個性能計數器來度量:
- PhysicalDisk 相關的性能計數器主要針對物理磁盤,如果同一物理磁盤上有多個分區,則該計數器計算的是所有分區的和。
- LogicalDisk 相關的性能計數器主要針對邏輯分區,通過掛載點或磁盤驅動器號來指定,而不是監控整個磁盤。
其中,Avg. Disk sec/Read 和 Avg. Disk sec/Write 是兩個主要考量磁盤 I/O 性能的計數器,它們不需要額外的信息作為參考,可以直接判斷 I/O 請求的平均延遲。
Avg. Disk sec/Read
描述從磁盤對數據進行一個讀操作所需的平均時間(單位:秒)。
Avg. Disk Sec/Read is the average time in seconds of a read of data from the disk.
下面列出了參數值范圍所代表的意義:
這里列出的數字均為一般參考,對於有特殊需求的應用,對磁盤參數會有更高的要求。
Avg. Disk sec/Write
描述了從磁盤對數據進行一個寫操作所需的平均時間(單位:秒)。
Avg. Disk Sec/Write is the average time in seconds of a write of data to the disk.
下面列出了參數值范圍所代表的意義:
實際上,參數范圍含義與 Avg. Disk sec/Read 是類似的。
如果大多數磁盤驅動器出現比較高的延遲,則瓶頸可能出現在通信介質(Communication Medium),例如 SAN HBA、交換機、光纖、前端適配器 CPU 和緩存等。如果只有一個或少數幾個驅動器出現延遲,則瓶頸通常會是磁盤組(JBOD:Just a Bunch of Disks),進一步調查則需要查看指定磁盤驅動器上的其他計數器的值。
JBOD (for "just a bunch of disks," or sometimes "just a bunch of drives") is an array of hard disks that haven't been configured according to the RAID (redundant array of independent disks) system.
Disk Transfers/sec
Disk Bytes/sec 和 Disk Transfers/sec 兩個性能計數器常被用來觀測 I/O 請求的規模和數量,用以判斷是否是 JBOD 問題還是通信介質問題,然后通過 Avg. Disk Queue Length 計數器來判斷是否是通信介質問題。
Disk Transfers/sec 實際上是由 Disk Reads/sec 和 Disk Writes/sec 兩個計數器組成。
Disk Transfers/sec = Disk Reads/sec + Disk Writes/sec
通過上面的計數器的值可以判斷是否驅動器沒有足夠的磁盤支撐,以判斷在給定數量磁盤上所做的 RAID 是否合理。可以根據下表中列出的公式來計算應該使用哪種 RAID 類型。
例如:通常,一個 15000 RPM(每分鍾轉數,Revolutions Per Minute)的磁盤的能力大概是 180 IOPS(I/O requests per second)左右。如果 Disk Transfers/sec 的最大值是 1800,則有 1800/180 = 10,那么驅動器至少需要 10 個 15000 RPM 的磁盤組成 RAID 組。
如果判斷延遲是由於磁盤數量問題導致,則可以考慮如下方案:
- 使用更快的磁盤。
- 將頻繁訪問的文件移動到單獨的磁盤。
- 向 RAID 陣列中添加更多的磁盤。
- 使用更快的 RAID 類型。
- 停止與其他卷共享磁盤。
如果判斷延遲是由於傳輸介質問題導致,則可以考慮如下方案:
- 將頻繁訪問的文件移動到單獨的磁盤。
- 驗證 SAN 的高速緩存。
- 使用多種渠道。
參考資料
- Monitoring Disk Usage
- Windows Performance Monitor Disk Counters Explained
- Top Six FAQs on Windows 2000 Disk Performance
- Troubleshooting Slow Disk I/O in SQL Server
- PhysicalDisk Object
- Creating a custom performance monitor counter for SQL Server
- How to use the SQLIOSim utility to simulate SQL Server activity on a disk subsystem
- Basic RAID Organizations
- 獨立硬盤冗余陣列(RAID, Redundant Array of Independent Disks)
本文《磁盤性能監控》由 Dennis Gao 發表自博客園,未經作者本人同意禁止任何形式的轉載,任何自動或人為的爬蟲轉載行為均為耍流氓。