Я полностью новичок в ZFS, поэтому для начала я решил сделать несколько простых тестов, чтобы понять, как он себя ведет. Я хотел раздвинуть границы его производительности, поэтому я подготовил i2.8xlarge
экземпляр Amazon EC2 (почти 7 долларов в час, время действительно деньги!). Этот экземпляр имеет 8 800 ГБ SSD.
Я сделал fio
тест на самих SSD и получил следующий вывод (обрезанный):
$ sudo fio --name randwrite --ioengine=libaio --iodepth=2 --rw=randwrite --bs=4k --size=400G --numjobs=8 --runtime=300 --group_reporting --direct=1 --filename=/dev/xvdb
[trimmed]
write: io=67178MB, bw=229299KB/s, iops=57324, runt=300004msec
[trimmed]
57K IOPS для случайной записи 4K. Респектабельный.
Затем я создал том ZFS, охватывающий все 8. Сначала у меня был один raidz1
vdev со всеми 8 твердотельными накопителями, но я прочитал о причинах, которые mirror
ухудшают производительность, поэтому я получил четыре vdevs, например:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi
$ sudo zpool list -v
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
testpool 2.91T 284K 2.91T - 0% 0% 1.00x ONLINE -
mirror 744G 112K 744G - 0% 0%
xvdb - - - - - -
xvdc - - - - - -
mirror 744G 60K 744G - 0% 0%
xvdd - - - - - -
xvde - - - - - -
mirror 744G 0 744G - 0% 0%
xvdf - - - - - -
xvdg - - - - - -
mirror 744G 112K 744G - 0% 0%
xvdh - - - - - -
xvdi - - - - - -
Я установил размер записи на 4K и провел свой тест:
$ sudo zfs set recordsize=4k testpool
$ sudo fio --name randwrite --ioengine=libaio --iodepth=2 --rw=randwrite --bs=4k --size=400G --numjobs=8 --runtime=300 --group_reporting --filename=/testpool/testfile --fallocate=none
[trimmed]
write: io=61500MB, bw=209919KB/s, iops=52479, runt=300001msec
slat (usec): min=13, max=155081, avg=145.24, stdev=901.21
clat (usec): min=3, max=155089, avg=154.37, stdev=930.54
lat (usec): min=35, max=155149, avg=300.91, stdev=1333.81
[trimmed]
Я получаю только 52K IOPS для этого пула ZFS. Это на самом деле немного хуже, чем один SSD.
Я не понимаю, что я делаю здесь не так. Я неправильно настроил ZFS или это плохой тест производительности ZFS?
Обратите внимание, что я использую официальный 64-битный образ CentOS 7 HVM, хотя я обновил ядро 4.4.5 elrepo:
$ uname -a
Linux ip-172-31-43-196.ec2.internal 4.4.5-1.el7.elrepo.x86_64 #1 SMP Thu Mar 10 11:45:51 EST 2016 x86_64 x86_64 x86_64 GNU/Linux
Я установил ZFS из репозитория zfs, указанного здесь . У меня версия 0.6.5.5 zfs
пакета.
ОБНОВЛЕНИЕ : предложение Per @ ewwhite я попробовал ashift=12
и ashift=13
:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=12 -f
и
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=13 -f
Ничто из этого не имело никакого значения. Из того, что я понимаю, последние биты ZFS достаточно умны, идентифицируя 4K SSD и используя разумные значения по умолчанию.
Однако я заметил, что загрузка процессора резко возрастает. @ Тим предложил это, но я отклонил его, однако, думаю, я не наблюдал за процессором достаточно долго, чтобы это заметить. В этом случае примерно 30 процессорных ядер, а загрузка процессора достигает 80%. Голодный процесс? z_wr_iss
много примеров этого.
Я подтвердил, что сжатие выключено, поэтому это не двигатель сжатия.
Я не использую raidz, поэтому это не должно быть вычисление четности.
Я сделал, perf top
и это показывает большую часть времени ядра, проведенного _raw_spin_unlock_irqrestore
в z_wr_int_4
и osq_lock
в z_wr_iss
.
Теперь я считаю, что в этом узком месте производительности есть компонент ЦП, хотя я не приблизился к тому, чтобы выяснить, что это может быть.
ОБНОВЛЕНИЕ 2 : Согласно @ewwhite и другим предположениям, что именно виртуализированная природа этой среды создает неопределенность производительности, я использовал ее fio
для сравнения случайных записей 4K, распределенных по четырем SSD в среде. Каждый SSD дает ~ 55K IOPS, поэтому я ожидал около 240K IO для четырех из них. Это более или менее то, что я получил:
$ sudo fio --name randwrite --ioengine=libaio --iodepth=8 --rw=randwrite --bs=4k --size=398G --numjobs=8 --runtime=300 --group_reporting --filename=/dev/xvdb:/dev/xvdc:/dev/xvdd:/dev/xvde
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=8
...
randwrite: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=8
fio-2.1.5
Starting 8 processes
[trimmed]
write: io=288550MB, bw=984860KB/s, iops=246215, runt=300017msec
slat (usec): min=1, max=24609, avg=30.27, stdev=566.55
clat (usec): min=3, max=2443.8K, avg=227.05, stdev=1834.40
lat (usec): min=27, max=2443.8K, avg=257.62, stdev=1917.54
[trimmed]
Это ясно показывает, что виртуализированная среда может поддерживать IOPS намного выше, чем я вижу. Что-то в том, как реализован ZFS, не дает ему достичь максимальной скорости. Я просто не могу понять, что это такое.