Praktisk RAID-prestanda
Att välja en RAID-nivå är en övning i att balansera många faktorer inklusive kostnad, tillförlitlighet, kapacitet och, förstås, prestanda. RAID-prestanda kan vara svårt att förstå, särskilt eftersom olika RAID-nivåer använder olika tekniker och beter sig ganska olika från varandra i vissa fall. I denna artikel vill jag utforska de vanliga RAID-nivåerna RAID 0, 5, 6 och 10 för att se hur prestandan skiljer sig mellan dem.
För denna artikels syften kommer RAID 1 att antas vara en delmängd av RAID 10. Detta är ofta ett behändigt sätt att tänka på RAID 1 – som att helt enkelt vara en RAID 10-array med endast en enda speglad parmedlem. Eftersom RAID 1 i själva verket är en enkelpars-RAID 10 och beter sig som en sådan, fungerar detta utmärkt för att göra RAID-prestanda lätt att förstå, eftersom det helt enkelt avbildas på RAID 10-prestandakurvan.
Det finns två typer av prestanda att se på med all lagring: läsning och skrivning. Vad gäller RAID är läsning extremt enkelt och skrivning ganska komplext. Läsprestanda är i praktiken stabil över alla RAID-typer. Skrivning är emellertid inte det.
För att göra diskussionen om prestanda enklare behöver vi definiera några termer, eftersom vi kommer att arbeta med vissa ekvationer. I våra diskussioner kommer vi att använda N för att representera det totala antalet enheter, ofta benämnda spindlar, i vår array, och vi kommer att använda X för att referera till prestandan hos varje enhet individuellt. Detta gör att vi kan tala i termer av relativ prestanda som en faktor av enhetsprestandan, vilket gör att vi kan abstrahera bort RAID-arrayen och inte behöva tänka i termer av rå IOPS. Detta är viktigt eftersom IOPS ofta är mycket svåra att definiera, men vi kan jämföra prestanda på ett meningsfullt sätt genom att tala om den i förhållande till de enskilda enheterna inom arrayen.
Det är också viktigt att komma ihåg att vi endast talar om prestandan hos själva RAID-arrayen, inte ett helt lagringsundersystem. Artefakter såsom minnescacher och solid state-cacher kommer att göra fantastiska saker för att förändra den övergripande prestandan hos ett lagringsundersystem, men förändrar inte fundamentalt prestandan hos själva RAID-arrayen under huven. Det finns ingen enkel formel för att fastställa hur olika cacheval kommer att påverka den övergripande prestandan, men det räcker med att säga att det kan vara mycket dramatiskt, men detta beror i hög grad inte bara på själva cachevalen utan också i hög grad på arbetslasten. Inte ens de största, snabbaste, mest robusta cachevalen kan förändra den långsiktiga, uthålliga prestandan hos en array.
RAID är komplext och många faktorer påverkar den slutliga prestandan. En är själva implementeringen av RAID-systemet. En dålig implementering kan orsaka latens eller kan misslyckas med att dra nytta av de tillgängliga spindlarna (såsom att ha en RAID 1-array som läser endast från en enda disk i stället för från båda samtidigt!) Det finns inget enkelt sätt att ta hänsyn till brister i specifika RAID-implementeringar, så vi måste anta att alla arbetar upp till specifikationens gränser, som förvisso varje företagsklassat RAID-system kommer att göra. Det är främst hobby- och konsument-RAID-system som misslyckas med att göra detta.
Vissa typer av RAID har också dramatiska mängder beräkningsmässig omkostnad förknippad med sig medan andra inte har det. Främst paritets-RAID-nivåer kräver tung bearbetning för att hantera skrivoperationer, där olika nivåer har olika mängder beräkning nödvändig för varje operation. Detta introducerar latens, men begränsar inte genomströmningen. Denna latens kommer emellertid att variera, baserat på implementeringen av RAID-nivån såväl som på bearbetningskapaciteten hos systemet i fråga. Hårdvaru-RAID kommer att använda något i stil med en generell CPU (ofta en Power- eller ARM-RISC-processor) eller en specialanpassad ASIC för att hantera detta, medan mjukvaru-RAID överlämnar detta till serverns egen CPU. Ofta är serverns CPU faktiskt snabbare här, men förbrukar systemresurser. ASIC:ar kan vara mycket snabba men är dyra att producera. Denna latens påverkar lagringsprestanda men är mycket svår att förutsäga och kan variera från nominell till dramatisk. Så jag kommer att nämna den relativa latenspåverkan vid varje RAID-nivå men kommer inte att försöka mäta den. I de flesta RAID-prestandaberäkningar ignoreras denna latens, men det är viktigt att förstå att den är närvarande och skulle kunna, beroende på arrayens konfiguration, ha en märkbar påverkan på en arbetslast.
Det bör nämnas att det finns en pytteliten prestandapåverkan på läsoperationer på grund av effektivitet i layouten av data på själva disken. Paritets-RAID kräver att det finns data på diskarna som är oanvändbara under en frisk läsoperation men inte kan användas för att påskynda den. Detta resulterar faktiskt i att den blir något långsammare. Men denna påverkan är löjligt liten och mäts normalt inte och kan därför ignoreras.
Faktorer såsom stripe-storlek påverkar förstås också prestandan, men eftersom det är konfigurerbart och inte en inneboende artefakt i någon RAID-nivå kommer jag att ignorera det här. Det är inte en faktor när man väljer en RAID-nivå i sig, utan endast när man konfigurerar en sådan när den väl är vald.
Den sista faktorn som jag vill nämna är läs-till-skriv-förhållandet hos lagringsoperationer. Vissa RAID-arrayer kommer att användas nästan rent för läsoperationer, vissa nästan enbart för skrivoperationer, men de flesta använder en blandning av de två, sannolikt något i stil med åttio procent läsning och tjugo procent skrivning. Detta förhållande är mycket viktigt för att förstå den prestanda som du kommer att få ut av din specifika RAID-array och för att förstå hur varje RAID-nivå kommer att påverka dig. Jag refererar till detta som läs-/skrivblandningen.
Vi mäter lagringsprestanda främst i IOPS. IOPS står för Input/Output Operations Per Second (in-/utmatningsoperationer per sekund) (ja, jag vet att bokstäverna inte stämmer överens särskilt väl, det är som det är.) Vidare använder jag termerna RIOPS för Read IOPS (läs-IOPS), WIOPS för Write IOPS (skriv-IOPS) och BIOPS för Blended IOPS (blandad IOPS), vilket skulle komma med ett förhållande på 80/20 eller vad det nu må vara. Många talar om lagringsprestanda med en enda IOPS-siffra. När detta görs menar de normalt Blended IOPS vid 50/50. Det är emellertid sällan som någon arbetslast körs vid 50/50, så den siffran kan vara extremt vilseledande. Två siffror, RIOPS och WIOPS, är vad som behövs för att förstå prestanda, och dessa två tillsammans kan användas för att finna vilken IOPS-blandning som helst som behövs. Till exempel är en 50/50-blandning så enkel som (RIOPS * 0,5) + (WIOPS * 0,5). Den vanligare 80/20-blandningen skulle vara (RIOPS * 0,8) + (WIOPS * 0,2).
Nu när vi har fastställt vissa kriterier och en bakgrundsförståelse kommer vi att fördjupa oss i själva våra RAID-nivåer och se hur prestanda varierar mellan dem.
För alla RAID-nivåer beräknas Read IOPS-siffran med hjälp av NX. Detta tar förstås inte hänsyn till de nominella omkostnadssiffror som jag nämner ovan. Detta är en “bästa fall”-siffra, men den verkliga siffran är så nära att det är mycket praktiskt att helt enkelt använda denna formel. Vi tar alltså antalet spindlar (N) och multiplicerar med IOPS-prestandan hos en enskild enhet (X). Kom ihåg att enheter ofta har olika läs- och skrivprestanda, så se till att använda enhetens Read IOPS-klassning eller testade hastighet för Read IOPS-beräkningen och Write IOPS-takten eller testade hastigheten för Write IOPS-beräkningen.
RAID 0
RAID 0 är den lättaste RAID-nivån att förstå eftersom det i praktiken inte finns någon omkostnad att bekymra sig om, inga resurser förbrukade för att driva det och både läsning och skrivning får den fulla nyttan av varje spindel, hela tiden. Så för RAID 0 är vår formel för skrivprestanda mycket enkel: NX. RAID 0 är alltid den mest presterande RAID-nivån.
Ett exempel skulle vara en RAID 0-array med åtta spindlar. Om en enskild enhet i arrayen levererar 125 IOPS skulle vår beräkning vara utifrån N = 8 och X = 125, alltså 8 * 125, vilket ger 1 000 IOPS. Eftersom både läs- och skriv-IOPS är desamma här, är det extremt enkelt, eftersom vi får 1K RIOPS, 1K WIOPS och 1K vid varje blandning därav. Mycket enkelt. Om vi inte kände till den absoluta IOPS-siffran hos en enskild spindel skulle vi kunna referera till en RAID 0-array med åtta spindlar som att den levererar 8X Blended IOPS.
RAID 10
RAID 10 har den näst enklaste RAID-nivån att beräkna. Eftersom RAID 10 är en RAID 0-stripe av speglade uppsättningar, har vi ingen omkostnad att bekymra oss om från stripen, men varje spegel måste skriva samma data två gånger för att skapa speglingen. Detta halverar vår skrivprestanda jämfört med en RAID 0-array med samma antal enheter. Vilket ger oss en formel för skrivprestanda som helt enkelt är: NX/2 eller 0,5NX.
Det bör noteras att vid samma kapacitet, snarare än samma antal spindlar, har RAID 10 samma skrivprestanda som RAID 0 men dubbel läsprestanda – helt enkelt eftersom det krävs dubbelt så många spindlar för att matcha samma kapacitet.
Så en RAID 10-array med åtta spindlar skulle vara N = 8 och X = 125 och vår resulterande beräkning blir (8 * 125)/2, vilket är 500 WIOPS eller 4X WIOPS. En 50/50-blandning skulle resultera i 750 Blended IOPS (1 000 Read IOPS och 500 Write IOPS.)
Denna formel gäller för RAID 1, RAID 10, RAID 100 och RAID 01 lika.
Ovanliga alternativ såsom trippelspegling i RAID 10 skulle förändra denna skrivpåföljd. RAID 10 med trippelspegling skulle exempelvis vara NX/3.
RAID 5
Även om RAID 5 är utfasat och aldrig bör användas i nya arrayer inkluderar jag det här eftersom det är en välkänd och vanligt använd RAID-nivå och dess prestanda behöver förstås. RAID 5 är den mest grundläggande av de moderna paritets-RAID-nivåerna. RAID 2, 3 och 4 återfinns inte längre i produktionssystem och så vi kommer inte att se på deras prestanda här. RAID 5, även om det inte rekommenderas för användning i dag, är grunden för andra moderna paritets-RAID-nivåer och är därför viktigt att förstå.
Paritets-RAID tillför ett något komplicerat behov av att verifiera och skriva om paritet vid varje skrivning som går till disk. Detta innebär att en RAID 5-array kommer att behöva läsa datat, läsa pariteten, skriva datat och slutligen skriva pariteten. Fyra operationer för varje effektiv en. Detta ger oss en skrivpåföljd på RAID 5 på fyra. Så formeln för RAID 5-skrivprestanda är NX/4.
Så genom att följa exemplet med åtta spindlar där skriv-IOPS hos en enskild spindel är 125 skulle vi få följande beräkning: (8 * 125)/4 eller 2X Write IOPS vilket blir 250 WIOPS. I en 50/50-blandning skulle detta resultera i 625 Blended IOPS.
RAID 6
RAID 6 är, efter RAID 10, troligen den vanligaste och mest användbara RAID-nivån i bruk i dag. RAID 6 är emellertid baserat på RAID 5 och har ytterligare en paritetsnivå. Detta gör det dramatiskt säkrare än RAID 5, vilket är mycket viktigt, men ålägger också en dramatisk skrivpåföljd eftersom varje skrivoperation kräver att diskarna läser datat, läser den första pariteten, läser den andra pariteten, skriver datat, skriver den första pariteten och sedan slutligen skriver den andra pariteten. Detta blir en sexfaldig skrivpåföljd, vilket är ganska dramatiskt. Så vår formel är NX/6.
Genom att fortsätta vårt exempel får vi (8 * 125)/6 vilket blir ~167 Write IOPS eller 1,33X. I vårt 50/50-blandningsexempel är detta en prestanda på 583,5 Blended IOPS. Som du kan se orsakar paritetsskrivningar en mycket snabb minskning av skrivprestanda och ett märkbart fall i blandad prestanda.
RAID 7 (även känt som RAID 5.3 eller RAID 7.3)
RAID 7 är en något icke-standardiserad RAID-nivå med trippelparitet baserad på den befintliga enkelpariteten hos RAID 5 och den befintliga dubbelpariteten hos RAID 6. Den enda nuvarande implementeringen av RAID 7 är ZFS RAIDZ3. Eftersom RAID 7 innehåller all omkostnad från både RAID 5 och RAID 6 plus den ytterligare omkostnaden från den tredje paritetskomponenten har vi en skrivpåföljd på hisnande åtta gånger. Så vår formel för att finna RAID 7-skrivprestanda är NX/8.
I vårt exempel skulle detta innebära att (8 * 125)/8 skulle bli 125 Write IOPS eller 1X. Så med åtta enheter i vår array skulle vi endast få skrivprestandan hos en enda, fristående enhet. Det är en betydande omkostnad. Vår blandade 50/50-IOPS skulle bli endast 562,5.
Komplex RAID
Komplexa RAID-nivåer eller nästlade RAID-nivåer såsom RAID 50, 60, 61, 16 och så vidare kan finnas med hjälp av informationen ovan genom att bryta ner RAID:en i dess beståndsdelar och tillämpa var och en med hjälp av de formler som tillhandahållits ovan. Det finns ingen enkel formel för dessa nivåer eftersom de har varierande konfigurationer. Det är nödvändigt att bryta ner dem i deras beståndsdelar och tillämpa formlerna flera gånger.
RAID 60 med tolv enheter, två uppsättningar om sex enheter, där varje enhet är 150 IOPS skulle göras med två RAID 6:or. Det skulle vara NX hos RAID 0 där N är två (för två RAID 6-arrayer) och X är den resulterande prestandan hos varje RAID 6. Varje RAID 6-uppsättning skulle vara (6 * 150)/6. Så hela arrayen skulle vara 2((6 * 150)/6). Vilket resulterar i 300 Write IOPS.
Samma exempel som ovan men konfigurerat som RAID 61, ett speglat par av RAID 6-arrayer, skulle vara samma prestanda per RAID 6-array, men tillämpat på RAID 1-formeln som är NX/2 (där X är den resulterande prestandan hos varje RAID-array.) Så den slutliga formeln skulle vara 2((6 * 150)/6)/2 vilket blir 150 Write IOPS från tolv enheter.
Prestanda som en faktor av kapacitet
När vi producerar RAID-prestandaformler tänker vi på dessa i termer av antalet spindlar, vilket är oerhört vettigt. Detta är mycket användbart för att fastställa prestandan hos en föreslagen array eller till och med en befintlig sådan där mätning inte är möjlig, och låter oss jämföra den relativa prestandan mellan olika föreslagna alternativ. Det är i dessa termer som vi universellt tänker på RAID-prestanda.
Detta är emellertid inte alltid ett bra tillvägagångssätt, eftersom vi vanligtvis ser på RAID som en faktor av kapacitet snarare än av prestanda eller spindelantal. Det skulle vara mycket sällsynt, men förvisso möjligt, att någon skulle överväga en RAID 6-array med åtta enheter gentemot en RAID 10-array med åtta enheter. En och annan gång kommer detta att inträffa på grund av en chassibegränsning eller något annat, liknande skäl. Men vanligtvis betraktas RAID-arrayer utifrån synvinkeln total arraykapacitet (t.ex. användbar kapacitet) snarare än spindelantal, prestanda eller någon annan faktor. Det är därför märkligt att vi sedan skulle övergå till att betrakta RAID-prestanda som en funktion av spindelantal.
Om vi ändrar vår synvinkel och pivoterar kring kapacitet som den gemensamma faktorn, samtidigt som vi fortfarande antar att den enskilda enhetens kapacitet och prestanda (X) förblir konstant mellan jämförelseobjekten, kommer vi fram till ett helt annat prestandalandskap. Genom att göra detta ser vi, till exempel, att RAID 0 inte längre är den mest presterande RAID-nivån och att läsprestandan varierar dramatiskt i stället för att vara en konstant.
Kapacitet är en nyckfull sak, men vi kan destillera ut den till antalet spindlar som är nödvändiga för att nå önskad kapacitet. Detta gör denna diskussion långt enklare. Så vårt första steg är att fastställa vårt spindelantal som behövs för rå kapacitet. Om vi behöver en kapacitet på 10 TB och använder 1 TB-enheter, skulle vi exempelvis behöva tio spindlar. Eller om vi behöver 3,2 TB och använder 600 GB-enheter skulle vi behöva sex spindlar. Vi kommer, till skillnad från tidigare, att referera till vårt spindelantal som R. Som tidigare representeras den enskilda enhetens prestanda som X. (R används här för att beteckna att detta är Raw Capacity Count, den råa kapacitetsräkningen, snarare än det totala antalet (Number) spindlar.)
RAID 0 förblir enkelt, prestandan är fortfarande RX eftersom det inte finns några ytterligare enheter. Både läs- och skriv-IOPS är helt enkelt NX.
RAID 10 har RX Write IOPS men 2RX Read IOPS. Detta är dramatiskt. Plötsligt, när vi betraktar prestanda som en faktor av stabil kapacitet, finner vi att RAID 10 har dubbel läsprestanda jämfört med RAID 0!
RAID 5 blir något knepigare. Write IOPS skulle uttryckas som ((R + 1) * X)/4. Read IOPS uttrycks som ((R + 1) * X).
RAID 6 följer, som vi förväntar oss, mönstret som RAID 5 projicerar. Write IOPS för RAID 6 är ((R + 2) * X)/6. Och Read IOPS uttrycks som ((R + 2) * X).
RAID 7 faller rakt i linje. RAID 7 Write IOPS skulle vara ((R + 3) * X)/8. Och Read IOPS är ((R + 3) * X).
Denna utsiktspunkt förändrar det sätt på vilket vi tänker på prestanda, och när vi ser rent på läsprestanda blir RAID 0 den långsammaste RAID-nivån snarare än den snabbaste, och RAID 10 blir den snabbaste för både läsning och skrivning oavsett vilka värdena är för R och X!
Om vi tar ett verkligt exempel med 10 stycken 2 TB-enheter för att uppnå 20 TB användbar kapacitet med varje enhet som har 100 IOPS prestanda och antar en 50/50-blandning, skulle den resulterande IOPS-siffran bli: RAID 0 med 1 000 Blended IOPS, RAID 10 med 1 500 Blended IOPS (2 000 RIOPS / 1 000 WIOPS), RAID 5 med 687,5 Blended IOPS (1 100 RIOPS / 275 WIOPS), RAID 6 med 700 Blended IOPS (1 200 RIOPS / 200 WIOPS) och slutligen RAID 7 med 731,25 Blended IOPS (1 300 RIOPS / 162,5 WIOPS.) RAID 10 är en dramatisk vinnare här.
Latens och systempåverkan med mjukvaru-RAID
Som jag har angett tidigare har RAID 0 och RAID 10, i praktiken, ingen systemomkostnad att beakta. Speglingsoperationen kräver i princip ingen beräkningsmässig ansträngning och är, för alla praktiska syften, omätbart liten. Paritets-RAID har beräkningsmässig omkostnad och detta resulterar i latens vid lagringslagret och i att systemresurser förbrukas. Om vi använder hårdvaru-RAID är dessa resurser förstås dedikerade till RAID-arrayen och har ingen annan funktion än att förbrukas i denna roll. Om vi använder mjukvaru-RAID är dessa emellertid generella systemresurser (främst CPU) som förbrukas för RAID-arrayens bearbetning.
Påverkan på även ett mycket litet system med en stor mängd RAID är fortfarande mycket liten, men den kan mätas och bör beaktas, om än bara lätt. Latens och systempåverkan är direkt relaterade till varandra.
Det finns inget enkelt sätt att ange latens och systempåverkan för olika RAID-nivåer förutom på detta sätt: RAID 0 och RAID 10 har i praktiken ingen latens eller påverkan, RAID 5 har en viss latens och påverkan, RAID 6 har ungefär dubbelt så mycket beräkningsmässig latens och påverkan som RAID 5 och RAID 7 har ungefär tredubbelt så mycket beräkningsmässig latens och påverkan som RAID 5.
I många fall kommer denna latens och systempåverkan att vara så liten att de inte kan mätas med standardiserade systemverktyg, och allteftersom moderna processorer blir alltmer kraftfulla kommer latensen och systempåverkan att fortsätta att avta. Påverkan har ansetts försumbar för RAID 5- och RAID 6-system på till och med enklare standardhårdvara sedan ungefär 2001. Men det är möjligt på tungt belastade system med en stor mängd paritets-RAID-aktivitet att det skulle kunna finnas konkurrens mellan RAID-undersystemet och andra processer som kräver systemresurser.
Referens: The IT Hollow – Understanding the RAID Penalty
Artikeln ursprungligen postad på StorageCraft-bloggen – RAID Performance.
