FreeBSD‎ > ‎

GEOM: gnop

Данный раздел появился в момент написания Тестируем производительность ZFS и UFS

Поскольку "узким местом" в производительности операций чтения/записи файловой системы с диском с 4КБ-сектором является именно то, что для ФС диск представляется с сектором 512Б и вся конвертация по прежнему осуществляется контроллером диска. "Выравнивание" разделов диска лишь помогает не совершать двойной работы контроллеру...

Радикальным решением было бы указать системе, что она работает с диском, размер сектора у которого равен 4КБ. Таким образом, это позволило бы контроллеру не вычислять реальное расположение сектора, а получать его от самой файловой системы. Это сэкономило бы ресурсы и увеличило бы производительность, не правда ли?

Так как на момент написания данной статьи я уже "переезжал" полностью на ZFS, соответственно и решения искал для данной системы...

Оказывается, в момент создания ZFS-пула, файловая система определяет геометрию диска (это очевидно), и в свойства пула прописывается соответствующее значение параметра ashift (по умолчанию ashift=9).
2 в 9-й степени равняется 512 (Байтам), соответственно 4КБ - это 2 в 12-й степени, и, соответственно, правильное значение для диска с 4КБ-сектором: ashift=12
Теперь дело за малым - при создании пула указать ZFS на "правильную" геометрию диска ;)

На помощь к нам приходит утилита gnop (класс GEOM).
Что делаем...
Создаем средствами gnop нужную нам геометрию для конкретного диска и при создании пула явно на нее указываем:
# gnop create -S 4096 ada2p1 
# zpool create fastpool ada2p1.nop

Проверяем:
# zdb

fastpool:
    version: 28
    name: 'fastpool'
    state: 0
    txg: 4
    pool_guid: 239791367867599430
    hostid: 583787004
    hostname: 'server'
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: 239791367867599430
        create_txg: 4
        children[0]:
            type: 'disk'
            id: 0
            guid: 405940510377874608
            path: '/dev/ada2p1.nop'
            phys_path: '/dev/ada2p1.nop'
            whole_disk: 1
            metaslab_array: 30
            metaslab_shift: 30
            ashift: 12
            asize: 1000199946240
            is_log: 0
            create_txg: 4
tank:
    version: 28
    name: 'tank'
    state: 0
    txg: 14
    pool_guid: 7375787794159938505
    hostname: ''
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: 7375787794159938505
        children[0]:
            type: 'disk'
            id: 0
            guid: 5044613908955342838
            path: '/dev/ada0p3'
            phys_path: '/dev/ada0p3'
            whole_disk: 1
            metaslab_array: 30
            metaslab_shift: 31
            ashift: 9
            asize: 1996096798720
            is_log: 0
            create_txg: 4


Затем делаем экспорт пула, удаляем созданный файл геометрии для диска, импортируем пул обратно:
# zpool export fastpool
# gnop destroy ada2p1.nop
# zpool import fastpool


P.S.: На самом деле не обошлось без бубна... Оказалось, что у меня не загружен в память соответствующий модуль ядра для работы с gnop.
Пришлось пересобрать ядро с соответствующим внешним модулем - добавить в конфиг ядра в опцию MODULES_OVERRIDE="/geom/geom_nop" (у меня там еще присутствуют и другие модули, добавляются через пробел...)
А затем, после установки нового ядра и перезагрузки компьютера, загружаем необходимый нам модуль:
# kldload geom_nop.ko

После этого можно начинать все вышеперечисленные действия по созданию геометрии диска...

Comments