Soy completamente nuevo en ZFS, así que, para empezar, pensé en hacer algunos puntos de referencia simples para tener una idea de cómo se comporta. Quería superar los límites de su rendimiento, así que aprovisioné una i2.8xlarge
instancia de Amazon EC2 (casi $ 7 / hora, ¡el tiempo realmente es dinero!). Esta instancia tiene 8 SSD de 800 GB.
Hice una fio
prueba en los SSD y obtuve el siguiente resultado (recortado):
$ 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 para escrituras aleatorias 4K. Respetable.
Luego creé un volumen ZFS que abarcaba los 8. Al principio tenía un raidz1
vdev con los 8 SSD, pero leí sobre las razones por las que esto es malo para el rendimiento, así que terminé con cuatro mirror
vdevs, así:
$ 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 - - - - - -
Configuré el tamaño de registro en 4K y ejecuté mi prueba:
$ 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]
Solo obtengo 52K IOPS en este grupo de ZFS. Eso es en realidad un poco peor que un SSD en sí.
No entiendo lo que estoy haciendo mal aquí. ¿He configurado ZFS incorrectamente o es una mala prueba del rendimiento de ZFS?
Tenga en cuenta que estoy usando la imagen oficial de CentOS 7 HVM de 64 bits, aunque he actualizado al kernel 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
Instalé ZFS desde el repositorio de zfs enumerado aquí . Tengo la versión 0.6.5.5 del zfs
paquete.
ACTUALIZACIÓN : Por sugerencia de @ ewwhite probé ashift=12
y ashift=13
:
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=12 -f
y
$ sudo zpool create testpool mirror xvdb xvdc mirror xvdd xvde mirror xvdf xvdg mirror xvdh xvdi -o ashift=13 -f
Ninguno de estos hizo ninguna diferencia. Por lo que entiendo, los últimos bits ZFS son lo suficientemente inteligentes como para identificar SSD 4K y usar valores predeterminados razonables.
Sin embargo, noté que el uso de la CPU está aumentando. @Tim sugirió esto, pero lo descarté, sin embargo, creo que no estaba mirando la CPU el tiempo suficiente para notarlo. Hay algo así como 30 núcleos de CPU en esta instancia, y el uso de CPU está aumentando hasta un 80%. El proceso de hambre? z_wr_iss
, muchas instancias de ello.
Confirmé que la compresión está desactivada, por lo que no es el motor de compresión.
No estoy usando raidz, por lo que no debería ser el cálculo de paridad.
Hice un perf top
y muestra la mayor parte del tiempo del kernel que pasé _raw_spin_unlock_irqrestore
adentro z_wr_int_4
y osq_lock
adentro z_wr_iss
.
Ahora creo que hay un componente de CPU en este cuello de botella de rendimiento, aunque no estoy más cerca de descubrir cuál podría ser.
ACTUALIZACIÓN 2 : Según la sugerencia de @ewwhite y otros de que es la naturaleza virtualizada de este entorno lo que crea incertidumbre sobre el rendimiento, solía fio
comparar las escrituras aleatorias 4K repartidas en cuatro de los SSD del entorno. Cada SSD por sí solo da ~ 55K IOPS, por lo que esperaba alrededor de 240K IOs en cuatro de ellos. Eso es más o menos lo que obtuve:
$ 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]
Esto muestra claramente que el entorno, por virtualizado que sea, puede mantener los IOPS mucho más altos de lo que estoy viendo. Algo sobre la forma en que se implementa ZFS es evitar que alcance la velocidad máxima. Simplemente no puedo entender qué es eso.