partition alignment چیست و چرا باید آنرا حتما رعایت کرد؟

مقدمه

همانطوری که من بارها گفته ام، تفاوت مرسدس بنز و در پیکان در تعداد چرخ آنها نیست، بلکه در این است که این چرخها با چه دقتی طراحی شده اند و کار می کنند!
در تمامی رشته های کاری ریزه کاری های فراوانی وجود دارد که عدم توجه به آنها، باعث از کار افتادن محصول نمی شود، بلکه باعث بدتر کار کردن آن، و نرسیدن آن به کارآیی مطلوب می شود.
یکی از این موارد در عرصه سیستم های ذخیره ساز، مبحث partition alignment یا تنظیم شروع پارتیشن است.

چرا سکتور 4k

افرادی که با سیستم های ذخیره ساز سر و کار دارند، می دانند که پایین ترین واحد تقسیم اطلاعات روی یک هارددیسک، یک سکتور است. در واقع یک سکتور حداقل مقداری از اطلاعات است که هر هارددیسک در هر دور خواندن یا نوشتن روی آن کار می کند، و حتی زمانی که شما یک بایت از هارددیسک می خوانید یا می نویسید، حداقل یک سکتور آن خوانده یا نوشته می شود.

بصورت سنتی اندازه یک سکتور در هارددیسک ها 512 بایت است. در واقع فضای یک دیسک به تعداد زیادی سکتور 512 بایتی تقسیم می شود. نکته مهمی که وجود دارد این است که در قبل و بعد از هر سکتور، فضای دیتایی وجود دارد که اطلاعات مورد نیاز خود هارددیسک در آن ذخیره می شود. به عنوان مثال در شروع هر سکتور تعدادی بایت آدرس وجود دارد که کنترلر هارددیسک با خواندن آن مطمئن میشود که سیستم مکانیکی هارددیسک هد را روی سکتور درست هدایت کرده است و علاوه بر این تعدادی بایت سینک وجود دارد که هد هارددیسک را با بیت های نوشته شده سینک می کند. در پایان سکتور هم تعدادی باید وجود دارد که چک سام اطلاعات نگهداری شده روی هر سکتور را در خود دارد. به عبارت دیگر کنترلر دیسک با خواندن هر سکتور، چک سام آنرا محاسبه کرده و با چک سام ذخیره شده در این قسمت مقایسه می کند، تا متوجه شود که آیا آن سکتور درست است یا نه (bad sector) و آیا اطلاعات به درستی ذخیره شده است یا نه.

با ساخته شدن هارد دیسک های با ظرفیت بالاتر، تراکم اطلاعات روی هر پلاتر دیسک بالاتر و بالاتر رفت، طوری که هم خطاهای روی دیسک بیشتر شد و هم فضای روی دیسک ارزشمند شد. به همین خاطر از دسامبر 2009، شرکت وسترن دیجیتال اولین هارددیسک خود را که هر سکتور آن به جای 512 بایت، 4096 بایت است به بازار ارائه کرد که به اسم advanced format disk یا 4k sector disk شناخته می شوند.

با استفاده از سکتورهای بزرگتر، سازنده می تواند تمامی فضای اختصاص شده به چک سام، هدر و آدرس را یک جا متمرکز کند و علاوه بر اینکه فضای چک سام را بزرگتر میکند و امکان تشخیص خطا را بهتر می کند، اما فضای مجموع را کمتر کند. از آنجا که برای هر سکتور 512 بایتی علاوه بر gap و sync، یک فضای 50 بایتی برای چک سام در نظر گرفته می شود، برای 8 سکتور 400 بایت اطلاعات باید برای چک سام سکتورها در نظر گرفت. اما در سکتور 4096 بایتی، علاوه بر فضای gap و سینک، یک فضای 100 بایتی برای چک سام در نظر گرفته می شود. در اینجا علاوه بر این که چک سام 100 بایتی کیفیت چک بهتری فراهم میکند، به ازای هر 4096 بایت ما 300 بایت صرفه جویی کرده ایم. به عبارت دیگر در یک دیسک 3 ترابایت 2 گیگابایت فضای چک سام صرفه جویی خواهد شد.

سکتورهای 4k مسیر را برای ساختن دیسک های با ظرفیت بیشتر هموارتر می کنند. به همین خاطر سازندگان اصلی هارددیسک در دنیا با هم توافق کرده اند که از ژانویه 2011 تمام هارددیسک های ساخته شده در دنیا سکتورهای 4k داشته باشند.

و اما توضیح مشکل

با وجود تمام مزایایی که در بالا قید شد، هنوز بایوس کامپیوترهای قدیمی و بسیاری از نرم افزارها مثل نرم افزارهای کار با هارددیسک (recovery, repair, partitioning) و سیستم عامل های قدیمی تر مانند win xp، بصورت پیش فرض سکتور سایز را 512 بایت فرض میکنند که این باعث می شود که با دیسک های جدید مشکل پیدا کنند. برای حل این مشکل، سازندگان هارددیسک به یک شبه حقه نرم افزاری متوسل شده اند که sector emulation نامیده می شود. دراین حالت با وجود آنکه سکتور سایز فیزیکی روی دیسک 4096 بایت است (physical sector) اما فرم ویر داخل هارددیسک آنرا به سیستم عامل بصورت 8 سکتور 512 بایتی نشان می دهد (logical sector). اتفاقی که در عمل می افتد این است که وقتی سیستم عامل تقاضای خواندن یک سکتور از هارددیسک را می کند، کنترلر دیسک یک سکتور 4096 بایتی را خوانده، آنرا بصورت نرم افزاری به 8 سکتور 512 بایتی تقسیم کرده و فقط 512 بایتی که سیستم عامل لازم دارد به آن تحویل می دهد. موقع نوشتن اطلاعات هم با وجودی که قرار است یک 512 بایت نوشته شود، در عمل سیستم عامل یک 4096 بایت را از دیسک خوانده، 512 بایت مورد نظر را تغییر داده و 4096 بایت را مجددا روی دیسک می نویسد.

مشکلی که در اینجا ظاهر می شود این است که بیشتر سیستم فایل های مدرن مثل ntfs، بلوک سایزهای 4 کیلوبایتی یا بیشتر دارند. حالا اگر شروع پارتیشن دیسک، روی شروع سکتور فیزیکی آن نباشد، هنگامی که قرار است یک بلوک 4 کیلوبایتی از دیسک خوانده شود، از آنجا که بخشی از آن روی یک سکتور فیزیکی و بخش دیگری داخل یک سکتور فیزیکی دیگر است، عملا کنترلر هارددیسک باید دو تا سکتور فیزیکی را بخواند تا اطلاعات یک بلوک را استخراج کند، اما اگر شروع پارتیشن، با شروع سکتور فیزیکی یکی باشد، عملا هر عملیات هارد فقط لازم است یک بلوک را بخواند یا بنویسد.

تاثیر partition alignment روی performance

همانطور که در بخش قبل توضیح داده شد، در صورتیکه شروع پارتیشن روی شروع سکتور فیزیکی نباشد به ازای هر عملیات خواندن، باید دو تا سکتور فیزیکی خوانده شود و به ازای هر عملیات نوشتن هم باید دو تا سکتور فیزیکی نوشته شود. در هنگام read این تاثیر زیادی نخواهد داشت، مخصوصا در هنگام خواندن فایل های بزرگ، چون معمولا هد هارد در محل است و به راحتی می تواند دو تا سکتور پشت سر هم را بخواند. اما در هنگام عملیات write مخصوصا نوشتن فایل های کوچک، performance penalty یا افت بازدهی بسیار قابل توجه خواهد بود.

اندازه گیری های مهندسین ibm روی یک هارد دیسک western digital SD-10EARS با سیستم فایل های ext3, ext4, ReiserFS, JFS, XFS, BtrFS نشان دهنده این مساله است. این اندازه گیری ها با پارتیشن GPT که یکبار روی سکتور 40 تنظیم شده (aligned partition – multiple of 8) و یکبار روی سکتور 34 (non aligned partition – not multiple of 8) انجام شده است، نشان میدهد که بازدهی عملیات read تا 25 درصد افت می کند. در عملیات write افت بازدهی بسیار وحشتناک تر است، طوری که در فایل های بزرگ 1.1 تا 6 برابر افت بازدهی، و در فایل های کوچک تا 25 برابر افت بازدهی (با میانگین 10 برابر افت) بین فایل سیستم های مختلف مشاهده می شود.

اگر این پارتیشن، پارتیشن سیستم عامل باشد روی عملکرد سیستم عامل هم تاثیر بسیار بدی خواهد گذاشت.
نکته بسیار مهم این است که مشکل مشابهی در مورد انواع سیستم های RAID مانند raid5 , 6 وجود دارد. از آنجا که stripe size در راید معمولا بزرگ و 16 تا 256 کیلوبایت است، اگر شروع پارتیشن مضربی از استرایپ سایز نباشد، پرفورمنس نوشتن و خواندن بشدت افت خواهد کرد. امری که هنگام ساختن پارتیشن در سیستم های راید باید در نظر داشت.

آنچه باید در نظر داشت

از آنجا که تمامی دیسک های ساخته شده بعد از ژانویه 2011 بصورت 4k سکتور هستند، باید توجه داشت که باید سکتور شروع هر پارتیشن مضربی از 8 (یعنی 8 تا سکتور 512 بایتی باشد). به عبارت دیگر پارتیشنی که در سکتور 2048 شروع می شود aligned است و اگر مثلا در 2044 شروع شود non aligned است.

سیستم عامل های قدیمی تر مانند win xp و win vista pre sp1 نسبت به این قضیه بی اطلاع هستند و باید هنگام ساختن پارتیشن آنها بصورت دستی و با ابزارهای مناسب پارتیشن را ساخت که بصورت aligned باشند. اما سیستم عامل win7 پارتیشن هایی که می سازد aligned است.

در مورد لینوکس ها هم آخرین نسخه های fdisk و parted تفاوت بین physical sector و logical sector را تشخیص می دهند و به کاربر اعلام می کنند. اما مثلا هنگام سوار کردن ubuntu 12.04 در حالت gpt پارتیشن هایی که خود installer ساخت aligned نبود و ما مجبور شدیم دستی و با ابزار gdisk آنها را بصورت مضارب 8 بسازیم.
از همین رو باید در هنگام ساختن پارتیشن در سیستم های راید یا سیستم های قدیمی تر مثل xp تمهیدات لازم برای align بودن پارتیشن را در نظر داشت.

بعضی اطلاعات کمکی

با سکتور سایز 512 بایت و پارتیشن های mbr نمی توان ولوم و پارتیشن بیشتر از 2 ترابایت درست کرد، و باید سراغ پارتیشن های gpt (GUID Partition Table) رفت. یعنی حداکثر سایز ولوم 2199023255040 بایت است که برابر 4294967294 سکتور 512 بایتی می شود.
ظاهرا در دیسک های موجود امکان انتخاب استفاده از سکتور سایز 4096 بایت (4k) که اندازه سکتور فیزیکی دیسک است وجود ندارد و فرم ویر هارد همواره سکتورها را بصورت 512 بایت (logical sector size) نشان می دهد.
بصورت عادی ویندوز و لینوکس های جدید اولین پارتیشن را از سکتور 2048 شروع میکنند که هم به 8 تقسیم پذیر است و هم اینکه جای برای بوت لودر قبل از آن (یعنی بعد از MBR و قبل از شروع اولین پارتیشن باقی می ماند)
EFI از GPT استفاده می کند، در حالیکه BIOS از MBR استفاده می کند.
GPT در سیستم های 32 و 64 بیت کار می کند، ولی باید کرنل پشتیبانی از GPT را در خودش داشته باشد. gpt محدودیت 4 تا پارتیشن پرایماری (یا 3 تا پرایماری به علاوه یک اکستندد) MBR را ندارد و بصورت پیش فرض میتواند تا 128 پارتیشن روی آن تعریف کرد. gpt به ازای هر پارتیشن و هر دیسک یک GUID منحصر به فرد درست می کند و اختصاص میدهد که مستقیما با آن می توان به پارتیشن ارجاع کرد.
معمولا در لینوکس از parted برای کار با پارتیشن های gpt استفاده می شود. اما ابزار gdisk هم وجود دارد که شبیه fdisk ولی برای پارتیشن های gpt کار می کند.

Transition to Advanced Format 4K Sector Hard Drives

Linux on 4KB-sector disks: Practical advice