Discos de alto rendimiento en Microsoft Azure

por Ignacio Escudero Rivera
Project manager de OpenSistemas

El rendimiento de discos montados en las máquinas virtuales sobre Microsoft Azure tiene unas características limitadas de escritura. En el caso de máquinas virtuales Linux sobre Microsoft Azure, la solución pasa por crear una infraestructura de escritura distribuida en discos o striping de discos.

Básicamente, el sistema se basa en crear un RAID 0 sobre los discos montados en el sistema, que tienen la seguridad y estabilidad de la triple escritura para cada uno de ellos. Por lo tanto, los posibles problemas de perdidas de datos queda anulada por la propia infraestructura de Azure.

Dicho esto, nos disponemos a comprobar el rendimiento habitual de un disco sobre Microsoft Azure:

root@euclides:~# dd if=/dev/zero of=/mnt/datadrive/test.out bs=4k count=402400
402400+0 registros leídos
402400+0 registros escritos
1648230400 bytes (1,6 GB) copiados, 24,3726 s, 67,6 MB/s
root@euclides:~# dd if=/dev/zero of=/mnt/datadrive/test.out bs=8k count=202400
202400+0 registros leídos
202400+0 registros escritos
1658060800 bytes (1,7 GB) copiados, 24,3694 s, 68,0 MB/s
root@euclides:~# dd if=/dev/zero of=/mnt/datadrive/test.out bs=16k count=101200
101200+0 registros leídos
101200+0 registros escritos
1658060800 bytes (1,7 GB) copiados, 24,5432 s, 67,6 MB/s
root@euclides:~# dd if=/dev/zero of=/mnt/datadrive/test2.out bs=16k count=101200
101200+0 registros leídos
101200+0 registros escritos
1658060800 bytes (1,7 GB) copiados, 23,7428 s, 69,8 MB/s

Como se aprecia en los test del ejemplo, la escritura nunca supera los 70 MB/s

Ahora, una vez añadidos ocho discos al sistema, vamos a proceder a crear la unidad distribuida de escritura con mdadm

mdadm –verbose –create /dev/md0 –level=0 –chunk=256 –raid-devices=8 /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj

Los mejores rendimientos se consiguen con –chunk=256

Una vez creada la unidad tenemos que darle formato:

mkfs.ext3 -b 4096 -E stripe-width=512,stride=64 /dev/md0

Los parámetros se calculan de la siguiente manera:

tamaño de chunk = 256k
tamaño de block = 4k
stride = chunk / block; 256 / 4 = 64
stripe-width = stride * nº discos de RAID 0; 64 * 8 = 512

Posteriormente realizamos el montaje en el directorio /RAID, que usaremos para realizar las pruebas de escritura con la nueva configuración:

root@copernico:~# dd if=/dev/zero of=/RAID/test.out bs=4k count=402400
402400+0 registros leídos
402400+0 registros escritos
1648230400 bytes (1,6 GB) copiados, 4,51627 s, 365 MB/s
root@copernico:~# dd if=/dev/zero of=/RAID/test.out bs=8k count=202400
202400+0 registros leídos
202400+0 registros escritos
1658060800 bytes (1,7 GB) copiados, 3,61523 s, 459 MB/s
root@copernico:~# dd if=/dev/zero of=/RAID/test2.out bs=16k count=101200
101200+0 registros leídos
101200+0 registros escritos
1658060800 bytes (1,7 GB) copiados, 3,82761 s, 433 MB/s

Se puede apreciar el aumento significativo en la velocidad de escritura, llegando a los 459MB/s.

Cabe destacar que de esta manera, añadiendo el número máximo de discos que permita el tamaño de nuestra máquina, podremos crear una gran unidad de varios terabytes de capacidad, ya que el límite de tamaño de 1023G que hay en los discos Azure queda multiplicado por el número de discos.

Sólo falta realizar la configuración en fstab para que la unidad creada con mdadm se monte automáticamente al arrancar el sistema y podremos hacer uso con normalidad de nuestro nuevo disco local de alto rendimiento.

Nacho Escudero