Test de performance VPS. Parte 1.

PowerHost vs AWS / DigitalOcean / Google / IBM y otros.

En esta primera fase de testes, analizaremos el performance en la tasa de respuesta y rapidez de los distintos servidores virtuales o instancias como denominan algunos proveedores.

Muchas veces cuando se realiza un test para ver el rendimiento del disco se utiliza el comando dd en linux de la siguiente forma:

dd if=/dev/zero of=arhivo_test bs=64k count=16k conv=fdatasync

En este test no utilizaremos este comando ya que la prueba solo permite realizar una prueba de escritura secuencial con un subproceso. No realiza test de lectura. Por lo que esto no emula la realidad de cómo funcionan las aplicaciones web en un servidor, por ejemplo.

-La data escrita es muy baja por lo que puede ser influenciada por el cache del sistema operativo o por la controladora RAID del host.

-Corre por poco tiempo, esto no entrega resultados que sean consistentes.

Para este test se utilizará FIO para poder medir lectura y escritura y poder tener mayor control sobre nuestro testeo, evitando los problemas que se mencionan anteriormente.

Vamos a medir tanto IOPS como MB/s (throughput o tasa de transferencia), considerando que estas dos metricas son inversas, es decir, entre mas bajo el bloque mayor IOPS y menor throughput y entre mas alto el bloque, menor IOPS y mas alto throughput (MB/s).

Throughput = iops * block size

Throughput = 2000 * 8 = 16 000 KB/s = 16 MB/s

Midiendo IOPS Aleatorios

Haremos el test midiendo lectura y escritura con 70% de lectura y 30% de escritura al mismo tiempo, que es la carga más típica para un servidor. El test se correrá con diferentes tamaños de bloques 4K / 16K / 32K / 64K etc para simular diferentes aplicaciones. En donde bloques más pequeños generalmente se utilizan para base de datos y 32K y 64K para web.

fio --name=RandomRW --ioengine=libaio --iodepth=64 --rw=randrw --bs=4K --direct=1 --size=5G --numjobs=5 --runtime=60 --group_reporting --time_based --rwmixread=70

Lo anterior creara un archivo de 5GB (size=5G), escribiendo y leyendo de forma aleatoria (rw=randrw) en bloques de 4K (bs=4K), utilizando 70%/30% (rwmixread=70), 5 veces (numjobs=5), con 64 operaciones corriendo al mismo tiempo (iodepth=64), leyendo directamente del disco para evitar el caché (direct=1), correra por 60 segundos cada job (runtime=60), y por ultimo tirara el resultado unificado de todos los jobs en grupo (group_reporting).

En total esto ocupara 25 GB de espacio en el disco de la VM, por si deseas generar este test y no tienes espacio, se puede cambiar 5GB por 512m.

Un ejemplo de como muestra la información al correr fio con bloques de 4k en un VPS SSD de Powerhost con 2 Cores 4 GB en RAM y 50 GB SSD. Pueden revisar aqui la imagen del servidor donde se indica ip del servidor de Powerhost.

RandomRW: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
	...
	fio-3.7
	Starting 5 processes
	RandomRW: Laying out IO file (1 file / 5120MiB)
	RandomRW: Laying out IO file (1 file / 5120MiB)
	RandomRW: Laying out IO file (1 file / 5120MiB)
	RandomRW: Laying out IO file (1 file / 5120MiB)
	RandomRW: Laying out IO file (1 file / 5120MiB)
	
RandomRW: (groupid=0, jobs=5): err= 0: pid=26317: Tue Jan 28 19:14:13 2020
	read: IOPS=122k, BW=475MiB/s (499MB/s)(27.9GiB/60001msec)
	slat (usec): min=2, max=34876, avg=25.70, stdev=124.31
	clat (usec): min=191, max=69726, avg=1868.98, stdev=1070.24
		lat (usec): min=196, max=69735, avg=1894.86, stdev=1078.61
	clat percentiles (usec):
		|  1.00th=[  750],  5.00th=[  898], 10.00th=[ 1004], 20.00th=[ 1188],
		| 30.00th=[ 1352], 40.00th=[ 1516], 50.00th=[ 1663], 60.00th=[ 1827],
		| 70.00th=[ 2040], 80.00th=[ 2343], 90.00th=[ 2868], 95.00th=[ 3458],
		| 99.00th=[ 5211], 99.50th=[ 6652], 99.90th=[12518], 99.95th=[14222],
		| 99.99th=[23725]
	bw (  KiB/s): min=57160, max=169776, per=19.98%, avg=97272.71, stdev=16764.93, samples=600
	iops        : min=14290, max=42444, avg=24318.09, stdev=4191.23, samples=600
		write: IOPS=52.2k, BW=204MiB/s (214MB/s)(11.9GiB/60001msec)
	slat (usec): min=2, max=35314, avg=26.49, stdev=129.60
	clat (usec): min=125, max=62184, avg=1680.96, stdev=1034.39
	lat (usec): min=135, max=62195, avg=1707.63, stdev=1043.70
	clat percentiles (usec):
		|  1.00th=[  668],  5.00th=[  816], 10.00th=[  906], 20.00th=[ 1057],
		| 30.00th=[ 1221], 40.00th=[ 1369], 50.00th=[ 1516], 60.00th=[ 1663],
		| 70.00th=[ 1844], 80.00th=[ 2089], 90.00th=[ 2507], 95.00th=[ 2999],
		| 99.00th=[ 4686], 99.50th=[ 6063], 99.90th=[12125], 99.95th=[14091],
		| 99.99th=[32637]
	bw (  KiB/s): min=24103, max=71800, per=19.98%, avg=41711.31, stdev=7197.03, samples=600
	iops        : min= 6025, max=17950, avg=10427.73, stdev=1799.27, samples=600
	lat (usec)   : 250=0.01%, 500=0.04%, 750=1.52%, 1000=10.05%
	lat (msec)   : 2=59.49%, 4=26.54%, 10=2.09%, 20=0.24%, 50=0.03%
	lat (msec)   : 100=0.01%
	cpu          : usr=8.49%, sys=50.95%, ctx=250062, majf=0, minf=153
	IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
		submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
		complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
		issued rwts: total=7303417,3131764,0,0 short=0,0,0,0 dropped=0,0,0,0
		latency   : target=0, window=0, percentile=100.00%, depth=64
	
	Run status group 0 (all jobs):
		READ: bw=475MiB/s (499MB/s), 475MiB/s-475MiB/s (499MB/s-499MB/s), io=27.9GiB (29.9GB), run=60001-60001msec
		WRITE: bw=204MiB/s (214MB/s), 204MiB/s-204MiB/s (214MB/s-214MB/s), io=11.9GiB (12.8GB), run=60001-60001msec
	
	Disk stats (read/write):
		sda: ios=7291028/3126566, merge=0/7, ticks=5535839/1862727, in_queue=7402774, util=100.00%
	

El resultado resaltado, muestra los IOPS de lectura, la tasa de transferencia para la lectura y la escritura. Fio entrega mucha información, pero por ahora nos enfocaremos en estas. Al final del test se entrega un resumen de la información que se encuentra resaltada en rojo.

Para no ejecutar todas las pruebas manualmente para cada bloque, creamos un script y correr todas las pruebas de una vez para este test. Podrán encontrar los .txt con todas las pruebas en la parte de resultados.

Resultados

Para el test comparamos las siguientes empresas con estos recursos:

vCPU RAM Espacio
Powerhost 2 vCPU 4 GB 50 GB VPS SSD Pro
DigitalOcean 4 vCPU 8 GB 160 GB
OVH 1 vCPU 4 GB 40 GB VPS SSD 2
IBM Cloud* 2 vCPU 4 GB 30 GB
Hostgator 2 vCPU 4 GB 160 GB
Gigas** 4 vCPU 4 GB 100 GB VPS pro
Google 2 vCPU 4 GB 50 GB SSD persistent disk
AWS*** 2 vCPU 4 GB 50 GB t3a.medium

Algunos comentarios antes de los resultados:

Intentamos que todas las VMs tengan recursos parecidos. Pero no en todos los casos fue posible. En cuanto digitalocean es el que más recursos posee. Utilizamos una VM que ya teníamos, sin embargo, indican que los IO no aumentan con mayor espacio en disco por lo que decidimos dejarlo así y comparar de todas formas. Si se puede ver afectado el rendimiento en IOPS cuando se le exige más a una VM entre más recursos de RAM y CPU y carga en general este podrá entregar mayor IOPS por el hecho de poder correr soportar mayor carga. En este caso quisimos compararlo con una VM más pequeña de Powerhost.

El test de IBM Cloud se ejecutó con un size=3GB por el tamaño del disco.

**Gigas no tiene opción de compra discos SSD y no indican que discos utilizan.

***AWS Utilizamos el disco (io1) y configuramos con 1000 IOPS ya que 10K IOPS (calculados promedio de bloques 16K) para la misma VM tiene un costo de $673,48 USD pierde el sentido de utilizar algo tan costoso.

Los resultados hablan por sí solos. En todas las pruebas Powerhost obtuvo mejor IOPS y tasa de transferencia. Podrán observar que a medida que los bloques aumentan, la diferencia relativa entre los demás disminuye, esto es porque en Powerhost optimizamos los ssd para que se potencien los bloques más pequeños a lo más grandes, debido a que estos son los más utilizados en las aplicaciones vs bloques de 512k o 1M.

Los resultados no son absolutos, si bien medir IOPS puede cambiar los resultados en diferentes momentos, pero no deberían cambiar drásticamente si el servicio es estable. Recordar que, en este test, se realizó al mismo tiempo lectura en un 70% y escritura en un 30%, por esto que los resultados de escrituras son menores. Los próximos test se realizan con 100% de escritura, 100% de lectura y agregaremos lecturas y escrituras secuenciales.

Pueden encontrar los resultados completos arrojados por fio en los siguientes links:

Gigas

IBM Cloud

Google Cloud

AWS*

*AWS mantiene sus propios repositorios y posee la version de FIO 2.14, por lo que como se muestran los resultados cambia levemente, para sacar en MB/s bw se divide por 1000.