对于管理磁盘,分磁盘面、磁头、磁道、柱面和扇区。
磁盘面:磁盘是由一叠磁盘面组成,见下左图。
磁头(Heads):每个磁头对应一个磁盘面,负责该磁盘面上的数据的读写。
磁道(Track):每个盘面会围绕圆心划分出多个同心圆圈,每个圆圈叫做一个磁道。
柱面(Cylinders):所有盘片上的同一位置的磁道组成的立体叫做一个柱面。
扇区(Sector):以磁道为单位管理磁盘仍然太大,所以计算机前辈们又把每个磁道划分出了多个扇区,见下图
Linux上可以通过fdisk命令,来查看当前系统使用的磁盘的这些物理息。
[root@dbserver ~]# fdisk -l
Disk /dev/sda: 1199.6 GB, 1199638052864 bytes
255 heads, 63 sectors/track, 145847 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x54ab02ca
Device Boot Start End Blocks Id System
/dev/sda1 1 5 40131 de Dell Utility
Partition 1 does not end on cylinder boundary.
/dev/sda2 * 6 267 2097152 c W95 FAT32 (LBA)
......
可以看出我的磁盘有255个heads,也就是说共有255个盘面。145847 个cylinders,也就是说每个盘面上都有145847 个磁道, 63sectors/track说的是每个磁道上共有63个扇区。命令结果也给出了Sector size的值是512bytes。那我们动笔算一下该磁盘的大小。
255盘面 * 145847 柱面 * 63扇区 * 每个扇区512bytes =1199632412160 byte=1117.25GB
结果是1117.25GB,和磁盘的总大小相符。
在如上图可以发现一个错误(标红),是即/dev/sda1的start位置从第 1 扇区个删除开始,如果将第0至62个扇区,即第一磁道(cylinders)单独留给磁盘MBR并从第64个扇区,即第二个磁道(cylinders)开始分区,将会对文件系统的性能会带来很大的提升。
接下来让我们在了解一下磁盘IO时的过程。
第一步,首先是磁头径向移动来寻找数据所在的磁道。这部分时间叫寻道时间。
第二步,找到目标磁道后通过盘面旋转,将目标扇区移动到磁头的正下方。
第三步,向目标扇区读取或者写入数据。到此为止,一次磁盘IO完成。
故:单次磁盘IO时间 = 寻道时间 + 旋转延迟 + 存取时间。
对于旋转延时,现在主流服务器上经常使用的是1W转/分钟的磁盘,每旋转一周所需的时间为60*1000/10000=6ms,故其旋转延迟为(0-6ms)。对于存取时间,一般耗时较短,为零点几ms。对于寻道时间,现代磁盘大概在3-15ms,其中寻道时间大小主要受磁头当前所在位置和目标磁道所在位置相对距离的影响。
操作系统通过按磁道对应的柱面划分分区,来降低磁盘IO所花费的的寻道时间 ,进而提高磁盘的读写性能。