Performance pratique du RAID
Choisir un niveau de RAID est un exercice d'équilibre entre de nombreux facteurs, parmi lesquels le coût, la fiabilité, la capacité et, bien sûr, la performance. La performance du RAID peut être difficile à appréhender, d'autant que les différents niveaux de RAID emploient des techniques différentes et se comportent assez différemment les uns des autres dans certains cas. Dans cet article, je souhaite explorer les niveaux de RAID courants que sont les RAID 0, 5, 6 et 10 afin de voir en quoi leur performance diffère.
Pour les besoins de cet article, le RAID 1 sera considéré comme un sous-ensemble du RAID 10. C'est souvent une façon pratique de concevoir le RAID 1 — comme étant simplement une grappe RAID 10 ne comportant qu'une seule paire de membres en miroir. Comme le RAID 1 est véritablement un RAID 10 à paire unique et se comporte comme tel, cela fonctionne à merveille pour rendre la performance du RAID facile à comprendre, puisqu'il se reporte tout simplement sur la courbe de performance du RAID 10.
Il existe deux types de performance à examiner pour tout stockage : la lecture et l'écriture. En matière de RAID, la lecture est extrêmement simple et l'écriture est plutôt complexe. La performance en lecture est dans les faits stable à travers tous les types de RAID. L'écriture, en revanche, ne l'est pas.
Pour faciliter la discussion sur la performance, nous devons définir quelques termes, car nous allons travailler avec certaines équations. Dans nos discussions, nous utiliserons N pour représenter le nombre total de disques, souvent appelés broches (spindles), dans notre grappe, et nous utiliserons X pour désigner la performance de chaque disque individuellement. Cela nous permet de raisonner en termes de performance relative en fonction de la performance du disque, ce qui nous permet de faire abstraction de la grappe RAID et de ne pas avoir à raisonner en IOPS bruts. C'est important, car les IOPS sont souvent très difficiles à définir, mais nous pouvons comparer la performance de manière pertinente en l'exprimant relativement aux disques individuels au sein de la grappe.
Il est également important de garder à l'esprit que nous parlons uniquement de la performance de la grappe RAID elle-même, et non d'un sous-système de stockage tout entier. Des artéfacts tels que les caches mémoire et les caches à état solide accompliront des prodiges pour modifier la performance globale d'un sous-système de stockage, mais ne changent pas fondamentalement la performance de la grappe RAID elle-même, sous le capot. Il n'existe pas de formule simple pour déterminer comment différentes options de cache influeront sur la performance globale, mais il suffit de dire que cela peut être très spectaculaire, tout en dépendant fortement non seulement des choix de cache eux-mêmes, mais aussi, dans une large mesure, de la charge de travail. Même les options de cache les plus volumineuses, les plus rapides et les plus robustes ne peuvent changer la performance soutenue à long terme d'une grappe.
Le RAID est complexe et de nombreux facteurs influencent la performance finale. L'un d'eux est l'implémentation du système RAID lui-même. Une mauvaise implémentation pourrait engendrer de la latence ou ne pas exploiter les broches disponibles (par exemple, en faisant lire une grappe RAID 1 depuis un seul disque au lieu des deux simultanément !) Il n'y a pas de moyen simple de tenir compte des déficiences d'implémentations RAID spécifiques, aussi devons-nous supposer que toutes fonctionnent à la limite de la spécification, comme le fera, de fait, tout système RAID d'entreprise. Ce sont essentiellement les systèmes RAID amateurs et grand public qui ne le font pas.
Certains types de RAID s'accompagnent également d'une quantité considérable de surcharge de calcul, tandis que d'autres non. Ce sont principalement les niveaux de RAID à parité qui requièrent un traitement lourd afin de gérer les opérations d'écriture, les différents niveaux nécessitant des quantités de calcul différentes pour chaque opération. Cela introduit de la latence, mais ne réduit pas le débit. Cette latence variera toutefois en fonction de l'implémentation du niveau de RAID ainsi que de la capacité de traitement du système en question. Le RAID matériel utilisera quelque chose comme un processeur généraliste (souvent un processeur RISC de type Power ou ARM) ou un ASIC dédié pour gérer cela, tandis que le RAID logiciel délègue cette tâche au propre processeur du serveur. Souvent, le processeur du serveur est en réalité plus rapide ici, mais il consomme des ressources système. Les ASIC peuvent être très rapides, mais leur production est coûteuse. Cette latence affecte la performance du stockage, mais est très difficile à prédire et peut varier de négligeable à spectaculaire. Je mentionnerai donc l'impact de latence relatif pour chaque niveau de RAID, mais je ne tenterai pas de le mesurer. Dans la plupart des calculs de performance RAID, cette latence est ignorée, mais il est important de comprendre qu'elle est présente et pourrait, selon la configuration de la grappe, avoir un impact notable sur une charge de travail.
Il y a, il convient de le mentionner, un infime impact sur la performance des opérations de lecture en raison des particularités d'agencement des données sur le disque lui-même. Le RAID à parité exige qu'il y ait sur les disques des données qui sont inutiles lors d'une opération de lecture saine, mais qui ne peuvent servir à l'accélérer. Cela se traduit en réalité par une légère lenteur supplémentaire. Mais cet impact est ridiculement faible et n'est normalement pas mesuré, et peut donc être ignoré.
Des facteurs tels que la taille de bande (stripe size) influent eux aussi sur la performance, bien sûr, mais comme cela est configurable et n'est pas un artéfact intrinsèque à un quelconque niveau de RAID, je l'ignorerai ici. Ce n'est pas un facteur au moment de choisir un niveau de RAID en tant que tel, mais uniquement au moment d'en configurer un une fois choisi.
Le dernier facteur que je souhaite mentionner est le ratio lecture/écriture des opérations de stockage. Certaines grappes RAID seront utilisées presque exclusivement pour des opérations de lecture, certaines presque uniquement pour des opérations d'écriture, mais la plupart utilisent un mélange des deux, vraisemblablement quelque chose comme quatre-vingts pour cent de lecture et vingt pour cent d'écriture. Ce ratio est très important pour comprendre la performance que vous obtiendrez de votre grappe RAID particulière et pour comprendre comment chaque niveau de RAID vous affectera. J'appelle cela le mélange lecture/écriture (read/write blend).
Nous mesurons la performance du stockage principalement en IOPS. IOPS signifie Input/Output Operations Per Second, soit opérations d'entrée/sortie par seconde (oui, je sais que les lettres ne correspondent pas vraiment, c'est ainsi). J'utilise en outre les termes RIOPS pour les IOPS en lecture (Read IOPS), WIOPS pour les IOPS en écriture (Write IOPS) et BIOPS pour les IOPS mixtes (Blended IOPS), qui seraient assortis d'un ratio 80/20 ou tout autre. Beaucoup de gens parlent de la performance du stockage avec un unique nombre d'IOPS. Lorsqu'ils le font, ils désignent normalement des Blended IOPS à 50/50. Or, il est rare qu'une charge de travail tourne à 50/50, de sorte que ce nombre peut être extrêmement trompeur. Deux nombres, RIOPS et WIOPS, voilà ce qu'il faut pour comprendre la performance, et ces deux-là, ensemble, peuvent servir à déterminer n'importe quel mélange d'IOPS souhaité. Par exemple, un mélange 50/50 est aussi simple que (RIOPS × 0,5) + (WIOPS × 0,5). Le mélange 80/20, plus courant, serait (RIOPS × 0,8) + (WIOPS × 0,2).
Maintenant que nous avons établi certains critères et un socle de compréhension, nous allons nous plonger dans les niveaux de RAID eux-mêmes et voir comment la performance varie de l'un à l'autre.
Pour tous les niveaux de RAID, le nombre de Read IOPS se calcule à l'aide de NX. Cela ne tient pas compte des chiffres de surcharge négligeable que j'évoque plus haut, bien entendu. Il s'agit d'un nombre « meilleur cas », mais le nombre réel en est si proche qu'il est très pratique d'utiliser simplement cette formule. Puisqu'on prend le nombre de broches (N) et qu'on le multiplie par la performance en IOPS d'un disque individuel (X). Gardez à l'esprit que les disques ont souvent une performance différente en lecture et en écriture ; veillez donc à utiliser la valeur de Read IOPS du disque, indiquée ou testée, pour le calcul des Read IOPS, et la valeur de Write IOPS, indiquée ou testée, pour le calcul des Write IOPS.
RAID 0
Le RAID 0 est le niveau de RAID le plus facile à comprendre, car il n'y a, dans les faits, aucune surcharge à se soucier, aucune ressource consommée pour l'alimenter, et la lecture comme l'écriture profitent pleinement de chaque broche, en permanence. Ainsi, pour le RAID 0, notre formule de performance en écriture est très simple : NX. Le RAID 0 est toujours le niveau de RAID le plus performant.
Un exemple serait une grappe RAID 0 de huit broches. Si un disque individuel de la grappe délivre 125 IOPS, alors notre calcul partirait de N = 8 et X = 125, soit 8 × 125, ce qui donne 1 000 IOPS. Comme les IOPS en lecture et en écriture sont ici identiques, c'est extrêmement simple, puisque nous obtenons 1K RIOPS, 1K WIOPS et 1K pour tout mélange de ceux-ci. Très simple. Si nous ne connaissions pas les IOPS absolus d'une broche individuelle, nous pourrions dire qu'un RAID 0 de huit broches délivre 8X Blended IOPS.
RAID 10
Le RAID 10 possède le deuxième niveau de RAID le plus simple à calculer. Parce que le RAID 10 est une bande RAID 0 d'ensembles en miroir, nous n'avons aucune surcharge à nous soucier du côté de la bande, mais chaque miroir doit écrire les mêmes données deux fois afin de créer la mise en miroir. Cela réduit de moitié notre performance en écriture par rapport à une grappe RAID 0 comptant le même nombre de disques. Ce qui nous donne une formule de performance en écriture simplement égale à : NX/2 ou 0,5NX.
Il convient de noter qu'à capacité égale, plutôt qu'à nombre de broches égal, le RAID 10 a la même performance en écriture que le RAID 0, mais le double de la performance en lecture — simplement parce qu'il requiert deux fois plus de broches pour atteindre la même capacité.
Ainsi, une grappe RAID 10 de huit broches correspondrait à N = 8 et X = 125, et notre calcul résultant donne (8 × 125)/2, soit 500 WIOPS, ou 4X WIOPS. Un mélange 50/50 donnerait 750 Blended IOPS (1 000 Read IOPS et 500 Write IOPS).
Cette formule s'applique de manière identique au RAID 1, au RAID 10, au RAID 100 et au RAID 01.
Des options peu courantes, comme la triple mise en miroir en RAID 10, modifieraient cette pénalité d'écriture. Le RAID 10 avec triple mise en miroir serait NX/3, par exemple.
RAID 5
Bien que le RAID 5 soit déprécié et ne devrait jamais être utilisé dans de nouvelles grappes, je l'inclus ici parce que c'est un niveau de RAID bien connu et couramment utilisé, et que sa performance doit être comprise. Le RAID 5 est le plus élémentaire des niveaux de RAID à parité modernes. Les RAID 2, 3 et 4 ne se rencontrent plus dans les systèmes en production, aussi n'examinerons-nous pas leur performance ici. Le RAID 5, bien qu'il ne soit pas recommandé à l'usage aujourd'hui, est le fondement des autres niveaux de RAID à parité modernes, et il est donc important de le comprendre.
Le RAID à parité ajoute un besoin quelque peu compliqué de vérifier et de réécrire la parité à chaque écriture qui part vers le disque. Cela signifie qu'une grappe RAID 5 devra lire les données, lire la parité, écrire les données et enfin écrire la parité. Quatre opérations pour chaque opération effective. Cela nous donne une pénalité d'écriture de quatre sur le RAID 5. La formule de la performance en écriture du RAID 5 est donc NX/4.
Ainsi, en suivant l'exemple des huit broches où les Write IOPS d'une broche individuelle sont de 125, nous obtiendrions le calcul suivant : (8 × 125)/4, soit 2X Write IOPS, ce qui revient à 250 WIOPS. Dans un mélange 50/50, cela donnerait 625 Blended IOPS.
RAID 6
Le RAID 6, après le RAID 10, est probablement le niveau de RAID le plus courant et le plus utile en usage aujourd'hui. Le RAID 6, toutefois, est fondé sur le RAID 5 et possède un niveau de parité supplémentaire. Cela le rend nettement plus sûr que le RAID 5, ce qui est très important, mais impose aussi une pénalité d'écriture spectaculaire, car chaque opération d'écriture exige des disques qu'ils lisent les données, lisent la première parité, lisent la seconde parité, écrivent les données, écrivent la première parité, puis enfin écrivent la seconde parité. Cela revient à une pénalité d'écriture de six fois, ce qui est assez spectaculaire. Notre formule est donc NX/6.
En poursuivant notre exemple, nous obtenons (8 × 125)/6, ce qui donne environ 167 Write IOPS, soit 1,33X. Dans notre exemple de mélange 50/50, cela représente une performance de 583,5 Blended IOPS. Comme vous pouvez le constater, les écritures à parité entraînent une diminution très rapide de la performance en écriture et une baisse notable de la performance mixte.
RAID 7 (alias RAID 5.3 ou RAID 7.3)
Le RAID 7 est un niveau de RAID quelque peu non standard, à triple parité, fondé sur la simple parité existante du RAID 5 et la double parité existante du RAID 6. La seule implémentation actuelle du RAID 7 est le RAIDZ3 de ZFS. Parce que le RAID 7 contient toute la surcharge du RAID 5 et du RAID 6, plus la surcharge additionnelle du troisième composant de parité, nous avons une pénalité d'écriture de huit fois, ce qui est stupéfiant. Notre formule pour trouver la performance en écriture du RAID 7 est donc NX/8.
Dans notre exemple, cela signifierait que (8 × 125)/8 donnerait 125 Write IOPS, soit 1X. Ainsi, avec huit disques dans notre grappe, nous n'obtiendrions que la performance en écriture d'un disque unique et autonome. C'est une surcharge considérable. Nos IOPS mixtes 50/50 ne s'élèveraient qu'à 562,5.
RAID complexe
Les niveaux de RAID complexes ou les niveaux de RAID imbriqués (nested) tels que les RAID 50, 60, 61, 16, etc. peuvent être déterminés à l'aide des informations ci-dessus, en décomposant le RAID en ses composants et en appliquant à chacun les formules fournies plus haut. Il n'existe pas de formule simple pour ces niveaux, car ils ont des configurations variables. Il est nécessaire de les décomposer en leurs composants et d'appliquer les formules à plusieurs reprises.
Un RAID 60 avec douze disques, deux ensembles de six disques, où chaque disque fait 150 IOPS, se calculerait avec deux RAID 6. Ce serait le NX du RAID 0 où N vaut deux (pour deux grappes RAID 6) et X est la performance résultante de chaque RAID 6. Chaque ensemble RAID 6 serait (6 × 150)/6. Ainsi, la grappe complète serait 2((6 × 150)/6). Ce qui donne 300 Write IOPS.
Le même exemple que ci-dessus, mais configuré en RAID 61, soit une paire en miroir de grappes RAID 6, présenterait la même performance par grappe RAID 6, mais appliquée à la formule du RAID 1 qui est NX/2 (où X est la performance résultante de chaque grappe RAID). La formule finale serait donc 2((6 × 150)/6)/2, ce qui aboutit à 150 Write IOPS pour douze disques.
La performance en fonction de la capacité
Lorsque nous produisons des formules de performance RAID, nous les concevons en termes de nombre de broches, ce qui est extrêmement sensé. C'est très utile pour déterminer la performance d'une grappe envisagée, ou même d'une grappe existante lorsque la mesure n'est pas possible, et cela nous permet de comparer la performance relative entre différentes options envisagées. C'est en ces termes que nous concevons universellement la performance du RAID.
Ce n'est cependant pas toujours une bonne approche, car en règle générale nous considérons le RAID en fonction de la capacité plutôt que de la performance ou du nombre de broches. Il serait très rare, mais assurément possible, que quelqu'un envisage une grappe RAID 6 de huit disques face à une grappe RAID 10 de huit disques. De temps à autre, cela se produira en raison d'une limitation de châssis ou d'une autre raison similaire. Mais en règle générale, les grappes RAID sont envisagées sous l'angle de la capacité totale de la grappe (c'est-à-dire la capacité utilisable) plutôt que du nombre de broches, de la performance ou de tout autre facteur. Il est donc étrange que nous passions ensuite à une vision de la performance du RAID en fonction du nombre de broches.
Si nous changeons notre point de vue et pivotons autour de la capacité comme facteur commun, tout en continuant de supposer que la capacité et la performance individuelles du disque (X) restent constantes entre les comparateurs, nous aboutissons alors à un paysage de performance complètement différent. Ce faisant, nous constatons, par exemple, que le RAID 0 n'est plus le niveau de RAID le plus performant et que la performance en lecture varie de façon spectaculaire au lieu d'être une constante.
La capacité est une chose capricieuse, mais nous pouvons la ramener au nombre de broches nécessaires pour atteindre la capacité souhaitée. Cela rend cette discussion bien plus aisée. Notre première étape consiste donc à déterminer le nombre de broches nécessaires pour la capacité brute. Si nous avons besoin d'une capacité de 10 To et que nous utilisons des disques de 1 To, il nous faudrait dix broches, par exemple. Ou si nous avons besoin de 3,2 To et que nous utilisons des disques de 600 Go, il nous faudrait six broches. Nous désignerons, à la différence de précédemment, notre nombre de broches par R. Comme précédemment, la performance du disque individuel est représentée par X. (R est utilisé ici pour indiquer qu'il s'agit du nombre de broches pour la capacité brute (Raw Capacity Count), plutôt que du nombre total (Number) de broches.)
Le RAID 0 reste simple : la performance est toujours RX, car il n'y a aucun disque supplémentaire. Les IOPS en lecture comme en écriture sont simplement NX.
Le RAID 10 a RX Write IOPS, mais 2RX Read IOPS. C'est spectaculaire. Tout à coup, lorsqu'on envisage la performance en fonction d'une capacité stable, nous constatons que le RAID 10 a une performance en lecture double de celle du RAID 0 !
Le RAID 5 devient légèrement plus délicat. Les Write IOPS s'exprimeraient par ((R + 1) × X)/4. Les Read IOPS s'expriment par ((R + 1) × X).
Le RAID 6, comme on s'y attend, suit le schéma que projette le RAID 5. Les Write IOPS pour le RAID 6 sont ((R + 2) × X)/6. Et les Read IOPS s'expriment par ((R + 2) × X).
Le RAID 7 s'inscrit exactement dans la lignée. Les Write IOPS du RAID 7 seraient ((R + 3) × X)/8. Et les Read IOPS sont ((R + 3) × X).
Ce point de vue change la façon dont nous concevons la performance et, lorsqu'on s'intéresse purement à la performance en lecture, le RAID 0 devient le niveau de RAID le plus lent plutôt que le plus rapide, et le RAID 10 devient le plus rapide à la fois en lecture et en écriture, quelles que soient les valeurs de R et de X !
Si nous prenons un exemple concret de 10 disques de 2 To pour atteindre 20 To de capacité utilisable, chaque disque ayant une performance de 100 IOPS, et que nous supposons un mélange 50/50, les IOPS résultants seraient : RAID 0 avec 1 000 Blended IOPS, RAID 10 avec 1 500 Blended IOPS (2 000 RIOPS / 1 000 WIOPS), RAID 5 avec 687,5 Blended IOPS (1 100 RIOPS / 275 WIOPS), RAID 6 avec 700 Blended IOPS (1 200 RIOPS / 200 WIOPS) et enfin RAID 7 avec 731,25 Blended IOPS (1 300 RIOPS / 162,5 WIOPS). Le RAID 10 est ici un vainqueur éclatant.
Latence et impact système avec le RAID logiciel
Comme je l'ai indiqué précédemment, le RAID 0 et le RAID 10 n'ont, dans les faits, aucune surcharge système à prendre en compte. L'opération de mise en miroir ne requiert pratiquement aucun effort de calcul et est, à toutes fins utiles, d'une petitesse incommensurable. Le RAID à parité, lui, a une surcharge de calcul, et cela se traduit par de la latence au niveau de la couche de stockage et par une consommation de ressources système. Bien entendu, si nous utilisons un RAID matériel, ces ressources sont dédiées à la grappe RAID et n'ont d'autre fonction que d'être consommées dans ce rôle. Si nous utilisons un RAID logiciel, en revanche, il s'agit de ressources système généralistes (principalement le processeur) qui sont consommées aux fins du traitement de la grappe RAID.
L'impact, même sur un très petit système doté d'une grande quantité de RAID, reste très faible, mais il peut être mesuré et devrait être pris en compte, ne serait-ce que légèrement. La latence et l'impact système sont directement liés l'un à l'autre.
Il n'existe pas de moyen simple d'énoncer la latence et l'impact système pour différents niveaux de RAID, si ce n'est de cette façon : le RAID 0 et le RAID 10 n'ont, dans les faits, aucune latence ni aucun impact, le RAID 5 a une certaine latence et un certain impact, le RAID 6 a une latence et un impact de calcul environ deux fois supérieurs à ceux du RAID 5, et le RAID 7 a une latence et un impact de calcul environ trois fois supérieurs à ceux du RAID 5.
Dans bien des cas, cette latence et cet impact système seront si faibles qu'ils ne pourront être mesurés avec les outils système standard, et à mesure que les processeurs modernes deviennent de plus en plus puissants, la latence et l'impact système continueront de diminuer. L'impact est considéré comme négligeable pour les systèmes RAID 5 et RAID 6, même sur du matériel d'entrée de gamme et grand public, depuis approximativement 2001. Mais il est possible, sur des systèmes fortement sollicités présentant une grande quantité d'activité RAID à parité, qu'une contention survienne entre le sous-système RAID et d'autres processus nécessitant des ressources système.
Référence : The IT Hollow — Understanding the RAID Penalty
Article initialement publié sur le Blog StorageCraft — RAID Performance.
