天天看點

磁盤分區對齊詳解與配置 – Linux篇磁盤分區對齊詳解與配置 – Linux篇

許多系統管理者可能不曾聽過”磁盤分區對齊“之說,甚至一些有經驗的存儲管理者對分區對齊也不甚了解。磁盤分區不對齊現象是什麼,為什麼會造成比較嚴重的性能下降?相反,配置正确的分區起始位置(offset)設定會使存儲系統發揮更大的性能潛力。文章就磁盤分區對齊進行的介紹,并且給出了在windows平台上如何配置的方法。

<a target="_blank"></a>

windows的磁盤有一種結構叫做master boot record(mbr), 它的預設大小為63個block(每個大小為512位元組)。它的存在使得磁盤的初始位置和的磁盤上第一個分區的初始位置有63個block的錯位。如果磁盤的單個track大于63個block的話。這就會導緻預設的初始的位置是從第64個開始。使檔案系統的中的track和位于磁盤中的兩個track之上。這種不對齊現象會導緻存儲系統的性能下降,原因是單個i/o請求會跨越多個磁盤上的track,進而導緻存儲系統的額外性能開銷。特别是對于一些随機i/o比較較大的應用程式,影響将更大。

而對于windows 2003以後支援的gpt disk,也會存在磁盤分區不對齊的現象,但是結構有所不同。如圖1所示(圖中機關為block,512位元組),所有的分區由1mb大小(2048 block)構成,第一個分區從lba 34開始,即17kb大小位置。這也就意味着所有的分區會有17kb的不對齊的情況發生。同樣會導緻i/o讀寫性能影響。

磁盤分區對齊詳解與配置 – Linux篇磁盤分區對齊詳解與配置 – Linux篇

a-1.jpg

出于最大化性能需求,任何到後端存儲陣列的i/o需要通過配置适當的結構化,進而避免任何i/o操作跨界現象的發生。如果i/o操作跨越多個界限,會帶來額外的資源開銷進而造成性能下降。是以,為了避免因為分區不對齊所造成的性能影響。需要使用工fdisk或者parted工具建立和對齊分區。

如何選擇一個正确的磁盤分區offset值,基本上emc和其他廠商建議的值都是“64kb”。為什麼要選擇64kb這個值呢,這裡解釋一下。首先講一下一個叫做實體磁道區域的概念。因為對于不同類型的保護級别,也可以說叫raid和磁盤類型,這個區域的範圍有所不同的。我們舉兩個個例子:

symmetrix緩存中的磁道區域機關大小為一個track,即64個block、32kb大小。如圖2所示,如果磁盤分區沒有被對齊,則任何32kb或者更大的i/o就需要跨越兩個track來進行,50%的16kb的i/o會可能會跨越兩個track,25%的8kb也會跨越兩個track,造成額外的存儲系統性能開銷。

磁盤分區對齊詳解與配置 – Linux篇磁盤分區對齊詳解與配置 – Linux篇

l1.jpg

看了第一個例子,讀者可能會想,那把起始位右移一個block就好了啊,(mbr+reserved=63block),就不會有跨track的i/o發生了。接下來我們再看另外一個例子。一個3+1 raid5的單個條帶大小為四個track,即256個block、128kb大小。如果對于這類的磁盤,使用第64個block為起始位置,當linux i/o大小達到64kb的時候,如果i/o直接從緩存(單個track為32kb),則正好完成兩次讀取。但是如果,兩個連續的64kb i/o,且需要牽涉到後端raid5的實體磁盤讀寫,如下圖所示,第二個64kb就會出現跨越兩個條帶的情況發生,進而倒是讀或者寫的開銷加倍。

磁盤分區對齊詳解與配置 – Linux篇磁盤分區對齊詳解與配置 – Linux篇

l2.jpg

在這種情況下,需要将起始位置調節成建議配置(64kb),這樣一來,linux最大i/o大小的情況也不會發生跨多個條帶的情況發生了。(圖3)

磁盤分區對齊詳解與配置 – Linux篇磁盤分區對齊詳解與配置 – Linux篇

l3.jpg

是以說,無論是從存儲系統的緩存從讀取資料,還是i/o在緩存中不存在的情況,需要從底層實體磁盤上讀取資料。對于不同類型的磁盤,64kb的起始為是一個建議配置。

描述了磁盤分區對齊的原理後,下面介紹如何使用fdisk建立對齊分區的例子。在linux中,對齊分區操作需要要空資料的情況下進行,因為對齊分區操作會清空分區表并且該lun上的資料會被删除。在這個例子中,我們對/dev/emcpowerfw裝置,建立一個大小為51281 cylinder(cylinder是symmetrix的計量機關,每個cylinder大小為960kb,是以這個磁盤大小為50gb左右)、offset錯位大小為128個block的磁盤裝置。方法和指令輸出(圖4)如下

linux指令提示符下輸入:

<code># fdisk /dev/emcpowerfw</code>

輸入n,建立一個分區:

輸入p,建立分區為主分區:

輸入起始cylinder位置,預設為第一個:

輸入最後cylinder位置,預設為該磁盤裝置的最後一個cylinder:

輸入x進入expect mode:

輸入b,一定分區初始位置:

設定最初位置為128個block(128 block大小為64kb):

再次輸入p确認分區初始位置資訊:

輸入w儲存退出:

磁盤分區對齊詳解與配置 – Linux篇磁盤分區對齊詳解與配置 – Linux篇

l4-2.jpg

parted和fdisk相比,支援更多的類型(支援gpt)和更大的分區尺寸。下面一個例子給出一個給dev/sdb磁盤建立128bloc分區起始位的例子,方法和指令輸出如下(圖5)

<code># parted /dev/sdb</code>

将顯示機關調整為sector(大小512個位元組):

(parted) unit s

列出目前邏輯卷:

(parted) print

将原來number1移除并且建立一個起始位為128 sector,小為976735934 sector的主分區。

(parted) rm 1

(parted) mkpart primary 128 976735934

磁盤分區對齊詳解與配置 – Linux篇磁盤分區對齊詳解與配置 – Linux篇

l5-2.jpg

原文釋出時間:2014-06-09

本文來自雲栖合作夥伴“linux中國”

繼續閱讀