Выравнивание разделов диска

Материал из LORWiki
Перейти к навигацииПерейти к поиску

Теория[править]

Термины[править]

  • Сектор — минимальная адресуемая единица хранения информации на дисковых запоминающих устройствах.
  • Блок — размер данных, установленный для обмена с блочным устройством.

Важно, что размер сектора определяется оборудованием (например, диск сообщает ОС, что размер сектора — 512 байт), а размер блока — операционной системой ( например, размер блока установим в 8 секторов)

  • Раздел — как disk volume, так и logical volume и любой контейнер для хранения данных (зашифрованный диск, например). Может быть, кто-нибудь сформулирует точнее.

Суть проблемы[править]

Без выравнивания разделов скорость работы с диском ниже (иногда — намного ниже) ожидаемой.

Например:

  • Не используется ни LVM, ни аппаратный рейд, ни какой-либо ещё способ виртуализации дисковой подсистемы, размер блока ext3 — 4K, WD20EARS (в нем используется advanced format в терминологии WesternDigital).
  • Если раздел начинается с сектора 63, скорость записи падает на 30 % по сравнению с разделом, начинающимся с сектора 2048.

История проблемы[править]

Выравнивать разделы начали задолго до того, как эта проблема коснулась домашнего пользователя — аппаратные рейды, виртуализация, SAN-диски требовали грамотной настройки. Но после того, как размер обычного домашнего жёсткого диска дошёл до 2 Тб, выравнивание блоков данных попало в область внимания хомячков.

По сомнительным historical reason (соображениям совместимости со всяким хламом вроде Windows 98), разделы диска до сих пор выравниваются по так называемой границе цилиндра (см. геометрия жёсткого диска (википедия), и число секторов в разделе должно быть кратно 63. Хотя это давно не соответствует реальной геометрии диска, которая прячется от нас электроникой жёсткого диска.

Диски большой ёмкости имеют размер сектора 4096 байт вместо обычных 512, но в целях совместимости со старыми ОС представляются как диски с размером сектора 512 байт. И если размер блока файловой системы больше логического 512-байтного сектора, при записи мы получаем проблему: один блок ФС расположен на двух физических секторах диска. Частично это компенсируется электроникой и буфером жёсткого диска, но производительность всё равно падает.

Это о «домашней» проблеме. То же самое справедливо для выравнивания блоков и страйпов RAID-массива, блоков диска host-системы и т. д.

А в случае использования SSD дисков отсутствие выравнивания ещё и быстрее расходует лимит на запись блока SSD.

В результате, разделы больше нельзя выравнивать по границе цилиндров. Тогда по какой границе?

  1. Граница разделов должна быть кратной 4 КиБ, из-за дисков с размером сектора 4096.
  2. Размер GPT — 33 сектора, поэтому если мы не хотим каждый раз вспоминать, какая же у нас разметка — dos или GPT — нужно начинать первый раздел не ранее 34 сектора.
  3. В SSD дисках минимальная стираемая единица информации зависит от производителя, но как правило 128 КиБ, поэтому если мы не хотим каждый раз вспоминать, что у нас за диск … К тому же, программы для разметки диска тем более не обязаны знать все моделиwut?.
  4. Желательно, чтобы при использовании аппаратного RAID у нас тоже не возникало проблем, а там размер chunk бывает разный, нередко и 512 КиБ.

Откуда взялась цифра 1 МиБ, я так и не нашёл. Есть мнение, что это мнение Microsoft (http://support.microsoft.com/kb/929491), ставшее неофициальным стандартом.

Производительность[править]

Доработка.jpg
Данная статья или раздел ещё не завершены
Кто-то посчитал, что статья или раздел ниже не содержит какой-то важной информации или имеет проблемы с вёрсткой/текстом. Указана причина: в разделе много текста как жизни на Марсе.


Практика: Выравниваем данные[править]

Оно мне надо?[править]

  • Если скорость работы жёсткого диска устраивает, всё бросать и переразбивать диск не стоит.
  • Если диск новый и вы приступили к разметке, обязательно выравнивайте разделы по границе 1 МиБ.
  • Диск новый, а скорость намного ниже ожидаемой. Тогда переразбить стоит, но нужен полный бекап всех данных.

Проверить скорость записи (если диск не Advanced Format) можно так: если подозреваемый раздел смонтирова в /home/, запишем туда 100 Мб файл (лучше больше) и посмотрим скорость

dd if=/dev/zero of=/home/test.raw bs=128k count=800 oflag=direct

Если в выводе

fdisk -lu /dev/sda | grep '^\/' | while read disk start other; do
    if [ ! "$((  $start % 2048 ))" -eq "0" ]; then
        echo "$disk not aligned";
    fi;
done

Есть строки вида

/dev/sda1 not aligned

То раздел не выровнен.

Или через parted:

vasya@motherpc:~# parted /dev/sda align-check opt 1
1 aligned

Выравнивание разделов[править]

Итак, разделы нужно выравнивать по границе 1 МиБ, т. е. по границе 2048 секторов. Т. е. первый раздел начинается с 2048 сектора.

fdisk[править]

Для создания выравненных разделов через fdisk нужно использовать ключи -c и -u.

fdisk -c -u /dev/sdc

Если дистрибутив старый и fdisk не понимает ключ -u, использовать один -c, но число секторов рассчитывать вручную, например, через bash.

Пример ручного расчёта: нужно создать первый раздел размером 100 МиБ

Начало раздела

echo $(( 2048 * 1 ))

Конец раздела

echo $(( 2048 * ( 1 + 100 ) - 1 ))

parted[править]

Для создания выравненных разделов через parted нужно использовать параметр -a optimal.

parted -a optimal

Метаданные ФС, LVM и т. п.[править]

При использовании LVM, software raid и т. п., на разделе А создаётся раздел Б (меньшего размера) и плюс на разделе А хранятся метаданные. Эти метаданные и способ организации нового раздела также нужно учитывать для выравнивания данных.

Если метаданные расположены в конце раздела А, они не влияют на смещение раздела Б и, соответственно, на выравнивание данных на разделе Б.

Software raid[править]

  • Метаданные: зависит от версии метаданных (определяется при создании рейда)
    • 1.0 — в конце диска;
    • 1.1 — в начале диска;
    • 1.2 — в 4 КиБ от начала диска.
Доработка.jpg
Данная статья или раздел ещё не завершены
Кто-то посчитал, что статья или раздел ниже не содержит какой-то важной информации или имеет проблемы с вёрсткой/текстом. Указана причина: нужно уточнить, можно ли явно задать границу выравнивания данных.


Не нашёл в man mdadm. Проверил на практикеwut?. md4 — software raid, metadata v1.2, один из дисков рейда — sde.

Ищём что-нибудь уникальное среди данных

# hexdump /dev/md4 -C | head -n 5
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200  4c 41 42 45 4c 4f 4e 45  01 00 00 00 00 00 00 00  |LABELONE........|

Теперь то же самое — на одном из дисков массива

# dd if=/dev/sde bs=1M count=100 | hexdump -C | grep LABELONE
00100200  4c 41 42 45 4c 4f 4e 45  01 00 00 00 00 00 00 00  |LABELONE........|
100+0 записей считано
100+0 записей написано
 скопировано 104857600 байт (105 MB), 1,49776 c, 70,0 MB/c

Проверяем (для примера — двумя способами :-)

# echo $((0x100000))
1048576
# echo $((512*2048))
1048576
# echo 'obase=16;512*2048' | bc
100000

Данные в software raid c metadata 1.2 начинаются с 1 МиБ, т. е. выровнены.

LVM[править]

  • Метаданные: в начале раздела

Выравнивание данных задаётся ключём --dataalignment при создании PV:

pvcreate --dataalignment=1M /dev/sdc1

Проверяем через pvs:

 # pvs -o+pe_start /dev/sdc1
 PV         VG   Fmt  Attr PSize   PFree   1st PE
 /dev/sdc1       lvm2 a-   100,00m 100,00m   1,00m

LUKS[править]

  • Метаданные: в начале раздела

При создании LUKS, выравнивание данных относительно начала раздела задаётся в явном виде, через параметр

  • --align-payload <количество секторов>

Т. е. при создании раздела

cryptsetup --align-payload 2048 luksFormat /dev/mapper/vgdata-lvcrypt

Данные будут выравниваться по границе 1 МиБ относительно начала /dev/mapper/vgdata-lvcrypt Проверять через

cryptsetup luksDump /dev/mapper/vgdata-lvcrypt | grep Payload

Смотрите также[править]