Wednesday, January 22, 2025

Происхождение выравнивания границ разделов жёсткого диска

оригинал: http://jdebp.info./FGA/disc-partition-alignment.html
 

Зачастую считается, что разделы диска должны быть выровнены по границам цилиндров или дорожек, но на самом деле это не так и никогда так не было. Требования к выравниванию существуют, но они никак не связаны с цилиндрами и не являются обязательными. Операционные системы будут работать с дисками, разделы на которых выровнены неправильно, просто медленней на некоторых моделях устройств.


    Заблуждения о выравнивании по границам дорожек


На первый взгляд, идея о том, что разделы на диске должны быть выровнены по границам цилиндров выглядит абсурдной. Миллионы людей пользовались дисками, на которых первый основной раздел начинался с нулевой дорожки, первого сектора и первой головки, без каких-либо негативных последствий для различных операционных систем, начиная c MS_DOS, затем Windows-NT и заканчивая OS/2. В конце концов, это были значения по умолчанию для утилит fdisk и Disk Manager в течение почти двадцати лет. Максимум утилиты могли потребовать выравнивания внутри дорожек, т.е. чтобы все разделы начинались с первого сектора (помните, что сектора нумеруются с единицы) на любой дорожке.

Но даже этого не было: ни одна операционная система никогда не предъявляла таких требований. Даже MS-DOS прекрасно работала с дисками, разделы которых начинались не с первого сектора. Такие требования выдвигали только утилиты для разбиения дисков. В некотором смысле это был порочный круг: утилиты для работы с диском предъявляли требования к выравниванию разделов, потому что их авторы думали, что того требует система. Но люди думали, что такое требование существует в системе, только потому, что его навязывали утилиты типа fdisk. Умозаключение выглядело так: раз утилиты накладывают такие ограничения, значит, на утилиты их накладывает сама система. Но на самом деле операционные системы ничего подобного не требовали.

Так или иначе, идея выравнивания дорожек безумна. Она не имеет смысла, поскольку это не приводит к выравниванию разделов по каким-либо допустимым границами на самом устройстве. Вы не получите выигрыша в производительности или каких-либо других преимуществ, так как разделы не будут выровнены по границам физических дорожек, если их выровнять по тем дорожкам, которые видят программы.

▪ "Дорожки", которое системное ПО видит на уровне регистра команд контроллера интерфейса ATA, не совпадают с реальными дорожками на поверхности диска с тех пор, как появилась ZBR (зональная побитовая запись). На самом деле дорожки на дисках с ZBR имеют разную физическую длину, хотя через старый командный интерфейс с адресацией цилиндр+головка+сектор на дисках ATA они представлялись программам одинаковыми.

▪ В отличие от контроллеров ATA, управляющий интерфейс SCSI всегда оперировал логическими адресами блоков, а не кортежами цилиндр+головка+сектор (CHS). Для контроллеров SCSI с самого начала была неприменима идея о том, что системное ПО обязано различать границы физических дорожек. Вообще-то разработчики контроллеров интерфейса SCSI для персональных компьютеров вынуждены были изобретать геометрию диска, беря её с потолка, ради прошивок PC/AT и PC98,  а также операционных систем, которые ожидали, что контроллеры интерфейса дисков будут оперировать геометрией CHS.

В 2008 г. Микрософт с большой помпой наконец искоренили эту совершенно бесполезную и бессмысленную идею из диспетчера дисков Windows NT (т.е. в релизах Windows Vista Service Pack 1 и Windows Server 2008). До этого, начиная с 2003 года, администраторам Exchange server и Microsoft SQL Server рекомендовалось использовать diskpart и устанавливать границы разделов кратными 4 кибибайтам из соображений улучшения производительности. Хотя некоторые из этих соображений были основаны на ложной посылке, что границы дорожек, которые видят программы, совпадают с физическими границами, тем не менее, в свете более поздней разработки оборудования, они дали ожидаемый результат.

Linux отстал от Windows, и по состоянию на 2011 год утилита fdisk продолжала жаловаться на то, что разделы не выровнены по границам дорожек. Поэтому настоятельно рекомендуется не пользоваться fdisk для разметки, заменив её более современными инструментами, такими как gdisk Рода Смита, у которого также есть преимущество в виде поддержки схемы разметки дисков EFI.


    Выравнивание границ кратно 4 KiB


Правило выравнивания границ разделов дисков, отражающее реальные физические границы, существует - это правило выравнивания  по границам 4 KiB, но оно применимо не ко всем моделям жестких дисков.

В некоторых моделях внутренний размер сектора был увеличен с 0.5 Kib до 4 Kib (физический сектор). Однако на уровне контроллера интерфейса, через который системное ПО общается с диском, размер сектора остался 0.5 Kib. Такие диски называются 512-байтовыми эмуляционными носителями. При этом предполагается, что будут и диски без эмуляции, у которых размер логического сектора также будет равен 4 KiB. Но, поскольку на данный момент очень немногие операционные системы поддерживают размер сектора, не равный 512 байтам, на уровне стандартных команд ATA/SCSI, то и пользователей таких носителей немного, и они не представляют большого потребительского рынка для производителей жестких дисков.

512-байтовые эмуляционные диски работают следующим образом: каждый раз, когда операционная система или прошивка считывает 0.5 KiB, само устройство считывает 4 KiB, делит это число на восемь и передаёт ОС или прошивке результат деления. Когда система/прошивка записывают сектор 0.5 KiB, диск фактически считывает весь физический сектор 4 KiB, модифицирует данные на его восьмой части и записывает весь сектор 4 KiB.

Может показаться, что это сильно снижает производительность, так как по сути каждая операция ввода-вывода оперирует размером данных в восемь раз больше видимого размера. К счастью, существует способ скрыть эти потери производительности: многие операционные системы всё равно предпочитают выполнять основную часть операций ввода-вывода над блоками, размеры которых кратны 4 KiB. Например, вся подкачка страниц на системах архитектуры x86 выполняется блоками, кратными 4 KiB. Кроме того, многие операционные системы, включая Windows NT и Solaris, используют механизм подкачки для обычного файлового ввода-вывода. Таким образом, обычно операционная система за одну операцию ввода-вывода считывает и записывает блоки, кратные восьми секторам размера 0.5 KiB.

Поэтому нужно, чтобы эти блоки непрерывно следовали друг за другом, и их границы совпадали с границами физических секторов диска, размер которых 4 KiB. "Естественные" границы блоков файловой системы должны совпадать со скрытыми границами секторов внутри диска. Восемь секторов по 0.5 KiB, которыми оперируют команды системы, не должны растягиваться на два или более физических сектора по 4 KiB - они должны составлять ровно один сектор и внутри этого сектора располагаться в правильном порядке.

Стоит заметить, что некоторые пользователи, измерившие падение производительности, вызванное тем, что разделы на 512-эмуляционных дисках не были выровнены по границе 4 KiB, с удивлением обнаружили, что производительность снизилась довольно существенно. Забавно, что цифры, которые они получили, были меньше, чем те восемь раз, которые теоретически должны возникнуть из-за того, что каждый запрос к 0.5 KiB превращается в запрос к 4 KiB, так что они наоборот должны были удивиться тому, насколько малым оказалось это снижение. Причиной того, что на практике производительность падает не так сильно, является кластеризация, как её принято называть в мире BSD - по крайней мере, в контексте подкачки при операциях ввода-вывода. При кластеризации несколько отдельных запросов на чтение/запись к смежным блокам диска объединяются в один, охватывающий все блоки в одной команде ввода-вывода, передаваемой устройству хранения данных. Это позволяет снизить количество обращений контроллера к секторам по 4 KiB и таким образом снижает накладные расходы.

Выравнивание по границам, кратным 4 KiB, достигается тремя способами:

    ▪ Выравнивание границ разделов по 4 KiB относительно начала диска: номер сектора начала и конца каждого раздела представляет собой целое число, кратное 4 KiB от начала диска.
    ▪ Выравнивание структур данных внутри тома по границам 4 KiB относительно начала раздела. Если формат тома использует концепцию зон (групп цилиндров и т.п.), как это бывает на томах с файловыми системами UFS или Ext2/3/4, эти зоны должны иметь целочисленный размер, кратный 4 KiB. Файловые системы FAT и NTFS не оперируют зонами, но при форматировании раздела в FAT общий размер файловых таблиц и зарезервированных секторов в начале тома должен быть целым и кратным 4 KiB, так чтобы кластеры с данными, следующие за ними, также были выровнены по границам, кратным 4 KiB.
    ▪ Целочисленный размер кластера файловой системы - логической единицы хранения данных, - кратный 4KiB.

На самом деле, как подметил Род Смит в своей статье ( http://rodsbooks.com./gdisk/advice.html#alignment), утилиты разметки дисков от Microsoft в настоящее время (2011 год) по умолчанию выравнивают границы разделов кратно 1MiB, что не имеет под собой никаких оснований. Времена, когда 1 Mib можно было рассматривать как (32 сектора) х (64 головки), давно прошли. Хотя по причинам, описанным выше, такой подход не имел смысла даже в то время, поскольку эта геометрия не соответствовала физической геометрии самого диска. Единственная причина использования для выравнивания размера 1 MiB вместо 4 KiB, который действительно соответствует физическому размеру сектора внутри диска, заключается в том, что при таком размере утилиты, отображающие положение и размер дисковых разделов в Мебибайтах, показывают целые числа. Иными словами, измерение границ и размеров разделов в единицах по 4 KiB оказалось излишне точным для пользователей, которые обычно не работают с разделами меньше Гибибайта при разметке диска.

    Выравнивание разделов на дисках, размеченных старыми утилитами


К сожалению, версии утилит fdisk и Disk Msnsger от Microsoft, которые были до 2008 года, а также текущая версия fdisk в линукс (текущая - это на 2011 год) по умолчанию не выравнивали границы разделов кратно 4 KiB по той простой причине, что (фальшивая) геометрия, которую использовало большинство дисков (размером больше 7,87GB, разумеется) предполагала, что на дорожке 63 сектора. Поэтому те старые глупые утилиты выравнивали разделы кратно шестидесяти трём секторам. Они начинали первый основной раздел с нулевого цилиндра, первой головки, первого сектора, а номер логического блока диска был 63, и весь раздел выравнивался по нечётному номеру сектора.

Таким образом, диски, размеченные старыми версиями утилит, надо переразбить, скорректировав размеры разделов. Границы разделов нужно сдвинуть в большую или меньшую сторону, так чтобы они начинались с целых чисел, кратных 4 KiB или  1 MiB. Если они были выровнены с учётом того, что на дорожке 63 сектора, то обычно между разделами или в начале/конце диска, если диск разбит с таблицей MBR, есть свободное место, чтобы выровнять разделы кратно 4 KiB. Это довольно длительный процесс, так как надо считать, а затем записать данные с каждого сектора на всех разделах, границы которых будут сдвигаться.