Linux下4KB扇區磁碟實用指南
Linux下4KB扇區磁碟實用指南 ---- 確保Linux觸及每一個柱面
Roderick W.Smith
翻譯自 Linux on 4KB-sector disks: Practical advice
摘要:從2009年12月份開始,硬碟廠商開始釋出使用4096位元組扇區的硬碟,以取代原來普遍使用的512位元組扇區。雖然因為作業系統的原因,4096位元組的物理扇區被韌體(firmware)分成了原來的512位元組的邏輯扇區,但是使用更大的物理扇區對於磁碟佈局和系統效能都會有影響。本文將考察這些影響,並在常見的Linux檔案系統中使用基準測試來表現其實際的作用。由於自2010年以來,4096位元組扇區變得越來越普遍,如何處理這些新硬碟也變得越來越重要。
扇區為什麼要變成4096位元組
如何你熟悉磁碟結構,你會清楚磁碟被分成了扇區,扇區大小一般是512個位元組;所有的讀寫操作都涉及到整數倍扇區大小的空間。若深究下去,你會發現實際上在硬碟的扇區之間還包含很大一部分額外的資料。這些額外的位元組被磁碟的韌體(firmware)用來檢測和修正每個扇區內的錯誤。當硬碟容量變得越大時,每平方釐米硬碟上儲存的資料只會越來越多,從而導致更多的底層錯誤,這就限制了韌體的錯誤修復能力。
解決這個問題的辦法是增加扇區的大小,使用更強大的錯誤更正演算法。和512位元組扇區相比,在更大的扇區上,這些演算法更正嚴重錯誤時所需的平均資料量(每位元組)要更小。所以,使用更大的扇區有兩個實在的好處:改善可靠性和增大磁碟容量(至少理論上如此)。
對於現實生活中的終端使用者而言,增加扇區大小的影響力遠不如增加顯示器大小或增強CPU運算力來得明顯。但是,校驗磁碟所需空間的減小確實能夠增大硬碟大小和增加其可靠性。
遺憾的是,對扇區大小為512位元組的假設貫穿於整個軟體鏈,比如基本輸入輸出系統(BIOS),啟動載入器,作業系統核心,檔案系統程式碼,以及磁碟工具,等等。雖然切換到4096位元組大小的扇區已經醞釀了差不多十年,一些工具仍然沒有完全做好準備。漏洞百出的微軟XP系統就不用說了,然而,即使在Linux世界,一些這方面的問題仍然正在解決。
為幫助促進這個轉變,第一批4096位元組扇區磁碟將每個物理扇區翻譯成8個512位元組的邏輯扇區。對於BIOS,作業系統和所有的磁碟工具來說,磁碟扇區大小看來起仍然是512位元組,雖然實際的物理扇區已經是4096位元組了。西數(Western Digital)公司是釋出這種硬碟的第一個廠商,它使用高階格式(Advanced Format)來表示物理扇區大小為4096但用軟體變換為512位元組邏輯扇區的磁碟。本文使用同一個術語統一代指西數的這類硬碟,以及未來其它廠商的類似硬碟。
為什麼效能會受影響
遺憾的是,僅僅表面上通過韌體改變邏輯扇區大小會降低效能。若想知道原因,你需要先理解檔案系統資料結構和硬碟是如何分割槽的。
大多數現代檔案系統使用4096位元組或更大的資料結構。因此,大多數磁碟I/O操作是4096位元組的整數倍。設想Linux在一個扇區大小為4096位元組的磁碟上讀寫這些資料結構的情形。如果檔案系統資料結構剛好與底層物理分割槽完美對齊(align),讀寫一個4096位元組的資料結構只涉及到單個扇區,此時硬碟的韌體不需要做任何額外的工作。但是如果檔案系統資料結構與底層硬體對齊地不那麼好,一次讀寫操作可能會涉及到兩個物理扇區。對於讀操作而言,並沒增加多少額外的時間,因為讀/寫磁頭訪問連續的兩個扇區是經常發生的,韌體可以簡單地捨棄不需要的資料。但是對於非對齊資料的寫操作,韌體需要首先讀取兩個扇區,修改兩個扇區上的部分割槽域,然後在兩個扇區上執行寫操作。這個操作比在單個扇區上寫4096個位元組要費時地多。因此,效能降低了。
那麼,你怎麼知道資料結構是否正確地對齊了呢? 大多數檔案系統將資料結構與所在分割槽的起始位置對齊。所以,如果一個分割槽開始於4096位元組(8個邏輯扇區),它是正確對齊的。遺憾的是,直到現在,大部分Linux分割槽工具沒有這樣對齊。後面的一節,對齊分割槽,描述了怎樣使用常用的Linux分割槽軟體來對齊分割槽。
基準測試結果
你可能想知道正確對齊分割槽的重要性到底幾何。為了回答這個問題,我們在幾個Linux檔案系統下試驗一個1T的西數WD-10EARS高階格式(Advanced Format)硬碟,分別測試對齊分割槽和非對齊分割槽。這個硬碟使用全域性唯一識別符號分割槽表(globally unique identifier(GUID) Partition Table, GPT)來分割槽,對齊分割槽始於第40個邏輯分割槽,而非對齊分割槽始於第34個邏輯分割槽(這是分割槽表大小預設情況下GPT磁碟中第一個可用扇區)。我們在ext3fs, ext4fs, ReiserFS(version 3), JFS, XFS, 和Btrfs這幾個檔案系統下面測試,而Linux核心是64-bit 2.6.32.3。
我們用指令碼來完成一系列的磁碟I/O操作,包括:建立一新的檔案系統,解壓Linux核心壓縮包到測試硬碟上,將壓縮包拷貝到硬碟上,讀取測試硬碟上剛解壓的檔案,從硬碟上讀取壓縮包,刪除Linux核心目錄,等等。源Linux核心壓縮包存於另一個磁碟上,在讀操作測試時,結果被輸出到/dev/null上。在每個寫操作測試後,測試磁碟會被解除安裝,以確保Linux檔案快取中不再存有以前的操作。資料中包括了解除安裝磁碟操作所花費的時間。測試用核心壓縮包約為365MB大小,遠大於磁碟的64MB快取容量。在每個檔案系統上對每個測試執行6次:對齊分割槽3次,非對齊分割槽3次。測試之間的環境差異應該是比較小的。結果是非對齊分割槽的平均時間除以對齊分割槽的平均時間,以量化效能損失情況。大於1.00表示沒有對齊影響了效能,等於1.00表示沒有影響,小於1.00則表示沒有對齊提高了效能。
許多測試都顯示存在著一定的效能損失,對於不同的檔案系統而言,建立檔案系統操作的測試值最小為0.96(XFS),最大為7.94(ReiserFS),平均為2.79。因為建立檔案系統在日常中很少使用,這種損失並不重要。讀操作測試值的範圍為0.95到1.25,這表示速度損失不超過25%,如圖1所示。1.00表示沒有效能損失,數值越高表示效能越差。
圖1 使用非對齊分割槽時的讀操作效能損失
大檔案的寫操作的效能影響也不太大,值域為1.10(XFS和JFS)至6.02(ReiserFS),平均為2.10。無疑,ReiserFS的敏感性影響了平均值,不考慮ReiserFS,平均值變成了1.31。檔案刪除操作的結果類似,值域為1.04(XFS)至4.78(JFS),平均1.97,不考慮JFS平均值變為1.40。
最大的效能影響來自於小檔案的建立(解壓核心壓縮包)。壓縮包解壓的測試值的值域是1.04(ext4fs)至25.53(ReiserFS),平均10.9。測試結果第二好的XFS,測試值為1.82。由於測試值為非對齊情況除以對齊情況,10.9意味著對齊情況下只要10秒的壓縮包解壓在非對齊情況下需要109秒,差異變得非常明顯。XFS的測試值1.82表示10秒操作在非對齊分割槽下需要18.2秒。
圖2總結了這些寫操作在不同檔案系統下的效能損失情況。和前面的約定一致,1.00表示沒有效能損失,值越大效能越差。
圖2 使用非對齊分割槽時寫操作的效能損失
注意,這些測試沒有反映出不同檔案系統的整體效能。比如,你不能因為ReiserFS測試數值較大就推斷ReiserFS效能差,這只不過表示ReiserFS對對齊問題更加敏感而已。
除了在普通分割槽上測試檔案系統外,我們還在LVM上針對不同檔案系統做了同樣的測試,結果與普通分割槽的結果類似。
上面的測試對實際使用有什麼關係? 它們只是理論分析而已,你應該從確定物理扇區大小入手。如果你發現你的硬碟是高階格式(Advanced Format),那麼你就應該正確對齊你的分割槽。
確定物理扇區大小
理論上,Linux核心應該在/sys/block/sdX/queue/physical_block_size偽檔案中返回物理扇區的大小資訊,而在/sys/block/sdX/queue/logical_block_size中返回邏輯扇區大小,其中sdX表示硬碟裝置的結點名稱(如sda,sdb等等)。實際上,物理塊大小資訊常帶有欺騙性,至少第一代西數高階格式硬碟是如此。因此,磁碟工具無法正確地檢測出這些硬碟的存在。(譯者注:這是我看這篇文章的直接原因,買了一個西數硬碟,在Windows下分好一個區後,Gnome Disk Utility看不到剩下的未分割槽空間,而且提示沒有對齊)
要解決這個實際問題,你必須在製造商網站上查閱硬碟的規範說明書,或通過其它方式來了解。/sys/block/sdX/device/model偽檔案中存有裝置的模型號(model number),你可以據此查到對應的製造商。
在當前第一代西數高階格式硬碟上,西數公司在硬碟上設定了一些標籤來廣告這是一個高階格式硬碟。然而,這些標籤暗示只有Windows XP下硬碟才會存在問題,事實上,它也只考慮了Windows XP使用者。因此,從上面的測試得到的結果來看,Linux使用者對這些硬碟就需要自個兒操心了。
對齊分割槽
當前的西數硬碟使用一個jumper來處理Windows XP的相容性。這個jumper的作用是將扇區編號偏移1位,這樣,從扇區63(用於柱面對齊)開始的分割槽實際上位於邏輯扇區64。這是一個快捷卻並不徹底的解決辦法,只適於整個硬碟只有一個分割槽的情況。如果你建立多個分割槽,則除了第一個分割槽之外,其它分割槽仍然沒有對齊。因此,你基本上不要使用jumper,相反,你應用使用Linux分割槽軟體來建立正確的對齊分割槽。
Linux下面有三類工具來操作主開機記錄(Master Boot Record, MBR)和GPT分割槽,每一類工具都有其對齊分割槽的方法。如果你有一塊高階格式(Advance Format)硬碟,你最好是使用最新的Linux分割槽軟體。
提示:如果你想雙系統啟動,包括一個Linux和另一個較舊的作業系統(要求柱面對齊),嘗試讓所有分割槽都開始於8個柱面整數倍位置。這同時滿足8扇區的分割槽對齊和舊作業系統所要求的柱面對齊。
fdisk家族
fdisk工具家族作為util-linux-ng軟體包的一部分,在大部分發行版上都能找到。使用者可以直接編輯MBR資料結構,但不能建立和修改檔案系統。在util-linux-ng 2.17中,fdisk並不對8扇區對齊功能提供任何的直接支援。而從2.17.2版本開始(寫作本文時的最新版本),預設的對齊仍然是柱面對齊。
但是,你仍然可以使用任何版本的fdisk來正確地對齊分割槽。為實現這個功能,你應該在fdisk主目錄中使用u
來將預設的單位從柱面修改為扇區。然後,輸入任意一個為8的整數倍的起始扇區。原則上,你可以指定的值最小為8。但是,最好是將第一個分割槽起始扇區指定為64或更高,這樣可以在MBR和第一個分割槽之間的未分配扇區為啟動載入器程式碼預留空間。微軟Windows Vista和Windows 7的分割槽工具的第一個分割槽的起始扇區為2048,所以從跨平臺的角度,這是一個安全的選擇。從util-linux-ng 2.17.1開始,如果在主目錄中用c
禁用了DOS相容模式,2048實際上就是預設值。我也強烈推薦2048作為第一個分割槽的起始扇區。
但是,需注意的是,fdisk並不自動對齊後續的分割槽。用MB或更大的單位作為分割槽大小然後在後續的分割槽中使用預設值,分割槽很有可能就正確對齊了,但並不絕對。為安全起見,你應該確認每一個分割槽都從8的整數倍扇區開始。
另外一個使用fdisk的方法是執行fdisk -H 224 -S 56 /dev/sda
, 這一條命令改變了柱面/磁頭/扇區(CHS)的幾何關係,讓程式對齊到柱面,從而保證了正確的4096位元組對齊。
libparted 庫
libparted庫支援了許多Linux下支援檔案系統操作的分割槽工具。在版本2.1中,文字模式GPU Parted程式(命令列是parted
)只提供少量的對柱面邊界對齊的支援。最好的方法可能是輸入unit s
來將預設的單位修改為扇區。然後,你可以手動地輸入分割槽起始扇區,並準確地確認分割槽的起始點。
在版本2.2中,libparted開始為4096位元組物理扇區硬碟提供更有用的策略。在這個版本中,你可以指定起始值為1M,然後扇區就會正確對齊。這個版本還會在分割槽沒有對齊時顯示警告。
使用圖形使用者介面(GUI)版本的GParted程式,你應該確保在Create New Partition對話方塊中取消"Round to cylinders"這個勾選框,如圖3所示。你還必須設定當前分割槽的相對於上一個分割槽末尾的起始扇區,但是,如果你一開始就讓分割槽正確對齊了,後面的也就自然地暢通無阻了。你還可以開啟一個分割槽的Information對話方塊來了解其絕對起止扇區。
圖3 使用GParted時取消"Round to Cylinder"勾選框(預設是選中的)
GPT fdisk工具
GPT fdisk工具只對GPT硬碟有用。早於0.5.2的版本不支援任何對齊操作,但你可以手動地指定合適的起始扇區號。版本0.5.2和0.6.0至0.6.5將大硬碟(超過800G)的所有分割槽的起始扇區都調整為8扇區的整數倍,但是小硬碟則不在考慮之列。版本0.6.6為所有未分割槽的磁碟提供一個微軟風格的2048扇區(1MB)對齊方式,並嘗試推斷磁碟上已有分割槽的對齊值。
0.5.2及以後的版本,你可以手動調整對齊值,使用專家選單中的l
選項即可。這個選項的引數為扇區數目,將其設定為8或8的倍數可以將高階格式磁碟正確地對齊。基於當前的對齊值,確認選項(任意目錄中的v
)能報告任何未正確對齊的分割槽。
對齊RAID分割槽
冗餘磁碟陣列(Redundant array of independent disks, RAID)第5和第6級也有和高階格式硬碟類似的對齊問題,但是其原因與用於建立陣列資料帶(stripe)大小有關,其大小一般為16KB至256KB。當使用RAID陣列,你應該將分割槽與資料帶大小的整數倍對齊。預設對齊至2048扇區(1024KB)正漸漸成為一個新的標準,它在所有常見的RAID資料帶大小下都工作良好。
已釋出的測試結果顯示不正確的對齊會導致5%-30%的效能損失,比起高階格式硬碟低多了。當從高階格式磁碟建立一個RAID磁碟陣列時,你無需任何多餘的步驟。因為RAID對齊值是4096位元組,這與高階格式硬碟的對齊要求是一致的。因此,你在RAID陣列上對齊分割槽了,其底層的磁碟扇區也就同時對齊了。
展望
當前,只有少數高階格式硬碟模型存在。相關報告顯示這個技術會從2010年開始擴充套件到所有主要廠商的更多的硬碟上。可以想像,新的模型有可能會導致其它的效能問題,而不限於第一代高階格式硬碟的問題。
最終,硬碟廠商可能會放棄512位元組扇區,或者它們可能會提供jumper來供使用者選擇是否使用相容模式。如果你遇到一個4096位元組扇區的硬碟,並且可以選擇使用真正的扇區大小,你可能會願意嘗試一下,屆時你需要意識到這些問題。
正如早前所提到的,從底層的BIOS往上的軟體可能會假設硬碟的扇區大小。如果BIOS包含了這樣的假設,在一塊物理扇區大小為4096位元組但韌體沒有轉換為512位元組邏輯扇區的硬碟上,你的計算機很有可能無法啟動。GNU Parted 2.2對於非512位元組扇區硬碟顯示警告的功能只是實驗性的。在一些對你重要的軟體中還可能會隱藏著其它問題。使用最新的軟體可能會幫助你解決問題,當使用一個傳統的硬碟作為啟動盤時,你就限制了自己的新技術硬碟只能作為資料盤了(結點號為/dev/sdb或更高)。
總的來說,新的硬碟的推廣正謹慎而有序地進行。意思是,高階格式硬碟的使用方式很有可能會逐步明朗,包括其它新的硬碟型別,而且,發展的速度也會相對較快。
資源(參考文獻和IBM的廣告)
學習
- "高階格式技術"(西數)是一個白皮書(PDF),有多種語言的版本,詳細描述了高階格式。
- "開發西數的高階格式硬碟技術"(Hot Hardare)包含一些Windows的基準測試。
- Linux核心開發者Tejun Heo的一篇博文,該文描述了高階格式硬碟在Linux軟體中的技術挑戰。
- "Linux硬體磁碟陣列指南" 提供了介紹Linux RAID對齊相關問題的資訊
- 在"developerWorks Linux Zone",為Linux開發者和管理員提供了數以百計的[指南和介紹性文章],檔案下載,討論論壇,及豐富的其它資源。
- 關注developerWorks技術事件和網路廣播,它專注於許多IBM的產品和IT工業話題
- 加入一個免費的developerWorks線上簡報獲得及時的IBM產品和工具資訊,以及IT工業發展趨勢
- 觀看developerWorks on-demand demos,包含了產品安裝和初學者示例的使用,也有為資深開發者準備的高階功能
- 關注developerWorks@twitter,或訂閱Linux tweets on developerWorks
獲得產品和技術
- GPU Parted網站,提供基於文字的GNU Parted和它繼承的軟體庫(libparted),GNU Parted是一個成熟的基於文字介面的MBR和GPT操縱工具
- util-linux-ng軟體包,包含了Linux版的fdisk, sfdisk, 和cfdisk
- GNOME Partition Editor,又稱為GParted,是一個GUI的分割槽工具,基於libparted實現
- GPT fdisk是一個只針對GPT硬碟的分割槽軟體,依照fdisk
- Evaluate IBM products是你最好的選擇:下載一個試用產品,線上試用,在雲環境中使用一個產品,或花費幾小時在SOA沙盒中學習如何實現基於服務的體系結構。
討論
- 參與My developerWorks community。聯絡其它developWorks使用者,檢視開發者驅動型部落格,使用論壇和維基。
相關文章
- 思考與總結:扇區和磁碟塊的區別是什麼
- 實戰DeviceIoControl 之七:在Windows 9X中讀寫磁碟扇區 (轉)devWindows
- linux下新增磁碟Linux
- Linux下磁碟掛載Linux
- linux下新增ASM磁碟LinuxASM
- Linux下磁碟加密——luksLinux加密
- 在linux下合併磁碟Linux
- HT之LINUX下增加磁碟Linux
- 為什麼 Linux 預設頁大小是 4KBLinux
- 關於在linux下磁碟定額的實現(轉)Linux
- linux區域網內磁碟對映Linux
- Linux下磁碟I/O測試Linux
- linux下 lvm 磁碟擴容LinuxLVM
- linux下修復磁碟損壞Linux
- linux下udev重新繫結磁碟Linuxdev
- Linux下的磁碟配額quotaLinux
- Linux下磁碟分割槽,fdisk,mkfsLinux
- linux多路徑下線上新增磁碟Linux
- LINUX下磁碟限額配置(轉)Linux
- linux 下監控磁碟空間Linux
- linux下磁碟分割槽的案例Linux
- 主引導扇區的理解
- st foc 扇區判斷解析
- 在Linux下使用DOS/Windows磁碟(轉)LinuxWindows
- Git 實用指南Git
- oracle的block其實是和os的扇區相對應!OracleBloC
- RGB風扇和ARGB風扇有哪些不同?電腦RGB風扇和ARGB風扇的區別介紹
- 磁軌柱面扇區都需要掌握什麼?linux基礎入門Linux
- 實戰指南 | Serverless 架構下的應用開發Server架構
- 實用的linux下指令碼!(轉)Linux指令碼
- Linux下磁碟分割槽工具cfdisk的使用Linux
- Linux 7下使用udev繫結ASM磁碟LinuxdevASM
- linux下將遠端磁碟mount到本地Linux
- 在Linux下測試磁碟的I/OLinux
- linux下磁碟分割槽與格式化Linux
- 在 Linux 下使用 RAID(三):用兩塊磁碟建立 RAID 1(映象)LinuxAI
- 航圖中的扇區資料生成
- 【轉】Linux下關於大於2T磁碟的使用GPT磁碟LinuxGPT