一个典型的磁盘包含若干个盘片(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)