Praktyczna Wydajność RAID
Wybór poziomu RAID to ćwiczenie polegające na balansowaniu wielu czynników, w tym kosztu, niezawodności, pojemności i, oczywiście, wydajności. Wydajność RAID może być trudna do zrozumienia, zwłaszcza że różne poziomy RAID stosują różne techniki i w niektórych przypadkach zachowują się dość różnie. W tym artykule chcę zbadać popularne poziomy RAID: RAID 0, 5, 6 i 10, by sprawdzić, jak wydajność różni się między nimi.
Na potrzeby tego artykułu RAID 1 będzie traktowany jako podzbiór RAID 10. Jest to często wygodny sposób myślenia o RAID 1 — jako po prostu macierzy RAID 10 z tylko jedną parą lustrzaną. Ponieważ RAID 1 jest prawdziwie pojedynczą parą RAID 10 i zachowuje się jak taki, doskonale sprawdza się to w ułatwieniu zrozumienia wydajności RAID, ponieważ po prostu mapuje się na krzywą wydajności RAID 10.
Istnieją dwa typy wydajności do zbadania we wszystkich magazynach danych: odczyt i zapis. W przypadku RAID odczyt jest niezwykle prosty, a zapis jest dość złożony. Wydajność odczytu jest efektywnie stabilna we wszystkich typach RAID. Zapis jednak nie.
Aby ułatwić omówienie wydajności, musimy zdefiniować kilka terminów, ponieważ będziemy pracować z pewnymi równaniami. W naszych rozważaniach będziemy używać N do reprezentowania całkowitej liczby dysków, często nazywanych wrzecionami (spindles), w naszej macierzy, a X do reprezentowania wydajności każdego dysku indywidualnie. Pozwala nam to mówić o wydajności względnej jako mnożniku wydajności dysku, umożliwiając nam abstrahowanie od macierzy RAID i niepotrzebne myślenie w kategoriach surowych IOPS. Jest to ważne, ponieważ IOPS są często bardzo trudne do zdefiniowania, ale możemy porównywać wydajność w sensowny sposób, mówiąc o niej w odniesieniu do poszczególnych dysków w macierzy.
Ważne jest również pamiętanie, że mówimy tylko o wydajności samej macierzy RAID, a nie całego podsystemu storage. Elementy takie jak pamięci podręczne (cache) RAM i pamięci podręczne na bazie SSD zrobią niesamowite rzeczy z ogólną wydajnością podsystemu storage, ale nie zmieniają fundamentalnie wydajności samej macierzy RAID pod spodem. Nie ma prostego wzoru na określenie, jak różne opcje cache wpłyną na ogólną wydajność, ale wystarczy powiedzieć, że może to być bardzo dramatyczne, zależąc mocno nie tylko od samych wyborów cache, ale też w dużej mierze od obciążenia roboczego. Nawet największe, najszybsze i najbardziej zaawansowane opcje cache nie mogą zmienić długoterminowej, trwałej wydajności macierzy.
RAID jest złożony i wiele czynników wpływa na ostateczną wydajność. Jednym z nich jest implementacja samego systemu RAID. Słaba implementacja może powodować opóźnienia lub może nie wykorzystywać dostępnych wrzecion (na przykład mając macierz RAID 1 odczytującą tylko z jednego dysku zamiast z obu jednocześnie!). Nie ma łatwego sposobu na uwzględnienie wad konkretnych implementacji RAID, więc musimy zakładać, że wszystkie działają w granicach specyfikacji, co istotnie robi każdy korporacyjny system RAID. Głównie hobbystyczne i konsumenckie systemy RAID nie spełniają tego warunku.
Niektóre typy RAID mają również dramatyczną ilość narzutu obliczeniowego z nimi związanego, podczas gdy inne nie. Przede wszystkim parytetowe poziomy RAID wymagają intensywnego przetwarzania w celu obsługi operacji zapisu, przy czym różne poziomy wymagają różnych ilości obliczeń na każdą operację. To wprowadza opóźnienie (latency), ale nie ogranicza przepustowości. To opóźnienie będzie się jednak różnić w zależności od implementacji poziomu RAID, jak również od możliwości obliczeniowych danego systemu. Sprzętowy RAID użyje czegoś w rodzaju ogólnego procesora (często procesora RISC Power lub ARM) lub dedykowanego ASIC do obsługi tego, podczas gdy programowy RAID przekazuje to własnym CPU serwera. Często CPU serwera jest tu faktycznie szybszy, ale zużywa zasoby systemowe. ASIC może być bardzo szybki, ale jest drogi w produkcji. To opóźnienie wpływa na wydajność storage, ale jest bardzo trudne do przewidzenia i może wahać się od nominalnego do dramatycznego. Dlatego wspomnę o względnym wpływie na opóźnienie dla każdego poziomu RAID, ale nie będę próbować go mierzyć. W większości obliczeń wydajności RAID to opóźnienie jest ignorowane, ale ważne jest, by rozumieć, że jest obecne i może — w zależności od konfiguracji macierzy — mieć zauważalny wpływ na obciążenie.
Warto wspomnieć, że istnieje niewielki wpływ na wydajność odczytu ze względu na efektywność układu danych na dysku. Parytetowy RAID wymaga, by na dyskach znajdowały się dane bezużyteczne podczas zdrowej operacji odczytu, których nie można użyć do jej przyspieszenia. W rzeczywistości sprawia to, że jest nieznacznie wolniejszy. Ale ten wpływ jest śmiesznie mały i normalnie nie jest mierzony, więc można go zignorować.
Czynniki takie jak rozmiar paska (stripe size) również wpływają na wydajność, oczywiście, ale ponieważ jest to konfigurowalne i nie jest nieodłącznym artefaktem żadnego poziomu RAID, zignoruje się to tutaj. Nie jest to czynnik przy wyborze poziomu RAID, ale tylko przy konfigurowaniu go po wybraniu.
Ostatnim czynnikiem, o którym chcę wspomnieć, jest stosunek odczytu do zapisu operacji storage. Niektóre macierze RAID będą używane niemal wyłącznie do operacji odczytu, niektóre prawie wyłącznie do zapisu, ale większość używa mieszanki obu — prawdopodobnie coś w rodzaju osiemdziesięciu procent odczytu i dwudziestu procent zapisu. Ten stosunek jest bardzo ważny dla zrozumienia wydajności, jaką uzyskasz z konkretnej macierzy RAID, i dla zrozumienia, jak każdy poziom RAID wpłynie na Ciebie. Nazywam to mieszanką odczyt/zapis (read/write blend).
Wydajność storage mierzymy przede wszystkim w IOPS. IOPS oznacza operacje wejścia/wyjścia na sekundę (Input/Output Operations Per Second). Dalej używam terminów RIOPS dla IOPS odczytu, WIOPS dla IOPS zapisu i BIOPS dla zmieszanych IOPS przy proporcji 80/20 lub dowolnej innej. Wiele osób mówi o wydajności storage z jedną liczbą IOPS. Gdy tak jest, zazwyczaj mają na myśli zmieszane IOPS przy 50/50. Jednak rzadko kiedy jakiekolwiek obciążenie pracuje w proporcji 50/50, więc ta liczba może być bardzo myląca. Dwie liczby — RIOPS i WIOPS — to to, czego potrzeba do zrozumienia wydajności, i te dwie razem mogą być używane do znalezienia dowolnej mieszanki IOPS. Na przykład mieszanka 50/50 to po prostu (RIOPS * 0,5) + (WIOPS * 0,5). Bardziej powszechna mieszanka 80/20 to (RIOPS * 0,8) + (WIOPS * 0,2).
Teraz, gdy ustaliliśmy pewne kryteria i podstawowe zrozumienie, zagłębimy się w nasze poziomy RAID i zobaczymy, jak wydajność różni się między nimi.
Dla wszystkich poziomów RAID liczba RIOPS jest obliczana przy użyciu NX. Oczywiście nie uwzględnia to nominalnych liczb narzutu, o których wspomniałem powyżej. Jest to liczba “w najlepszym przypadku”, ale rzeczywista liczba jest tak bliska, że bardzo praktyczne jest po prostu użycie tego wzoru. Bierze się liczbę wrzecion (N) i mnoży przez wydajność IOPS indywidualnego dysku (X). Pamiętaj, że dyski często mają różną wydajność odczytu i zapisu, więc upewnij się, że używasz nominalnej prędkości odczytu IOPS dysku lub przetestowanej prędkości dla obliczenia RIOPS oraz nominalnej prędkości zapisu IOPS lub przetestowanej prędkości dla obliczenia WIOPS.
RAID 0
RAID 0 jest najłatwiejszym poziomem RAID do zrozumienia, ponieważ efektywnie nie ma narzutu do martwienia się, nie ma zasobów zużywanych do jego zasilania, a zarówno odczyt, jak i zapis korzystają w pełni z każdego wrzeciona przez cały czas. Więc dla RAID 0 nasz wzór na wydajność zapisu jest bardzo prosty: NX. RAID 0 jest zawsze najbardziej wydajnym poziomem RAID.
Przykładem byłaby macierz RAID 0 z ośmioma wrzecionami. Jeśli indywidualny dysk w macierzy dostarcza 125 IOPS, to nasze obliczenie byłoby z N = 8 i X = 125, więc 8 * 125 dając 1000 IOPS. Ponieważ zarówno RIOPS, jak i WIOPS są tu takie same, jest to niezwykle proste — uzyskujemy 1K RIOPS, 1K WIOPS i 1K przy dowolnej mieszance. Bardzo prosto. Gdybyśmy nie znali bezwzględnego IOPS indywidualnego wrzeciona, moglibyśmy określić macierz RAID 0 z ośmioma wrzecionami jako dostarczającą 8X zmieszanych IOPS.
RAID 10
RAID 10 ma drugi najprostszy poziom RAID do obliczenia. Ponieważ RAID 10 to RAID 0 stripe z zestawami lustrzanymi, nie ma narzutu do martwienia się ze stripe'a, ale każde lustro musi pisać te same dane dwa razy, by stworzyć lustrzenie. To obcina naszą wydajność zapisu o połowę w porównaniu z macierzą RAID 0 z tą samą liczbą dysków. Daje to nam wzór na wydajność zapisu: NX/2 lub 0,5NX.
Należy zauważyć, że przy tej samej pojemności, a nie tej samej liczbie wrzecion, RAID 10 ma taką samą wydajność zapisu jak RAID 0, ale podwójną wydajność odczytu — po prostu dlatego, że wymaga dwukrotnie więcej wrzecion, by dopasować tę samą pojemność.
Tak więc macierz RAID 10 z ośmioma wrzecionami to N = 8 i X = 125, a wynikowe obliczenie wynosi (8 * 125)/2, co daje 500 WIOPS lub 4X WIOPS. Mieszanka 50/50 da 750 zmieszanych IOPS (1000 RIOPS i 500 WIOPS).
Ta formuła ma zastosowanie do RAID 1, RAID 10, RAID 100 i RAID 01 równie dobrze.
Niepospolite opcje, takie jak potrójne lustrzenie w RAID 10, zmieniłyby tę karę za zapis. RAID 10 z potrójnym lustrzeniem to na przykład NX/3.
RAID 5
Choć RAID 5 jest przestarzały i nie powinien być nigdy używany w nowych macierzach, dołączam go tutaj, ponieważ jest dobrze znany i powszechnie używanym poziomem RAID i jego wydajność musi być rozumiana. RAID 5 jest najbardziej podstawowym nowoczesnym parytetowym poziomem RAID. RAID 2, 3 i 4 nie są już spotykane w systemach produkcyjnych, więc nie będziemy tu badać ich wydajności. RAID 5, choć nie zalecany do użycia dzisiaj, jest podstawą innych nowoczesnych parytetowych poziomów RAID, więc ważne jest, by go rozumieć.
Parytetowy RAID dodaje dość skomplikowaną potrzebę weryfikacji i ponownego zapisu parzystości przy każdym zapisie na dysk. Oznacza to, że macierz RAID 5 będzie musiała odczytać dane, odczytać parzystość, zapisać dane i na końcu zapisać parzystość. Cztery operacje na każdą efektywną jedną. To daje nam karę za zapis w RAID 5 wynoszącą cztery. Więc wzór na wydajność zapisu RAID 5 to NX/4.
Tak więc śledząc przykład z ośmioma wrzecionami, gdzie WIOPS indywidualnego wrzeciona wynosi 125, otrzymujemy następujące obliczenie: (8 * 125)/4 lub 2X WIOPS zapisu, co daje 250 WIOPS. W mieszance 50/50 dałoby to 625 zmieszanych IOPS.
RAID 6
RAID 6 po RAID 10 jest prawdopodobnie najczęstszym i najbardziej przydatnym poziomem RAID w użyciu dzisiaj. RAID 6 jest jednak oparty na RAID 5 i ma dodatkowy poziom parzystości. To sprawia, że jest dramatycznie bezpieczniejszy niż RAID 5, co jest bardzo ważne, ale nakłada też dramatyczną karę za zapis, ponieważ każda operacja zapisu wymaga od dysków odczytania danych, odczytania pierwszej parzystości, odczytania drugiej parzystości, zapisu danych, zapisu pierwszej parzystości i na końcu zapisu drugiej parzystości. Wychodzi to na sześciokrotną karę za zapis, co jest dość dramatyczne. Więc nasz wzór to NX/6.
Kontynuując nasz przykład, otrzymujemy (8 * 125)/6, co wychodzi na ~167 WIOPS zapisu lub 1,33X. W naszym przykładzie mieszanki 50/50 daje to wydajność 583,5 zmieszanych IOPS. Jak widać, zapisy parytetowe powodują bardzo szybki spadek wydajności zapisu i zauważalny spadek wydajności zmieszanej.
RAID 7 (aka RAID 5.3 lub RAID 7.3)
RAID 7 to nieco niestandardowy poziom RAID z potrójną parytetą oparty na istniejącej pojedynczej parytecie RAID 5 i istniejącej podwójnej parytecie RAID 6. Jedyną obecną implementacją RAID 7 jest RAIDZ3 systemu ZFS. Ponieważ RAID 7 zawiera wszystkie narzuty zarówno RAID 5, jak i RAID 6 plus dodatkowy narzut trzeciego komponentu parytetowego, mamy karę za zapis wynoszącą aż osiem razy. Więc nasz wzór na wydajność zapisu RAID 7 to NX/8.
W naszym przykładzie oznaczałoby to, że (8 * 125)/8 dałoby 125 WIOPS zapisu lub 1X. Tak więc przy ośmiu dyskach w naszej macierzy uzyskalibyśmy tylko wydajność zapisu jednego, samodzielnego dysku. To znaczący narzut. Nasze zmieszane IOPS 50/50 wyniósłby zaledwie 562,5.
Złożone RAID
Złożone lub zagnieżdżone poziomy RAID, takie jak RAID 50, 60, 61, 16 itp., można znaleźć używając powyższych informacji, rozkładając RAID na jego składowe i stosując każdą z nich przy użyciu wzorów podanych powyżej. Nie ma prostego wzoru dla tych poziomów, ponieważ mają różne konfiguracje. Konieczne jest rozkładanie ich na składowe i wielokrotne stosowanie wzorów.
RAID 60 z dwunastoma dyskami, dwiema grupami po sześć dysków, gdzie każdy dysk ma 150 IOPS, byłby wykonany z dwoma RAID 6. Byłoby to NX RAID 0, gdzie N wynosi dwa (dla dwóch macierzy RAID 6), a X to wynikowa wydajność każdego RAID 6. Każda grupa RAID 6 wynosiłaby (6 * 150)/6. Więc pełna macierz byłaby 2((6 * 150)/6), co daje 300 WIOPS zapisu.
Ten sam przykład co powyżej, ale skonfigurowany jako RAID 61 — lustrzana para macierzy RAID 6 — miałby taką samą wydajność na macierz RAID 6, ale zastosowaną do wzoru RAID 1, czyli NX/2 (gdzie X to wynikowa wydajność każdej macierzy RAID). Więc ostateczny wzór wyniósłby 2((6 * 150)/6)/2, dając 150 WIOPS zapisu z dwunastu dysków.
Wydajność jako Czynnik Pojemności
Kiedy produkujemy wzory wydajności RAID, myślimy o nich w kategoriach liczby wrzecion, co jest niezwykle sensowne. Jest to bardzo przydatne do określenia wydajności proponowanej macierzy lub nawet istniejącej, gdzie pomiar nie jest możliwy, i pozwala nam porównywać względną wydajność między różnymi proponowanymi opcjami. To w tych terminach powszechnie myślimy o wydajności RAID.
Nie zawsze jest to jednak dobre podejście, ponieważ zazwyczaj patrzymy na RAID jako czynnik pojemności, a nie wydajności lub liczby wrzecion. Byłoby bardzo rzadkie, ale z pewnością możliwe, że ktoś rozważałby macierz RAID 6 z ośmioma dyskami w porównaniu z macierzą RAID 10 z ośmioma dyskami. Od czasu do czasu zdarza się to z powodu ograniczeń obudowy lub innego podobnego powodu. Ale zazwyczaj macierze RAID są postrzegane z punktu widzenia całkowitej pojemności macierzy (np. pojemności użytkowej) zamiast liczby wrzecion, wydajności lub jakiegokolwiek innego czynnika. Jest więc nieco dziwne, że powinniśmy następnie przełączać się na postrzeganie wydajności RAID jako funkcji liczby wrzecion.
Jeśli zmienimy nasz punkt widzenia i obierzemy pojemność jako wspólny czynnik, zakładając jednocześnie, że indywidualna pojemność dysku i wydajność (X) pozostają stałe między porównywaną, dochodzimy do zupełnie innego krajobrazu wydajności. Robiąc to, widzimy na przykład, że RAID 0 nie jest już najbardziej wydajnym poziomem RAID i że wydajność odczytu dramatycznie się różni zamiast być stałą.
Pojemność jest kapryśna, ale możemy ją sprowadzić do liczby wrzecion potrzebnych do osiągnięcia pożądanej pojemności. To sprawia, że ta dyskusja jest znacznie łatwiejsza. Więc naszym pierwszym krokiem jest określenie potrzebnej liczby wrzecion dla surowej pojemności. Jeśli potrzebujemy pojemności 10 TB i używamy dysków 1 TB, potrzebowalibyśmy dziesięciu wrzecion. Lub jeśli potrzebujemy 3,2 TB i używamy dysków 600 GB, potrzebowalibyśmy sześciu wrzecion. Inaczej niż poprzednio, będziemy odnosić się do naszej liczby wrzecion jako R. Jak poprzednio, wydajność indywidualnego dysku jest reprezentowana jako X. (R jest tu używane, by oznaczyć, że jest to liczba dla surowej pojemności, a nie całkowita liczba wrzecion.)
RAID 0 pozostaje prosty — wydajność to nadal RX, ponieważ nie ma dodatkowych dysków. Zarówno RIOPS, jak i WIOPS to po prostu RX.
RAID 10 ma RX WIOPS, ale 2RX RIOPS. To dramatyczne. Nagle, patrząc na wydajność jako czynnik stałej pojemności, odkrywamy, że RAID 10 ma podwójną wydajność odczytu w porównaniu do RAID 0!
RAID 5 staje się nieco bardziej skomplikowany. WIOPS byłoby wyrażone jako ((R + 1) * X)/4. RIOPS są wyrażone jako ((R + 1) * X).
RAID 6, jak można się spodziewać, podąża wzorcem przewidzianym przez RAID 5. WIOPS dla RAID 6 to ((R + 2) * X)/6. A RIOPS są wyrażone jako ((R + 2) * X).
RAID 7 wpasowuje się idealnie. WIOPS dla RAID 7 to ((R + 3) * X)/8. A RIOPS to ((R + 3) * X).
Ten punkt widzenia zmienia sposób, w jaki myślimy o wydajności i — patrząc czysto na wydajność odczytu — RAID 0 staje się najwolniejszym poziomem RAID zamiast najszybszego, a RAID 10 staje się najszybszym zarówno dla odczytu, jak i zapisu, niezależnie od wartości R i X!
Biorąc rzeczywisty przykład 10 dysków po 2 TB, by osiągnąć 20 TB użytkowej pojemności, każdy dysk z 100 IOPS wydajności, i zakładając mieszankę 50/50, wynikowe IOPS byłyby: RAID 0 z 1000 zmieszanymi IOPS, RAID 10 z 1500 zmieszanymi IOPS (2000 RIOPS / 1000 WIOPS), RAID 5 z 687,5 zmieszanymi IOPS (1100 RIOPS / 275 WIOPS), RAID 6 z 700 zmieszanymi IOPS (1200 RIOPS / 200 WIOPS) i na końcu RAID 7 z 731,25 zmieszanymi IOPS (1300 RIOPS / 162,5 WIOPS). RAID 10 wygrywa zdecydowanie.
Opóźnienie i Wpływ na System przy Programowym RAID
Jak stwierdziłem wcześniej, RAID 0 i RAID 10 mają efektywnie żaden narzut systemowy do rozważenia. Operacja lustrzenia wymaga zasadniczo zerowego wysiłku obliczeniowego i jest, dla wszelkich celów praktycznych, niemierzalnie mała. Parytetowy RAID ma narzut obliczeniowy, co powoduje opóźnienie na warstwie storage i zużycie zasobów systemowych. Oczywiście, jeśli używamy sprzętowego RAID, te zasoby są dedykowane macierzy RAID i nie pełnią żadnej innej funkcji niż bycie zużytymi w tej roli. Jeśli jednak używamy programowego RAID, są to ogólne zasoby systemowe (przede wszystkim CPU) zużywane na potrzeby przetwarzania macierzy RAID.
Wpływ nawet na bardzo mały system z dużą ilością RAID jest nadal bardzo mały, ale można go zmierzyć i należy go wziąć pod uwagę, choćby pobieżnie. Opóźnienie i wpływ na system są ze sobą bezpośrednio związane.
Nie ma prostego sposobu na określenie opóźnienia i wpływu na system dla różnych poziomów RAID, z wyjątkiem tego: RAID 0 i RAID 10 mają efektywnie zerowe opóźnienie lub wpływ, RAID 5 ma pewne opóźnienie i wpływ, RAID 6 ma mniej więcej dwukrotnie większy narzut obliczeniowy opóźnienia i wpływu niż RAID 5, a RAID 7 ma mniej więcej trzykrotnie większy narzut obliczeniowy opóźnienia i wpływu niż RAID 5.
W wielu przypadkach to opóźnienie i wpływ na system będą tak małe, że nie można ich zmierzyć standardowymi narzędziami systemowymi, a ponieważ nowoczesne procesory stają się coraz mocniejsze, opóźnienie i wpływ na system będą nadal maleć. Wpływ był uważany za pomijalny dla systemów RAID 5 i RAID 6 nawet na sprzęcie niskiej klasy i towarowym od mniej więcej 2001 roku. Ale możliwe jest, że na mocno obciążonych systemach z dużą ilością aktywności parytetowego RAID może wystąpić rywalizacja o zasoby systemowe między podsystemem RAID a innymi procesami wymagającymi zasobów systemowych.
Odniesienie: The IT Hollow – Understanding the RAID Penalty
Artykuł pierwotnie opublikowany na blogu StorageCraft – RAID Performance.
