Rendimiento práctico de RAID
Elegir un nivel de RAID es un ejercicio de equilibrar muchos factores, entre ellos el costo, la fiabilidad, la capacidad y, por supuesto, el rendimiento. El rendimiento de RAID puede resultar difícil de entender, sobre todo porque los distintos niveles de RAID emplean técnicas diferentes y se comportan de manera bastante distinta entre sí en algunos casos. En este artículo quiero explorar los niveles de RAID comunes de RAID 0, 5, 6 y 10 para ver cómo difiere el rendimiento entre ellos.
A efectos de este artículo, se asumirá que RAID 1 es un subconjunto de RAID 10. A menudo esta es una forma práctica de pensar en RAID 1: simplemente como un arreglo RAID 10 con un único par espejado como miembro. Como RAID 1 es en realidad un RAID 10 de un solo par y se comporta como tal, esto funciona de maravilla para hacer que el rendimiento de RAID sea fácil de entender, ya que simplemente se ajusta a la curva de rendimiento de RAID 10.
Hay dos tipos de rendimiento que examinar en todo almacenamiento: la lectura y la escritura. En términos de RAID, la lectura es extremadamente sencilla y la escritura es bastante compleja. El rendimiento de lectura es, en la práctica, estable en todos los tipos de RAID. La escritura, sin embargo, no lo es.
Para facilitar la discusión del rendimiento necesitamos definir algunos términos, ya que trabajaremos con algunas ecuaciones. En nuestras discusiones usaremos N para representar el número total de unidades, a menudo denominadas husos (spindles), en nuestro arreglo, y usaremos X para referirnos al rendimiento de cada unidad individualmente. Esto nos permite hablar en términos de rendimiento relativo como un factor del rendimiento de la unidad, lo que nos permite abstraernos del arreglo RAID y no tener que pensar en términos de IOPS en bruto. Esto es importante, ya que los IOPS a menudo son muy difíciles de definir, pero podemos comparar el rendimiento de una manera significativa hablando de él en relación con las unidades individuales dentro del arreglo.
También es importante recordar que solo estamos hablando del rendimiento del propio arreglo RAID, no de todo un subsistema de almacenamiento. Artefactos como las cachés de memoria y las cachés de estado sólido harán cosas asombrosas para alterar el rendimiento general de un subsistema de almacenamiento, pero no cambian fundamentalmente el rendimiento del propio arreglo RAID por debajo. No existe una fórmula sencilla para determinar cómo afectarán las distintas opciones de caché al rendimiento general, pero baste decir que puede ser muy drástico, aunque esto depende en gran medida no solo de las propias elecciones de caché, sino también, en gran medida, de la carga de trabajo. Incluso las opciones de caché más grandes, rápidas y robustas no pueden cambiar el rendimiento sostenido a largo plazo de un arreglo.
RAID es complejo y muchos factores influyen en el rendimiento final. Uno es la implementación del propio sistema RAID. Una implementación deficiente podría provocar latencia o no aprovechar los husos disponibles (¡como hacer que un arreglo RAID 1 lea solo de un único disco en lugar de ambos simultáneamente!). No hay una forma sencilla de tener en cuenta las deficiencias en implementaciones específicas de RAID, así que debemos asumir que todas funcionan hasta los límites de la especificación, como, de hecho, hará cualquier sistema RAID empresarial. Son principalmente los sistemas RAID de aficionado y de consumo los que no logran hacerlo.
Algunos tipos de RAID también tienen cantidades drásticas de sobrecarga computacional asociada a ellos, mientras que otros no. Principalmente, los niveles de RAID con paridad requieren un procesamiento intenso para gestionar las operaciones de escritura, con distintos niveles que requieren distintas cantidades de cálculo necesarias para cada operación. Esto introduce latencia, pero no reduce el rendimiento (throughput). Esta latencia variará, no obstante, en función de la implementación del nivel de RAID, así como de la capacidad de procesamiento del sistema en cuestión. El RAID por hardware usará algo como una CPU de propósito general (a menudo un procesador RISC Power o ARM) o un ASIC personalizado para gestionar esto, mientras que el RAID por software delega esto en la propia CPU del servidor. A menudo la CPU del servidor es en realidad más rápida aquí, pero consume recursos del sistema. Los ASIC pueden ser muy rápidos, pero su producción es cara. Esta latencia afecta al rendimiento del almacenamiento, pero es muy difícil de predecir y puede variar de insignificante a drástica. Así que mencionaré el impacto relativo de la latencia con cada nivel de RAID, pero no intentaré medirlo. En la mayoría de los cálculos de rendimiento de RAID, esta latencia se ignora, pero es importante entender que está presente y que podría, según la configuración del arreglo, tener un impacto notable en una carga de trabajo.
Cabe mencionar que existe un pequeño impacto en el rendimiento de las operaciones de lectura debido a las eficiencias en la disposición de los datos en el propio disco. El RAID con paridad requiere que haya datos en los discos que resultan inútiles durante una operación de lectura en estado sano, pero que no pueden utilizarse para acelerarla. Esto resulta, en realidad, en que sea ligeramente más lenta. Pero este impacto es ridículamente pequeño y normalmente no se mide, por lo que puede ignorarse.
Factores como el tamaño de banda (stripe) también afectan al rendimiento, por supuesto, pero como eso es configurable y no es un artefacto intrínseco de ningún nivel de RAID, lo ignoraré aquí. No es un factor a la hora de elegir un nivel de RAID en sí, sino solo a la hora de configurarlo una vez elegido.
El último factor que quiero mencionar es la proporción de lectura/escritura de las operaciones de almacenamiento. Algunos arreglos RAID se utilizarán casi exclusivamente para operaciones de lectura, otros casi únicamente para operaciones de escritura, pero la mayoría usan una mezcla de ambas, probablemente algo como un ochenta por ciento de lectura y un veinte por ciento de escritura. Esta proporción es muy importante para entender el rendimiento que obtendrá de su arreglo RAID específico y para comprender cómo le afectará cada nivel de RAID. A esto lo denomino la mezcla de lectura/escritura.
Medimos el rendimiento del almacenamiento principalmente en IOPS. IOPS significa Operaciones de Entrada/Salida Por Segundo (sí, ya sé que las letras no se corresponden bien con las siglas en inglés, es lo que hay). Además uso los términos RIOPS para los IOPS de lectura, WIOPS para los IOPS de escritura y BIOPS para los IOPS mezclados (blended), que vendrían con una proporción 80/20 o la que sea. Mucha gente habla del rendimiento del almacenamiento con un único número de IOPS. Cuando se hace esto, normalmente se refieren a los IOPS mezclados a 50/50. Sin embargo, rara vez una carga de trabajo funciona a 50/50, por lo que ese número puede ser extremadamente engañoso. Dos números, RIOPS y WIOPS, es lo que se necesita para entender el rendimiento, y estos dos juntos pueden usarse para hallar cualquier mezcla de IOPS que se necesite. Por ejemplo, una mezcla 50/50 es tan simple como (RIOPS * 0,5) + (WIOPS * 0,5). La mezcla 80/20, más común, sería (RIOPS * 0,8) + (WIOPS * 0,2).
Ahora que hemos establecido algunos criterios y conocimientos de fondo, ahondaremos en los propios niveles de RAID y veremos cómo varía el rendimiento entre ellos.
Para todos los niveles de RAID, el número de IOPS de lectura se calcula usando NX. Esto no aborda los números de sobrecarga insignificante que menciono más arriba, por supuesto. Es un número de «mejor caso», pero el número del mundo real es tan cercano que resulta muy práctico simplemente usar esta fórmula. Tomamos el número de husos (N) y lo multiplicamos por el rendimiento en IOPS de una unidad individual (X). Tenga en cuenta que las unidades a menudo tienen un rendimiento de lectura y de escritura distinto, así que asegúrese de usar la clasificación de IOPS de lectura de la unidad o la velocidad probada para el cálculo de los IOPS de lectura, y la tasa de IOPS de escritura o la velocidad probada para el cálculo de los IOPS de escritura.
RAID 0
RAID 0 es el nivel de RAID más fácil de entender porque, en la práctica, no hay sobrecarga de la que preocuparse, no se consumen recursos para alimentarlo y tanto la lectura como la escritura obtienen el beneficio completo de cada huso, en todo momento. Así que para RAID 0 nuestra fórmula para el rendimiento de escritura es muy simple: NX. RAID 0 es siempre el nivel de RAID con mejor rendimiento.
Un ejemplo sería un arreglo RAID 0 de ocho husos. Si una unidad individual del arreglo entrega 125 IOPS, entonces nuestro cálculo partiría de N = 8 y X = 125, así que 8 * 125 da como resultado 1000 IOPS. Dado que tanto los IOPS de lectura como los de escritura son los mismos aquí, es extremadamente simple, ya que obtenemos 1K RIOPS, 1K WIOPS y 1K con cualquier mezcla de ambos. Muy simple. Si no conociéramos los IOPS absolutos de un huso individual, podríamos referirnos a un RAID 0 de ocho husos como entregando 8X IOPS mezclados.
RAID 10
RAID 10 tiene el segundo nivel de RAID más sencillo de calcular. Como RAID 10 es una banda RAID 0 de conjuntos espejados, no tenemos sobrecarga de la que preocuparnos por parte de la banda, pero cada espejo tiene que escribir los mismos datos dos veces para crear el espejado. Esto reduce a la mitad nuestro rendimiento de escritura en comparación con un arreglo RAID 0 con el mismo número de unidades. Lo que nos da una fórmula de rendimiento de escritura de simplemente: NX/2 o 0,5NX.
Cabe señalar que, a la misma capacidad, en lugar del mismo número de husos, RAID 10 tiene el mismo rendimiento de escritura que RAID 0 pero el doble de rendimiento de lectura, simplemente porque requiere el doble de husos para igualar la misma capacidad.
Así que un arreglo RAID 10 de ocho husos sería N = 8 y X = 125 y nuestro cálculo resultante da (8 * 125)/2, que es 500 WIOPS o 4X WIOPS. Una mezcla 50/50 daría como resultado 750 IOPS mezclados (1000 IOPS de lectura y 500 IOPS de escritura).
Esta fórmula se aplica por igual a RAID 1, RAID 10, RAID 100 y RAID 01.
Opciones poco comunes como el espejado triple en RAID 10 alterarían esta penalización de escritura. RAID 10 con espejado triple sería NX/3, por ejemplo.
RAID 5
Aunque RAID 5 está obsoleto y nunca debería usarse en arreglos nuevos, lo incluyo aquí porque es un nivel de RAID bien conocido y de uso común y su rendimiento necesita comprenderse. RAID 5 es el más básico de los niveles modernos de RAID con paridad. RAID 2, 3 y 4 ya no se encuentran en sistemas de producción, así que no examinaremos su rendimiento aquí. RAID 5, aunque no se recomienda su uso hoy en día, es la base de otros niveles modernos de RAID con paridad, por lo que es importante entenderlo.
El RAID con paridad añade una necesidad algo complicada de verificar y reescribir la paridad con cada escritura que va al disco. Esto significa que un arreglo RAID 5 tendrá que leer los datos, leer la paridad, escribir los datos y, por último, escribir la paridad. Cuatro operaciones por cada operación efectiva. Esto nos da una penalización de escritura en RAID 5 de cuatro. Así que la fórmula para el rendimiento de escritura de RAID 5 es NX/4.
Así, siguiendo el ejemplo de los ocho husos donde los IOPS de escritura de un huso individual son 125, obtendríamos el siguiente cálculo: (8 * 125)/4 o 2X IOPS de escritura, lo que da 250 WIOPS. En una mezcla 50/50 esto daría como resultado 625 IOPS mezclados.
RAID 6
RAID 6, después de RAID 10, es probablemente el nivel de RAID más común y útil en uso hoy en día. RAID 6, sin embargo, se basa en RAID 5 y tiene otro nivel de paridad. Esto lo hace drásticamente más seguro que RAID 5, lo cual es muy importante, pero también impone una penalización de escritura drástica, ya que cada operación de escritura requiere que los discos lean los datos, lean la primera paridad, lean la segunda paridad, escriban los datos, escriban la primera paridad y, por último, escriban la segunda paridad. Esto da como resultado una penalización de escritura de seis veces, que es bastante drástica. Así que nuestra fórmula es NX/6.
Continuando con nuestro ejemplo obtenemos (8 * 125)/6, que da como resultado ~167 IOPS de escritura o 1,33X. En nuestro ejemplo de mezcla 50/50, esto supone un rendimiento de 583,5 IOPS mezclados. Como puede ver, las escrituras con paridad provocan una disminución muy rápida del rendimiento de escritura y una caída notable del rendimiento mezclado.
RAID 7 (también conocido como RAID 5.3 o RAID 7.3)
RAID 7 es un nivel de RAID algo no estándar con paridad triple basada en la paridad simple existente de RAID 5 y la paridad doble existente de RAID 6. La única implementación actual de RAID 7 es RAIDZ3 de ZFS. Como RAID 7 contiene toda la sobrecarga tanto de RAID 5 como de RAID 6, más la sobrecarga adicional del tercer componente de paridad, tenemos una penalización de escritura de unas asombrosas ocho veces. Así que nuestra fórmula para hallar el rendimiento de escritura de RAID 7 es NX/8.
En nuestro ejemplo esto significaría que (8 * 125)/8 daría como resultado 125 IOPS de escritura o 1X. Así que con ocho unidades en nuestro arreglo obtendríamos solo el rendimiento de escritura de una única unidad independiente. Eso es una sobrecarga considerable. Nuestros IOPS mezclados 50/50 darían como resultado solo 562,5.
RAID complejo
Los niveles de RAID complejos o niveles de RAID anidados como RAID 50, 60, 61, 16, etc., pueden hallarse usando la información anterior y descomponiendo el RAID en sus componentes y aplicando a cada uno las fórmulas proporcionadas arriba. No existe una fórmula sencilla para estos niveles porque tienen configuraciones variables. Es necesario descomponerlos en sus componentes y aplicar las fórmulas múltiples veces.
RAID 60 con doce unidades, dos conjuntos de seis unidades, donde cada unidad es de 150 IOPS, se haría con dos RAID 6. Sería el NX de RAID 0, donde N es dos (por los dos arreglos RAID 6) y X es el rendimiento resultante de cada RAID 6. Cada conjunto RAID 6 sería (6 * 150)/6. Así que el arreglo completo sería 2((6 * 150)/6). Lo que da como resultado 300 IOPS de escritura.
El mismo ejemplo que el anterior, pero configurado como RAID 61, un par espejado de arreglos RAID 6, tendría el mismo rendimiento por arreglo RAID 6, pero aplicado a la fórmula de RAID 1, que es NX/2 (donde X es el rendimiento resultante de cada arreglo RAID). Así que la fórmula final sería 2((6 * 150)/6)/2, dando 150 IOPS de escritura a partir de doce unidades.
El rendimiento como factor de la capacidad
Cuando elaboramos las fórmulas de rendimiento de RAID, las pensamos en términos del número de husos, lo cual es increíblemente sensato. Esto es muy útil para determinar el rendimiento de un arreglo propuesto o incluso de uno existente en el que la medición no es posible, y nos permite comparar el rendimiento relativo entre las distintas opciones propuestas. Es en estos términos en los que universalmente pensamos el rendimiento de RAID.
Sin embargo, este no siempre es un buen enfoque, porque normalmente vemos el RAID como un factor de la capacidad, en lugar de del rendimiento o del número de husos. Sería muy raro, aunque ciertamente posible, que alguien considerara un arreglo RAID 6 de ocho unidades frente a un arreglo RAID 10 de ocho unidades. De vez en cuando esto ocurrirá debido a una limitación del chasis o alguna otra razón similar. Pero por lo general los arreglos RAID se contemplan desde el punto de vista de la capacidad total del arreglo (es decir, la capacidad utilizable) en lugar del número de husos, el rendimiento o cualquier otro factor. Es extraño, por tanto, que debamos entonces pasar a ver el rendimiento de RAID como una función del número de husos.
Si cambiamos nuestro punto de vista y pivotamos sobre la capacidad como factor común, sin dejar de asumir que la capacidad y el rendimiento (X) de la unidad individual permanecen constantes entre los elementos comparados, entonces llegamos a un panorama de rendimiento completamente distinto. Al hacer esto vemos, por ejemplo, que RAID 0 ya no es el nivel de RAID con mejor rendimiento y que el rendimiento de lectura varía drásticamente en lugar de ser constante.
La capacidad es algo voluble, pero podemos reducirla al número de husos necesarios para alcanzar la capacidad deseada. Esto hace que esta discusión sea mucho más fácil. Así que nuestro primer paso es determinar el número de husos necesario para la capacidad en bruto. Si necesitamos una capacidad de 10 TB y estamos usando unidades de 1 TB, necesitaríamos diez husos, por ejemplo. O si necesitamos 3,2 TB y estamos usando unidades de 600 GB, necesitaríamos seis husos. A diferencia de antes, nos referiremos a nuestro número de husos como R. Como antes, el rendimiento de la unidad individual se representa como X. (Aquí se usa R para denotar que este es el Recuento de Capacidad en bruto, en lugar del Número total de husos).
RAID 0 sigue siendo simple, el rendimiento sigue siendo RX ya que no hay unidades adicionales. Tanto los IOPS de lectura como los de escritura son simplemente NX.
RAID 10 tiene RX IOPS de escritura pero 2RX IOPS de lectura. Esto es drástico. De repente, al ver el rendimiento como un factor de capacidad estable, descubrimos que RAID 10 tiene el doble de rendimiento de lectura que RAID 0.
RAID 5 se vuelve algo más complicado. Los IOPS de escritura se expresarían como ((R + 1) * X)/4. Los IOPS de lectura se expresan como ((R + 1) * X).
RAID 6, como cabe esperar, sigue el patrón que proyecta RAID 5. Los IOPS de escritura para RAID 6 son ((R + 2) * X)/6. Y los IOPS de lectura se expresan como ((R + 2) * X).
RAID 7 encaja perfectamente en la línea. Los IOPS de escritura de RAID 7 serían ((R + 3) * X)/8. Y los IOPS de lectura son ((R + 3) * X).
Este punto de vista cambia la manera en que pensamos el rendimiento y, al mirar puramente el rendimiento de lectura, ¡RAID 0 se convierte en el nivel de RAID más lento en lugar del más rápido, y RAID 10 se convierte en el más rápido tanto para lectura como para escritura, sin importar cuáles sean los valores de R y X!
Si tomamos un ejemplo del mundo real de 10 unidades de 2 TB para alcanzar 20 TB de capacidad utilizable, con cada unidad teniendo 100 IOPS de rendimiento y asumiendo una mezcla 50/50, los IOPS resultantes serían: RAID 0 con 1000 IOPS mezclados, RAID 10 con 1500 IOPS mezclados (2000 RIOPS / 1000 WIOPS), RAID 5 con 687,5 IOPS mezclados (1100 RIOPS / 275 WIOPS), RAID 6 con 700 IOPS mezclados (1200 RIOPS / 200 WIOPS) y, por último, RAID 7 con 731,25 IOPS mezclados (1300 RIOPS / 162,5 WIOPS). RAID 10 es un ganador rotundo aquí.
Latencia e impacto en el sistema con RAID por software
Como he indicado antes, RAID 0 y RAID 10 tienen, en la práctica, una sobrecarga del sistema que no hay que considerar. La operación de espejado no requiere esencialmente ningún esfuerzo computacional y es, a todos los efectos, inconmensurablemente pequeña. El RAID con paridad sí tiene sobrecarga computacional y esto resulta en latencia en la capa de almacenamiento y en el consumo de recursos del sistema. Por supuesto, si estamos usando RAID por hardware, esos recursos están dedicados al arreglo RAID y no tienen otra función que ser consumidos en este rol. Si estamos usando RAID por software, sin embargo, estos son recursos del sistema de propósito general (principalmente la CPU) que se consumen para los fines del procesamiento del arreglo RAID.
El impacto incluso en un sistema muy pequeño con una gran cantidad de RAID sigue siendo muy pequeño, pero puede medirse y debería considerarse, aunque sea ligeramente. La latencia y el impacto en el sistema están directamente relacionados entre sí.
No hay una forma sencilla de expresar la latencia y el impacto en el sistema para los distintos niveles de RAID, salvo de esta manera: RAID 0 y RAID 10 no tienen, en la práctica, ni latencia ni impacto, RAID 5 tiene algo de latencia e impacto, RAID 6 tiene aproximadamente el doble de latencia e impacto computacional que RAID 5 y RAID 7 tiene aproximadamente el triple de latencia e impacto computacional que RAID 5.
En muchos casos, esta latencia e impacto en el sistema serán tan pequeños que no podrán medirse con las herramientas estándar del sistema y, a medida que los procesadores modernos se vuelven cada vez más potentes, la latencia y el impacto en el sistema continuarán disminuyendo. El impacto se ha considerado insignificante para los sistemas RAID 5 y RAID 6 incluso en hardware de gama baja y comoditizado desde aproximadamente 2001. Pero es posible que en sistemas con mucha carga y una gran cantidad de actividad de RAID con paridad pueda haber contención entre el subsistema RAID y otros procesos que requieran recursos del sistema.
Referencia: The IT Hollow – Understanding the RAID Penalty
Artículo publicado originalmente en el Blog de StorageCraft – RAID Performance.
