Я абсолютно новачок у ZFS, тому для початку я подумав, що буду робити прості орієнтири на ньому, щоб зрозуміти, як він себе веде. Мені хотілося просунути межі його продуктивності, тому я передбачив i2.8xlarge
екземпляр Amazon EC2 (майже $ 7 / год, час справді - гроші!). Цей примірник має 8 800 ГБ SSD-дисків.
Я зробив fio
тест на самих жорстких дисках і отримав наступний вихід (оброблений):
$ 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 SSD-дисками, але я читав про причини, які це погано для продуктивності, тому я закінчив чотири 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]
У цьому пулі ZFS я отримую лише 52K IOPS. Це насправді трохи гірше, ніж сам 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 repo . У мене версія 0.6.5.5 zfs
пакета.
UPDATE : Пер @ 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-диски та використовувати розумні за замовчуванням.
Однак я помітив, що використання процесора скорочується. @Tim запропонував це, але я відхилив це, проте, я думаю, що не спостерігав процесор досить довго, щоб помітити. У цьому випадку є приблизно 30 ядер CPU, а використання процесора зростає до 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, тому я очікував десь близько 240 К 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, це утримувати його від досягнення максимальної швидкості. Я просто не можу зрозуміти, що це таке.