Colobridge WIKI

диски с сектором 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 придется пересоздать. Сперва надо