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 дисков, и у меня есть следующие вопросы:
- Эти диски
4k drives
? (спрашиваю, потому что размер физического сектора равен 4 КБ, но логическим считается 512b) - что рекомендуется
gpart
для вышеупомянутых дайверов, чтобы получитьcorrect alignment
(Хочу создать одинfreebsd-zfs
раздел) - Здесь есть настройка 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.