一个典型的磁盘包含若干个盘片(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 活动的监控可通过如下几个性能计数器来度量:
Counter Name | Description |
Avg. Disk sec/Read |
Shows the average time, in seconds, of a read of data from the disk. |
Avg. Disk sec/Write |
Shows the average time, in seconds, of a write of data to the disk. |
Disk Transfers/sec |
Shows the rate of read and write operations on the disk. |
Disk Bytes/sec |
Shows the rate at which bytes are transferred to or from the disk during write or read operations. |
Avg. Disk Queue Length |
Shows the average number of both read and write requests that were queued for the selected disk during the sample interval. |
其中,Avg. Disk sec/Read 和 Avg. Disk sec/Write 是两个主要考量磁盘 I/O 性能的计数器,它们不需要额外的信息作为参考,可以直接判断 I/O 请求的平均延迟。
描述从磁盘对数据进行一个读操作所需的平均时间(单位:秒)。
Avg. Disk Sec/Read is the average time in seconds of a read of data from the disk.
下面列出了参数值范围所代表的意义:
Range | Represent |
少于 10 ms |
很好 |
在 10-20 ms 之间 |
还可以 |
在 20-50 ms 之间 |
有点慢,需要注意 |
大于 50 毫秒 |
有严重的 I/O 瓶颈 |
这里列出的数字均为一般参考,对于有特殊需求的应用,对磁盘参数会有更高的要求。
描述了从磁盘对数据进行一个写操作所需的平均时间(单位:秒)。
Avg. Disk Sec/Write is the average time in seconds of a write of data to the disk.
下面列出了参数值范围所代表的意义:
Range | Represent |
少于 10 ms |
很好 |
在 10-20 ms 之间 |
还可以 |
在 20-50 ms 之间 |
有点慢,需要注意 |
大于 50 毫秒 |
有严重的 I/O 瓶颈 |
实际上,参数范围含义与 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 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 类型。
RAID Type | I/Os per Disk |
RAID 0 |
(reads + writes) / number of disks |
RAID 1 |
[reads + (2 * writes)] / 2 |
RAID 5 |
[reads + (4 * writes)] / number of disks |
RAID 10 |
[reads + (2 * writes)] / number of disks |
例如:通常,一个 15000 RPM(每分钟转数,Revolutions Per Minute)的磁盘的能力大概是 180 IOPS(I/O requests per second)左右。如果 Disk Transfers/sec 的最大值是 1800,则有 1800/180 = 10,那么驱动器至少需要 10 个 15000 RPM 的磁盘组成 RAID 组。
如果判断延迟是由于磁盘数量问题导致,则可以考虑如下方案:
如果判断延迟是由于传输介质问题导致,则可以考虑如下方案:
本文《磁盘性能监控》由 Dennis Gao 发表自博客园,未经作者本人同意禁止任何形式的转载,任何自动或人为的爬虫转载行为均为耍流氓。