Parted: The resulting partition is not properly aligned for best performance
Тем кто сталкивался с разметкой емких дисковых подсистем знакома утилита parted. Для тех кто читает про нее впервые поясню – утилита fdisk или cfdisk не умеют работать с дисковыми подсистемами емкостью >2Tb, о чем честно и пишут:
1 2 3 4 |
WARNING: The size of this disk is 8.0 TB (5977503172608 bytes). DOS partition table format can not be used on drives for volumes larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID partition table format (GPT). |
Соответственно при помощи утилиты parted мы можем сделать 2-е базовые вещи:
- Изменить тип таблицы разделов с MBR на GPT
- Разметить дисковую подсистему на нужное количество разделов
Указанным функционалом возможности данной утилиты не ограничиваются, более подробно познакомиться с ней вы можете прочтя документацию доступную по ссылке.
Но вернемся к сообщению указанному в заголовке заметки. Это сообщение выводится в случае если при разметке parted считает что вы указали неправильные значения для начала и конца раздела, например:
1 |
(parted) mkpart primary 0 5000G |
И из-за этого данные, которые будут записываться или читаться с диска, будут размещены не самым оптимальным способом. Данная проблема возникла в связи с переходом производителей жестких дисков на другой размер секторов, а именно с 512B на 4KB, и в связи с этим, если при разметке диск указать неправильный стартовый сектор для раздела, то может получиться ситуация, когда один логический блок данных в 512B будет записан сразу на два 4KB сектора, которые будут прочитаны контроллером жесткого диска при запросе на выборку данных, что в итоге приводит к снижению производительности всей дисковой подсистемы. Более подробно очень детально описана данная ситуация на сайте Seagate.
Так чем же нам может помочь утилита parted для решения описанной проблемы – у ней есть встроенный функционал для расчета оптимального начального смещения для корректного выравнивания границ разделов. Настроить логику работы данного функционала можно при помощи ключа “-a”, более подробно можно прочитать в документации.
Данный функционал работает по следующей логике:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
The heuristic parted uses is: 1) Always use the reported 'alignment_offset' as the offset for the start of the first primary partition. 2a) If 'optimal_io_size' is defined (not 0) align all partitions on an 'optimal_io_size' boundary. 2b) If 'optimal_io_size' is undefined (0) and 'alignment_offset' is 0 and 'minimum_io_size' is a power of 2: use a 1MB default alignment. - as you can see this is the catch all for "legacy" devices which don't appear to provide "I/O hints"; so in the default case all partitions will align on a 1MB boundary. - NOTE: we can't distinguish between a "legacy" device and modern device that provides "I/O hints" with alignment_offset=0 and optimal_io_size=0. Such a device might be a single SAS 4K device. So worst case we lose < 1MB of space at the start of the disk. |
Где указанные параметры – это значения в sysfs привязанные к дисковой подсистеме или конкретному разделу, например:
1 2 3 4 5 6 7 8 |
sysfs interface --------------- /sys/block/<disk>/alignment_offset /sys/block/<disk>/<partition>/alignment_offset /sys/block/<disk>/queue/physical_block_size /sys/block/<disk>/queue/logical_block_size /sys/block/<disk>/queue/minimum_io_size /sys/block/<disk>/queue/optimal_io_size |
Поэтому для решения указанной в заголовке проблемы, вы можете посчитать номер стартового сектора в ручном режиме по формуле и указать его в parted:
1 |
startsector = optimal_io_size / physical_block_size |
1 |
(parted) mkpart primary ext4 startsector -1s |
Либо довериться аналогичному алгоритму встроенному в утилиту:
1 |
(parted) mkpart primary ext4 0% 100% |
В случае если ошибка не возникнет и раздел будет размечен можете считать что вы все сделали правильно и у вас правильно произведено выравнивание блоков на дисковой подсистеме.
comments powered by HyperComments