磁碟物理結構及IO時的過程

kuqlan發表於2015-03-10

對於管理磁碟,分磁碟面、磁頭、磁軌、柱面和扇區。

    磁碟面:磁碟是由一疊磁碟面組成,見下左圖。

    磁頭(Heads):每個磁頭對應一個磁碟面,負責該磁碟面上的資料的讀寫。

    磁軌(Track):每個盤面會圍繞圓心劃分出多個同心圓圈,每個圓圈叫做一個磁軌。

    柱面(Cylinders):所有碟片上的同一位置的磁軌組成的立體叫做一個柱面。

    扇區(Sector):以磁軌為單位管理磁碟仍然太大,所以計算機前輩們又把每個磁軌劃分出了多個扇區,見下右圖

 

磁碟物理結構及IO時的過程
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所花費的的尋道時間 ,進而提高磁碟的讀寫效能。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18841027/viewspace-1454179/,如需轉載,請註明出處,否則將追究法律責任。

相關文章