4k жестких дисков freebsd gpart и zfs

У меня 3 жестких диска, со следующим camcotrol идентифицировать.

root@cirmos:/root # camcontrol identify ada1
pass2: <WDC WD10EZEX-00RKKA0 80.00A80> ATA-8 SATA 3.x device
pass2: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)

protocol              ATA/ATAPI-8 SATA 3.x
device model          WDC WD10EZEX-00RKKA0
firmware revision     80.00A80
serial number         WD-WMC1S4587539
WWN                   50014ee003930f6e
cylinders             16383
heads                 16
sectors/track         63
sector size           logical 512, physical 4096, offset 0
LBA supported         268435455 sectors
LBA48 supported       1953525168 sectors
PIO supported         PIO4
DMA supported         WDMA2 UDMA6 

Feature                      Support  Enabled   Value           Vendor
read ahead                     yes  yes
write cache                    yes  yes
flush cache                    yes  yes
overlap                        no
Tagged Command Queuing (TCQ)   no   no
Native Command Queuing (NCQ)   yes      32 tags
SMART                          yes  yes
microcode download             yes  yes
security                       yes  no
power management               yes  yes
advanced power management      no   no
automatic acoustic management  no   no
media status notification      no   no
power-up in Standby            yes  no
write-read-verify              no   no
unload                         no   no
free-fall                      no   no
data set management (TRIM)     no
root@cirmos:/root # 

как видно выше, размер сектора определяется как:

sector size           logical 512, physical 4096, offset 0

Вот уже несколько тем по тюнингу дисков 4к. Я хочу создать ZFS (raidz) из 3 дисков, и у меня есть следующие вопросы:

  1. Эти диски 4k drives? (спрашиваю, потому что размер физического сектора равен 4 КБ, но логическим считается 512b)
  2. что рекомендуется gpart для вышеупомянутых дайверов, чтобы получить correct alignment (Хочу создать один freebsd-zfs раздел)
  3. Здесь есть настройка Zpool, что я должен рассмотреть? (root, system и swap не должны быть в указанных выше дисках - эти диски предназначены только для "чистого" хранения файлов (и домашних каталогов).

2 ответа

Решение

Начиная с пункта 2; во всех передовых практиках ZFS должна "питаться" целыми дисками для управления. Никакого специального разделения не требуется.

Что касается всего остального:

Эта ссылка имеет много полезных советов, некоторые из которых я повторю.

Каждый vdev (как зеркало или raidz) имеет один ashift. ashift=9 - 512 байт секторов, ashift=12 - 4 тыс. секторов. (рассчитывается как 2^ashift= размер сектора)

Для обеспечения совместимости в будущем без необходимости уничтожения и повторного создания пула, как правило, рекомендуется использовать ashift = 12 независимо от реальных возможностей диска (поскольку его нельзя изменить после создания vdev).

По ссылке:

# gnop create -S 4096 ada0
# zpool create tank raidz ada0.nop ada1 ada2
# zdb | grep ashift
     ashift: 12

Команда gnop создает устройство принудительного сквозного выравнивания 4k для ada0 как ada0.nop. Затем создается пул. ZFS будет использовать ashift = 12 для всего vdev. После создания пула /vdev рекомендуется избавиться от устройства ada0.nop passthrough.

# zpool export tank
# gnop destroy ada0.nop
# zpool import tank

Теперь пул будет импортироваться с устройств ada0, ada1 и ada2. И у него все еще будет заблокированный ashift = 12, с которым он был создан.

Вот и все. С ZFS, управляющей целыми дисками, вы настроены и готовы к работе.

Это 4k диски? Да, вы можете видеть, что они сообщают 4096 байт физических данных, что является индикатором для этого. Логическая отчетность в 512 байт является результатом попытки производителей дисков обеспечить обратную совместимость (и, таким образом, приводит к путанице).

gpart? В вашей ситуации я использовал бы следующие команды, чтобы отделить диск:

# -- Force ashift to be at least 12
sysctl vfs.zfs.min_auto_ashift=12;

# -- Create GPT tables
gpart create -s gpt ada0 &&
gpart create -s gpt ada1 &&
gpart create -s gpt ada2;

# -- Create paritions, align start/stop to 1 MiB boundaries
gpart add -a 1m -t freebsd-zfs -l disk0 ada0 && 
gpart add -a 1m -t freebsd-zfs -l disk1 ada1 && 
gpart add -a 1m -t freebsd-zfs -l disk2 ada2;

# -- Not needed under FreeBSD 10.1 but sometimes is on
#    older versions to get /dev/gpt to update.
#    Run if you don't see /dev/gpt/disk0 etc devices:
true > /dev/ada0; true > /dev/ada1; true > /dev/ada2;

# -- Create temporary GNOP 4k devices
gnop create -S 4k /dev/gpt/disk0 &&
gnop create -S 4k /dev/gpt/disk1 &&
gnop create -S 4k /dev/gpt/disk2;

# --  Create the zpool
zpool create -f -m /mnt zstorage raidz /dev/gpt/disk0.nop /dev/gpt/disk1.nop /dev/gpt/disk2.nop;

# -- Export
zpool export zroot;

# -- Remove temproary GNOP devices
gnop destroy /dev/gpt/disk0.nop &&
gnop destroy /dev/gpt/disk1.nop &&
gnop destroy /dev/gpt/disk2.nop;

# -- Bring back pool with "real" devices
zpool import -d /dev/gpt zstorage;

# -- Check status
zpool status;

# -- Verify ashift is 12
zdb | grep ashift

У gpart-ing нет никаких проблем производительности или недостатков, о которых мы знаем или видели. Мы развернули это на десятках производственных площадок на протяжении многих лет. Это также дает следующие преимущества:

  • Вы можете пометить (-l) разделы (то есть, disk0, disk1), чтобы вы знали, какие диски являются какими, даже если их номера портов изменяются (то есть ada0 не всегда может быть disk0). gpart show -l покажет таблицу GPT с этими метками.
  • While not applicable to you, it lets you boot off ZFS and also have swap partitions (ie using GMIRROR) on the same disks.
  • Due to 1 MiB alignment, you end up with a little bit of free space at the end of the disk because your partition is rounded to 1 MiB. This avoids a situation where you replace a drive with a different vendor and it ends up being ever-so-slightly smaller and thus unusable.

You'll also notice the first thing above is to do sysctl vfs.zfs.min_auto_ashift=12; and the last thing is check that value. Under ZFS ashift=9 is the default which is appropriate for 512 byte disks but for 4k disks you'd see write amplification and loss of performance, similar in effect but not in cause due to partition misalignment. We've seen where, for unknown reasons, ZFS does not pick ashift=12 automatically even with GNOP so this forces the issue. This page describes the whole thing nicely: http://savagedlight.me/2012/07/15/freebsd-zfs-advanced-format/

Tuning? Зависит от вашей рабочей нагрузки. We now enable LZ4 compression on all new deployments as it has proven to have negligible overhead at worst and at best increases performance drastically for compressible files.

# -- Set compresison on
zfs set compression=lz4 zstorage;

# -- See compression performance
zfs get used,compressratio,compression,logicalused zstorage;

The only "down side" is that this will affect benchmarking, bonnie++ will report some insane(ly awesome) numbers when this is turned on that likely don't reflect real-world performance. То же самое с dd if=/dev/zero of=test.dat style benchmarking.

Другие вопросы по тегам