диски с сектором 4k и zfs
Применимость: Solaris
Слова для поиска:
Задача:
По умолчанию Solaris пытается организовать работу с дисками на основе размера блока 512 байт. Как настроить на использование блоков 4Kb.
Решение:
В последующие несколько лет индустрия в сфере хранения данных перейдет от производства жестких дисков с размером сектора в 512 байт на производство дисков с секторами, размером в 4096 байт (также известных как секторы 4 КБ или «4K»). Этот переход определяется несколькими факторами. К ним относятся в т.ч. и повышение уровня плотности записи информации на запоминающее устройство, а также и его надежность. Этот переход приводит к проблемам и несовместимостям с существующим программным обеспечением (включая операционные системы и приложения).
В случае дисков с размером сектора 4K для большинства файловых систем достаточно разбить диски так, чтобы каждый раздел начинался с целого числа 4K секторов. Последние версии операционных систем Windows это делают автоматически.
У диска есть два параметра - логический размер сектора и физический. На сегодня почти все модели 4K дисков сообщают о 512 байт логическом секторе. Это сделано для совместимости. А вот по поводу размера физического сектора единообразия нет. Первые модели сплошь сообщали о 512 секторе. Сегодня всё большее моделей, сообщающих действительный размер сектора. В результате у компьютера нет достоверного способа узнать размер физического сектора диска и этот размер ему следует сообщить.
Можно ли создать zfs пул на дисках без учёта физического 4K сектора? Можно, и даже будет вполне пристойно работать. Но производительность несколько упадёт, а нагрузка на диск увеличится. Прежде всего потому, что для записи одного 512 сектора понадобится прочитать 4K сектор, заменить содержимое одного из 512б блоков и записать результат. Это намного дольше, чем запись 4K сектора, так как придется ждать целый оборот диска.
В реальности запись одиночного сектора встречается не так часто, тк zfs стремится оптимизировать ввод-вывод за счёт кеширования. И падение производительности зависит от набора файлов. В целом - мельче файлы - больше деградация производительности.
Определение размера сектора
В выводе этой команды:
echo ::sd_state | mdb -k | egrep '(^un|_blocksize)'
Вы можете увидеть нечто вроде этого (В этом примере мы видим диск который эмулирует сектор 512 байт):
un 26: ffffff1e1496b380 un_sys_blocksize = 0x200 un_tgt_blocksize = 0x200 un_phy_blocksize = 0x1000
- 0x200 соотвествует размеру сектора 512 байт
- 0x1000 соотвествует размеру сектора 4 килобайта.
Как определить что это за диск?
Например un 26 соотвествует диску sd26
А где можно увидеть имена дисков такого типа?
iostat -Er | grep -A1 sd26 sd26 ,Soft Errors: 0 ,Hard Errors: 8 ,Transport Errors: 0 Vendor: SmrtStor ,Product: TXA2D20100GA9001 ,Revision: K311 ,Serial No: FG0055EA
Для принудительного указания системе размера блока для конкретного устройства в файл /kernel/drv/sd.conf надо добавить параметр с указанием размера сектора для диска.
sd-config-list = "VENDOR PRODUCT", physical-block-size:4096;
Вместо «VENDOR PRODUCT» надо использовать идентификационную строку дисков.
Например:
/kernel/drv/sd.conf
sd-config-list = "SEAGATE ST3300657SS", "physical-block-size:4096", "SmrtStor TXA2D20100GA9001", "physical-block-size:4096", "DGC RAID", "physical-block-size:4096", "NETAPP LUN", "physical-block-size:4096";
После внесения изменений надо перечитать параметры драйвера командой:
update_drv -vf sd
Будет сообщение об ошибке - Cannot unload module: sd. Не волнуйтесь об ошибках. Новые параметры не вступят в силу до тех пор, пока нынешний диск подключен, поэтому мы должны сделать ему unattach и reattach
Пролистать диски: cfgadm -al | grep disk с13::dsk/c13t50011731001B157A disk connected configured unknown c13::dsk/c13t50011731001B159E disk connected configured unknown
И затем для каждого диска:
cfgadm -c unconfigure с13::dsk/c13t50011731001B157A cfgadm -c configure с13::dsk/c13t50011731001B157A
Пул ZFS придется пересоздать. Сперва надо
Смотрите также:
Актуальность: 2014/07/31 10:42