Performance of Linux md raid-10 arrays – negative impact of the intel_pstate CPU governor for HWP?

Last November I performed some tests with “fio” on Raid arrays with SSDs (4 Samsung EVO 850). The test system ran on Opensuse Leap 42.1 with a Linux kernel of version 4.1. It had an onboard Intel Sunrise Point controller and an i7 6700k CPU.

For md-raid arrays of type Raid10, i.e. for Linux SW Raid10 arrays created via the mdadm command, I was quite pleased with the results. Both for N2 and F2 layouts and especially for situations where the Read/Write load was created by several jobs running in parallel. Depending on the size of the data packets you may, e.g., well reach a Random Read [RR] performance between 1.0 Gbyte/sec and 1.5 GByte/sec for packet sizes ≥ 512 KB and %gt; 1024k, respectively. Even for one job only the RR-performance for such packet sizes lay between 790 MByte/sec and 950 Mbyte/sec – i.e. well beyond the performance of a single SSD.

Significant drop in md-raid performance on Opensuse Leap 42.2 with kernel 4.4

Then I upgraded to Opensuse Leap 42.2 with kernel 4.4. Same system, same HW, same controller, same CPU, same SSDs and raid-10 setup.
I repeated some of my raid-array tests. Unfortunately, I then experienced a significant drop in performance – up to 25% depending on the packet size. With absolute differences in the range of 60 MByte/sec to over 200 Mbyte/sec, again depending on the chosen data packet sizes.

In addition I saw irregular ups and downs in the performance (large spread) for repeated tests with the same fio parameters. Up to some days ago I never found a convincing reason for this strange performance variation behavior of the md-Raid arrays for different kernels and OS versions.

Impact of the CPU governor ?!

Three days ago I read several articles about CPU governors. On my system the “intel_pstate” driver is relevant for CPU power saving. It offers exactly two active governor modes: “powersave” and “performance” (see e.g.: https://www.kernel.org/doc/html/latest/admin-guide/pm/intel_pstate.html).

The chosen CPU governor standard for Opensuse Leap 42.2 is “powersave”.

Just for fun I repeated some simple tests for the raid array again – one time with “powersave” active on all CPU cores/threads and a second time with “performance” active on all cores/threads. The discrepancy was striking:


Test setup

HW: CPU i7 6700K, Asus Z170 Extreme 7 with Intel Sunrise Point-H Sata3 controller

Raid-Array: md-raid-10, Layout: N2, Chunk Size: 32k, bitmap: none

SSDs: 4 Samsung Evo 850

Fio parameters:

size=500m
directory=/mnt2
direct=1
ioengine=sync
bs=512k
; bs=1024k
iodepth=1
numjobs=1
[read]
rw=randread
[write]
stonewall
rw=randwrite


Test results:

Fio test case 1bs=512k, Random Read [RR] / Random Write [RW]:

Leap 42.1, Kernel 4.1:
RR: 780 MByte/sec – RW: 754 MByte/sec,
RR Spread around 35 Mbyte/sec

Leap 42.2, Kernel 4.4, CPU governor powersave :
RR: 669 MByte/sec – RW: 605 MByte/sec,
RR Spread around 50 Mbyte/sec

Leap 42.2, Kernel 4.4, CPU governor: performance :
RR: 780 MByte/sec – RW: 750 MByte/sec,

RR Spread around 35 Mbyte/sec


Fio test case 2bs=1024k, Random Read [RR] / Random Write [RW]:

Leap 42.1, Kernel 4.1:
RR: 860 MByte/sec – RW: 800 MByte/sec
RR Spread around 30 Mbyte/sec

Leap 42.2, Kernel 4.4, CPU governor: powersave :
RR: 735 MByte/sec – RW: 660 MByte/sec
RR Spread > 50 Mbyte/sec

Leap 42.2, Kernel 4.4, CPU governor: performance :
RR: 877 MByte/sec – RW: 792 MByte/sec
RR Spread around 25 Mbyte/sec

Interpretation

The differences are so significant that one begins to worry. The data seem to indicate two points:

  • It seems that a high CPU frequency is required for optimum performance of md-raid arrays with SSDs.
  • It seems that the Leap 42.1 with kernel 4.1 reacts differently to load requests from fio test runs – with resulting CPU frequencies closer to the maximum – than Leap 42.2 with kernel 4.4 in powersave mode. This could be a matter of different CPU governors or major changes in drivers …

With md-raid arrays active, the CPU governor should react very directly to a high I/O load and a related short increase of CPU consumption. However, the md-raid-modules seem to be so well programmed that the rise in CPU load is on average below any thresholds for the “powersave”-governor to react adequately. At least on Leap 42.2 with kernel 4.4 – for whatever reasons. Maybe the time structure of I/O and CPU load is not analyzed precisely enough or there is in general no reaction to I/O. Or there is a bug in the related version of intel_pstate …

Anyway, I never saw a rise of the CPU frequency above 2300 Mhz during the tests on Leap 42.2 – but short spikes to half of the maximum frequency are quite normal on a desktop system with some applications active. Never, however, was the top level of 4200 Mhz reached. I tested also with 2000 MB to be read/written in total – then we talk already of time intervals around 3 to 4 secs for the I/O load to occur.

Questions

When reading a bit more, I got the impression, that the admins possibilities to influence the behavior of the “intel_pstate” governors are very limited. So, some questions arise directly:

  1. What is the major difference between OS Leap 42.1 with kernel 4.1 compared to Opensuse 42.2 with kernel 4.4? Does Leap 41.1 use the same CPU governor as Leap 42.2?
  2. Is the use of Intel’s standard governor mode “powersave” in general a bad choice on systems with a md-raid for SSDs?
  3. Are there any kernel or intel-pstate parameters that would change the md-raid-performance to the better again?

If somebody knows the answers, please contact me. The whole topic is also discussed here: https://bugzilla.kernel.org/show_bug.cgi?id=191881. At least I hope so …

Addendum, 19.06.2017:
Answer to question 1 – I checked which CPU governor runs on Opensuse Leap 42.1:
It is indeed the good old (ACPI-based) “ondemand” governor – and not the “new” intel_pstate based “powersave” governor for Intel’s HWP. So, the findings
described above raise some questions regarding the behavior of the “intel_pstate based “powersave” governor vs. comparable older CPU_FREQ solutions like the “ondemand” governor: The intel_pstate “powersave” governor does not seem to support md-raid as well as the old “ondemand” governor did!

I do not want to speculate too much. It is hard to measure details of the CPU frequency changes on small timescales, and it is difficult to separate the cpu consumption of fio and the md-modules (which probably work multithreaded). But it might be that the “ondemand” governor provides on average higher CPU frequencies to the involved processes over the timescale of a fio run.

Anyway, I would recommend all system admins who use SSD-Raid-arrays under the control of mdadm to check and test for a possible performance dependency of their Raid installation on CPU governors!

 

SSD Raid Arrays unter Linux – VII – problematische Aspekte von Raid-5-Arrays

In früheren Artikeln dieser Serie

SSD Raid Arrays unter Linux – III – SW- Raid vs. Intel-iRST-Raid – Performance?
SSD Raid Arrays unter Linux – V – SW-Raid vs. iRST-Raid – Boot-Unterstützung?
SSD Raid Arrays unter Linux – VI – SW-Raid vs. iRST-Raid – Flexibilität?

hatte ich am Beispiel des Intel Z170 RST Controllers ausgeführt, dass es auf einem reinen Linux-System für Raid-Setups nicht notwendig ist, iRST-Technologie zu benutzen. Man betreibt den Intel-Onboard-Controller besser als einfachen SATA3-Controller und nicht als iRST-Raid-Controller. Die (SSD)-Raid-Arrays baut man sich dann lieber mit Hilfe von mdadm als Linux-SW-Raid-Arrays. Man gewinnt dadurch an Flexibilität, hat keine Performance-Nachteile und kann sogar – wenn nötig – eine Linux-OS vom Array booten.

Bei Einsatz eines SW-Raid-Arrays für SSDs ist unter Linux allerdings ein wenig Umsicht angebracht. U.a. stellt sich die Frage nach der Wahl der Raid-Variante. In meinem Fall für vier SSDs. Da liegen als grundsätzliche Alternativen etwa Raid-10- oder Raid-5-Arrays nahe.

In diesem Beitrag möchte ich zwei Argumente dafür anführen, dass die Wahl eines Raid-5-Arrays nicht unbedingt die beste Entscheidung ist – und zwar

  • trotz des größeren nutzbaren Netto-Platzes auf dem SSD-Raid-Array
  • und trotz der im sequentiellen Read-Bereich für große Datenpakete besseren Performance.

Die Argumentation hat mit der Resynchronisation des Raid-Arrays nach einem Plattenausfall, der relativ schlechten Performance von Random-Write-Prozessen für kleine Datenpakete und der Nichtausführbarkeit des “fstrim”-Befehls zu tun (Stand Nov. 2016).

Nachtrag 14.06.2017:
Von all diesen Punkten ist der letzte derjenige, der sich am einfachsten überprüfen lässt. Zum zweiten Punkt werde ich bei Gelegenheit Daten nachliefern. Bzgl. des ersten Punktes bin ich mir inzwischen nicht mehr sicher, ob ich wirklich alle Einflussfaktoren verstanden habe. Ich habe den Artikel heute abgeändert; er spiegelt nun meine aktuelle Einschätzung wieder.

Was sprach im HDD-Zeitalter gegen Raid-5- oder Raid-6-Arrays?

Raid-5-Arrays stellten schon zu HDD-Zeiten ein Problem dar. Zu nennen war/ist hier aus meiner Sicht an erster Stelle der erhebliche Zeitbedarf zur Rekonstruktion eines degraded Raid-5- oder Raid-6-Arrays.

Ein degradiertes Array kann z.B. aufgrund des Ausfall einer Platte wegen echten HD-Defekten oder aber wegen einer losen SATA-Verbindung (ist mir schon passiert!) zu Stande kommen. Eine Degradierung kann aber durch einen ernsten Fehlers des Linux-Systems ausgelöst werden. Ja, letzteres kommt ab und zu auch mal unter Linux vor! Probleme gibt es u.U. auch dann, wenn Inhalte von Schreib-Caches bei einer Systemstörung nicht rechtzeitig auf alle Platten geschrieben werden konnten. Die Raid-SW muss nach einer Systemstörung mit Reboot u.U. eine Rekonstruktion betroffener Arrays vorschlagen, um wieder auf die sichere Seite zu kommen.

Überlebenswichtige Paritätsinformation muss dann wieder hergestellt werden; fehlerhafte Informationen auf der betroffenen Platte sind neu zu synchronisieren.

Statt Rekonstruktion spricht man oft auch von einer “Resynchronisierung” oder “Rebuild” eines Raid-Arrays. Ich verwende diese Ausrücke nachfolgend synonym.

Extrem lange Resynchronisationszeiten für Raid-Arrays mit mehreren Terrabyte an Kapazität gab es vor allem dann, wenn man die Zeitanteile für Rekonstruktionsaufgaben im Raid-
Controller oder aber in der Linux-SW zugunsten der produktiven Performance operativer Prozesse (also für den laufenden Alltagsbetrieb) reduzieren musste. Die Rekonstruktion eines Raid-5-Arrays konnte dann schon mal etliche Stunden in Anspruch nehmen. In dieser Zeit lebte man immer mit der Gefahr weiterer Ausfälle.

Resynchronisation von SW-Raid-Arrays mit SSDs

Nun sind SSDs ja sehr viel rascher als konventionelle HDDs. Aus diesem Grund sagten einige Systemadministratoren in Internet-Foren sogar eine Renaissance für Raid-5-Arrays voraus. Der Optimismus ist in der Praxis tatsächlich nachvollziehbar: Setzt man die Priorität für eine Raid-5-Resynchronisierung auf Mittelwerte, so liegen die Zeiten für ein 1TB-Array deutlich unter einer Stunde. Das ist aus meiner Sicht OK. Hinzu kommt bei Raid-5 ja die bessere Netto-Plattenplatzkapazität für Nutzdaten im Vergleich zu einem Raid-10-System.

Welche Faktoren beeinflussen die Resynchronisation eines Raid-5-Arrays?

Es erscheint klar, dass nach einem Verlust von Redundanz ggf. zwei Dinge notwendig sind:

  • Wiederherstellen von Information auf der ausgefallenen Platte/Partition bei einem Timeout oder auf einer Ersatz-Platte/Partition nach Totalausfall.
  • Erneutes Herstellen der Redundanz durch Berechnung und Schreiben valider Parity-Informationen.

Verkompliziert wird der Rekonstruktionsvorgang, wenn das Raid-5 Array im degradierten Zustand aktiv weiter betrieben wird oder betrieben werden muss. Zudem stellt sich die Frage, was die Ursache des Redundanzverlustes war und ob die ausgefallene Platte (oder Partition) aufgrund eines Defekts ersetzt werden muss – oder aber, ob die ursprünglich vorhandene Platte aus irgendwelchen Gründen nur einen vorübergehenden Timeout hatte, und weiterverwendet werden kann. Ein solcher Timeout kann z.B. durch ein locker sitzendes SATA-Kabel verursacht worden sein. Letzteres ist mir tatsächlich passiert (s.u.)!

Fall 1: Notwendiger Ersatz einer Platte/Partition nach einem Defekt
Dieser Fall ist logisch am einfachsten zu überblicken. Daten und Paritity-Informationen müssen dann auf der neuen Platte/Partition vollständig neu geschrieben werden.

Dazu muss der gesamte (!) Datenvorrat sukzessive von den verbliebenen Platten ausgelesen werden, über die noch vorhandenen Parity-Daten ist die verlorengegangene Information über Berechnungen zu rekonstruieren, der fehlende Datenanteil ist auf die neue Platte/Partition zuschreiben, Redundanz ist durch Berechnen und Schreiben neuer Parity-Information auf die neue Platte/Partition herzustellen. Das ist ein aufwändiger Vorgang, der die alten, noch funktionierenden Platten des Arrays enorm stresst, CPU kostet und vor allem viele Schreibvorgänge auf der neuen Platte/Partiton nach sich zieht.

Der ganze Prozess ist deshalb zwangsläufig langsam – es ist klar, dass ein weiterer Betrieb des degradierten Arrays nur mit schlechter Performance möglich sein wird. Die Wahrscheinlichkeit, dass eine weitere Platte im Rekonstruktionsprozess ausfällt, ist wegen der vielen Zugriffe nicht vernachlässigbar. Das Schreiben neuer Daten während eines weitergeführten Betriebs muss zudem in den Datentransfers zur neuen Platte und bei zugehörigen Paritätsberechnungen berücksichtigt werden. Das ist ein Grund dafür, die Array-Rekonstruktion möglichst ohne operative Belastung durchzuführen.

Fall 2: Die alte Platte/Partition kann weiter verwendet werden
Tja, da wird es dann komplizierter. Nehmen wir mal an, wir machen dem Array die ausgefallene Partition wieder zugänglich. In der Zwischenzeit lief/läuft aber der operative Betrieb auf dem Array weiter. Ein paar entscheidende Frage sind dann:

Woher soll das System eigentlich wissen, welche Parity-Information seit dem Ausfall noch verlässlich ist? Welche Sektoren und Blöcke
waren vom Ausfall betroffen? Welche Informaiton wurde neu hinzugefügt? Wo hat das zwischenzeitliche Überschreiben von Daten die ursprüngliche Parity-Information verändert?

Für die betroffenen Blöcke muss die Daten- und Parity-Information ja in jedem Fall neu berechnet und die nunmehr ungültige Information auf der wieder eingehängten Platte ersetzen!

Das Schreiben neuer Information kann aber irgendwo im Filesystem und damit auf der Platte erfolgt sein! Kennt das System die betroffenen Sektoren und Datenblöcke nicht, muss es deshalb im Rekonstruktionsprozess zur Sicherheit alle Daten des degradierten Arrays mit den veralteten Informationen auf der wieder eingegliederten Platte vergleichen und ggf. korrigieren!

Es wird klar: Man braucht für solche Situationen eine Art “Logging” der Adressen modifizierter Datenbereiche.

Bitmaps!
Linux SW-Raid (mittels mdadm) sieht für diesen Zweck das Schreiben sog. “Bitmaps” als Option für Raid-Arrays mit Datenredundanz vor. Genauere Informationen erhält man hier: https://raid.wiki.kernel.org/ index.php/ Write-intent_bitmap.

Ich zitiere den wichtigsten Punkt:

“When an array has a write-intent bitmap, a spindle (a device, often a hard drive) can be removed and re-added, then only blocks changes since the removal (as recorded in the bitmap) will be resynced. Therefore a write-intent bitmap reduces rebuild/recovery (md sync) time if:
  – the machine crashes (unclean shutdown)
  -one spindle is disconnected, then reconnected.
If one spindle fails and has to be replaced, a bitmap makes no difference.”

Für das Anschalten einer “Bitmap” und damit des gewünschten “Loggings” steht eine mdadm-Befehlsoption zur Verfügung (s. für die mdadm-Praxis einen späteren Artikel).

Haben Bitmaps auch Nachteile?
Leider muss ich die Frage mit Ja beantworten. Im Artikel
SSD Raid Arrays unter Linux – III – SW- Raid vs. Intel-iRST-Raid – Performance?
hatte ich ja verschiedene Performancedaten zum Vergleich eines reinen (über mdadm angelegten) Linux-SW-Raid-10-Arrays mit einem iRST-Raid-10-Array präsentiert. Dabei wurden erhebliche Unterschiede in der Performance von mdadm-SW-Arrays festgestellt, die mit unterschiedlichen Parametern angelegt wurden:

Die festgestellte, um bis zu 30% schlechtere sequentielle Write-Performance gehörte zu Linux-SW-Arrays, bei denen im operativen Betrieb eine Bitmap mit geschrieben wurde!

Bitmaps kosten also Schreib-Performance – manchmal in signifikanter Weise. Wie hoch die Einbußen genau sind, hängt jedoch auch davon ab, ob man die Bitmap-Daten auf das Array selbst oder auf eine Partition einer separaten Platte außerhalb des Arrays schreibt. Wir werden auf entsprechende Effekte und Zahlen in späteren Artikeln zurückkommen.

Raid-5 mit einem Onboard-Sata3-Controller – Intel Z170 Sunrise Point – und iRST-Technologie

Wie sieht es mit der Rekonstruktion eines Raid-5-Arrays nun eigentlich im schlimmsten Fall aus? Ich schildere hierzu mal eines meiner Erlebnisse:

In meiner grenzenlosen Naivität begann ich bei der Einrichtung meines SSD-Testsystem zunächst damit, unter Einsatz von iRST ein “Raid 5”-Array aufzubauen. Die SSDs hingen dabei am “Sunrise Point”-Controller im Z170-Chipsatz des Mainboards. Nun ist ja bekannt, dass eine gerade Anzahl von Platten und Raid-5 nicht sonderlich gut zueinander passen. Für einen ersten Anlauf mit einem Raid-5-Array sprachen aus meiner Sicht aber folgende Punkte:

  • Bessere Nutzung der (relativ teuren) Plattenkapazität als mit Raid-10.
  • Optimierung vieler (Fake-)
    Raid-Controller auf die Nutzung von Raid-5.
  • Schlechte Erfahrungen mit Raid-10 auf 3ware-Controllern bei Random I/O.

Meine vier 500 GB-SSDs [Samsung EVO 850] wurden also zu einem Linux-SW-Raid-Array zusammengeschaltet; dabei wurden ca. 460 GB pro Platte effektiv genutzt. Zum Aufsetzen nutzte ich die UEFI-BIOS-Bordmittel für den Intel-Controller (iRST). Die resultierende Performance war wirklich überzeugend:

Ein Read-Durchsatz im sequentiellen Bereich um die 1.45 GB/sec und hohe sequentielle Schreibraten im Bereich von 1.1 GB/sec ließen mich zunächst nicht an meinem Vorgehen zweifeln. Hinzu kam – im Vergleich zu Raid 10 – die relativ hohe verfügbare Plattenkapazität (> 1,36 GB bei 4 EVO 850 500GB SSDs).

Das Betriebssystem hatte ich im ersten Anlauf dummerweise auch auf dem Raid-Array selbst installiert. Das kostet, wie bereits in einem früheren Artikel festgestellt, ca. 10% an Performance. Ich habe die Entscheidung für Raid-5 dann aber aus einem anderen Grund als vordergründigen Performance-Einbußen bereut.

Resynchronisation des Raid-5-Systems nach Ausfall einer Platte

Es geschah nämlich etwas, dass normalerweise nicht passieren sollte. Ich hatte ein SATA-Verbindungskabel nicht richtig gesteckt. Als das PC-Gehäuse dann mal bewegt wurde, löste sich das Kabel aus der SSD – mit dem Effekt, dass das Array in einen “degraded” Zustand überging. Kein Problem, dachte ich. Genau für solche Situationen hat man ja ein RAID-System. Ich ließ das Array danach wieder aufbauen – der Resynchronisierungsprozess wurde mit der entsprechenden iRST-Funktionalität des Controllers im BIOS aufgesetzt; die eigentliche Ausführung erfolgte dann im neu gestarteten Linux-System unter Kontrolle der “md-raid”-Module des Kernels. Insgesamt nahm das nicht so viel Zeit in Anspruch wie aufgrund vieler Internet-Artikel befürchtet. Ich habe die Zeit nicht gemessen, aber es dauerte, wie gesagt, sicher deutlich weniger als 1 Stunde.

Was mich dann allerdings schockte, war ein Blick auf den SSD-Zustand mit Hilfe des Kommandos smartctl. Ist Smart im BIOS aktiviert, so ist eine Zustandsüberprüfung einzelner SSDs (zumindest auf meinem ASRock-Board) sowohl bei Einsatz eines nativen Linux-SW-Raids als auch bei Einsatz von iRST-Raid-Containern möglich. Die durch den Ausfall betroffene SSD lief bei mir als Device “/dev/sdd”. Die übrigen Devices des Raid-5-Arrays unter /dev/sda, /dev/sdb, /devsdc. Unter den vielen ausgewiesenen Smart-Daten stelle ich nachfolgend nur die Anzahl der “Total_LBAs_written” nach dem Resynchronisationsprozess dar:

Total_LBAs_Written
sda : 604127952
sdb : 846533123
sdc : 603302987
sdd: 3763859973 !!!

Vor dem Resynchronisationsprozess befand sich der Wert für “/dev/sdd” dagegen auf dem Niveau von “/dev/sdc” – also < 603302987 !!

Dass der Basiswert auf “/dev/sdb” so hoch war, lag übrigens daran, dass auf diesem Device noch andere Tests zur Performance einer einzelnen SDD durchgeführt worden waren.
Nach vielen, vielen weiteren Testläufen und ca. 12 (!) immer neuen initialen Raid-10-Synchronisationen über 100 GB, 200 GB oder 400 GB umfassende (Raid-10-) Arrays sieht das heute (Nov. 2016) so aus:

Total_LBAs_Written
sda: 979783261
sdb: 1211867704
sdc: 995650995
sdd: 4121599736

Es ist offensichtlich, dass die eine Resynchronisations-Aktion für die Wiederherstellung des ehemaligen Raid-5(!)-Arrays über die gesamte Platte “/dev/sdd” hinweg geschrieben hat (Daten- und Paritätsinformationen). Gleichzeitig ging der Parameter “Wear_Leveling_Count” der vom Ausfall betroffenen Platte um 1 Prozentpunkt nach unten. Die Belastung der (vorher ausgefallenen) Platte durch den einen Raid-5-
Resynchronisationsprozess ist also substanziell gewesen!

Wie lässt sich der extreme Befund zur Schreibbelastung erklären?

Im Artikel
SSD Raid Arrays unter Linux – III – SW- Raid vs. Intel-iRST-Raid – Performance?
hatten wir eine relativ gute Schreib-Performance des iRST-imsm-Raid-Arrays festgestellt. Eine spätere Überprüfung brachte dann die Ursache zu Tage:

Die iRST-BIOS-Funktionen legen die imsm-Raid-Container grundsätzlich ohne “Bitmap” an!

Nächste Frage: Welche Auswirkungen hat denn das Fehlen einer Bitmap auf eine Resynchronisation? Eine Antwort finden wir in folgendem Artikel:
https://raid.wiki.kernel.org/ index.php/ Replacing_a_ failed_drive

Dort wird erläutert, dass man im Falle von Timeouts versuchen kann und sollte, die ausgefallene Platte/Partition einem Raid-Array wieder zur Verfügung zu stellen. Ich zitiere aus dem Abschnitt “So you have no redundancy!”:

“Before attempting to replace a failed drive, you should ALWAYS attempt to restore redundancy before replacing a drive. If the array is redundant, a replace will just copy the dodgy drive, only stressing the old drives if it can’t read the dodgy drive. If the array is not redundant, then adding a new drive will stress the entire array as it has to recreate the new drive from the remaining old drives. This is true even for a mirror.”

Und:

“If you have set up a bitmap on your array, then even if you plan to replace the failed drive it is worth doing a re-add. With a bitmap, the raid will know which sectors need writing, and will recover the array for you. You can then consider doing a replace of the faulty drive.
mdmad /dev/mdN –re-add /dev/sdX1
mdadm /dev/mdN –add /dev/sdY1 –replace /dev/sdX1 –with /dev/sdY1
If possible, do not mount the partitions on the raid (or do it read-only) while the rebuild takes place, to avoid undue stress on the array.
If you do not have a bitmap then don’t re-add the old drive unless it was a (now fixed!) timeout problem and you don’t intend replacing the drive. Without a bitmap, then the raid will treat it like a new drive and do a total rebuild.

Aha! Der letzte Satz erklärt mein Erlebnis und bedeutet gleichzeitig:

Wenn schon Raid-5, dann bitte mit Bitmap!

Es ist eigentlich bemerkenswert, dass Intel für iRST-Raid-5-Arrays nicht automatisch die Anlage von Bitmaps vorsieht. Intel weiß wohl, dass die Schreibraten dann nicht mehr so werbewirksam wären!

Wie ist das Schreiben für eine Raid-5-Rekonstruktion – ohne Bitmap – im Vergleich zu einer normalen Plattenbelastung zu werten?

Zum Vergleich: Eine in einem anderen System seit 2 Jahren als Betriebssystemplatte mit virtuellen Maschinen im Dauereinsatz, aber nicht in einem Raid-Verbund befindliche Samsung EVO 840 Pro weist heute einen Wert von

Total_LBAs_Written
sdx: 7968906003

auf. Das ist also immer noch weniger als das Doppelte dessen, was mich eine einzige (!) Resync-Aktion einer Raid-5-SSD gekostet hat!

Wie oft muss man eigentlich mit einem Resync-Prozess rechnen?

Der oben genannte Artikel wiesen ja darauf hin, dass Crashes und unsaubere Shutdowns einen Rebuild-Vorgang für ein Array auslösen können. Machen wir uns nichts vor: Zumindest auf Linux-Desktop-Systemen kommt sowas öfter vor, als man sich das wünscht. Erst vor kurzem hatte ich mal einen Hänger des KDE-Plasma-Desktops auf meinem Testsystem. Das System war danach nicht mehr bedienbar. Ich befürchtete schon das
Schlimmste; der Filesystemzustand war zum Absturzzeitpunkt zwar fehlerhaft, der Plattenzustand über das Raid-Array hinweg aber noch konsistent. Das Filesystem-Fehler konnte nach einem Reboot ohne ein Raid-Rebuild korrigiert werden.

Aber dafür gibt es nun leider überhaupt keine Garantie – schon gar nicht im Falle eines Absturzes während eines intensiven Datentransfers (lesend und schreibend) zu dem Raid-5-Array. Ein inkonsistenter Zustand der Platten im Raid-System nach einem ernsthaften Systemfehler ist aus meiner Sicht dann eher wahrscheinlich. Und anschließend würde – bei fehlender Bitmap – vermutlich das gesamte Raid-5-System resynchronisiert werden.

Wie schaut es mit Raid-10 aus?

Ich habe für Tests in den letzten Monaten mehrfach Raid-10-Arrays angelegt und auch rekonstruiert. Die Wiederherstellung eines Raid-10-Arrays nach einem Timeout einer Platte erwies sich hinsichtlich der durchgeführten Schreiboperationen regelmäßig als relativ harmlos. Die Resynchronisation eines degradierten Raid-10-Array wird zudem erheblich (!) schneller als die eines gleich großen Raid-5-Arrays abgeschlossen.

Ein Grund liegt auf der Hand – im Falle von Raid-10 ist keine Paritätsinformation zu berechnen oder zu schreiben. Ich vermute ferner, dass im Zuge der Rekonstruktion nach einem Timeout möglicherweise nicht alle Daten, sondern lediglich abweichende, bereits genutzte und während des Timeouts geänderte Blöcke durch Schreibvorgänge abgeglichen werden. Das Prüfen auf Identität von Datenblöcken auf zwei Laufwerken lässt sich bei reiner Spiegelung ja relativ einfach und vor allem schnell durchführen.

Reichweite des TRIM-Befehls?

Ein wichtiger weiterer Punkt, der im Zusammenhang mit SSDs zu beachten ist, ist das Thema der sog. “Write Amplification” (s. https://en.wikipedia.org/ wiki/ Write_amplification). Ein Flash-Speicher muss vor einem Neubeschreiben erst gelöscht werden; das führt u.U. zu Verschiebungen von Speicherinhalten und mehrfachen Schreiboperationen. Das reduziert potentiell sowohl die Performance als auch die Lebenszeit von SSDs.

Neben den reinen Nutzdaten müssen im Normalbetrieb auf allen Platten eines Raid 5/6-Verbunds Paritätsinformationen geschrieben werden. Write Amplification (durch Verlagerung von Blöcken auf SSDs) trägt also gerade im Fall von Paritäts-Raids zusätzlich zu einer stärkeren Abnutzung der SSDs bei – gerade in kleineren Arrays (< 8 disks). Theoretisch ist aber die Anzahl der insgesamt durchzuführenden Schreiboperationen auch bei Raid-10 nicht kleiner als bei Raid-5. Insofern erscheint mir das Thema der Write Amplification als solches allein noch kein Argument für oder gegen Raid-5 oder Raid-10 zu sein.

Eine Konsequenz zur Aufrechterhaltung der Performance und zur Vermeidung von Zeitverlust durch Löschungen besetzter Blöcke bzw. durch das Suchen nach freien Blöcken auf der Platte ist aber, dass die Information über freie Knoten mit dahinterliegenden direkt beschreibbaren Speicherelementen regelmäßig upgedated werden muss. Das Filesystem muss den SSD-Controller – gemeint ist hier der Controller auf der SSD und nicht der Fake-Raid-Controller – über freigewordene, ungenutzte Speicherelemente informieren. [Der SSD-Controller muss mit den im Rahmen des (S)ATA-Protokolls übertragenen Information natürlich auch was anfangen können; letzteres ist heute praktisch bei allen Marken-SSDs der Fall.]

Unter Linux erledigt das der “fstrim“-Befehl für gemountete Partitionen: einerseits erfolgt dadurch die Weitergabe der Information zu freien Knoten; andererseits werden dann von den SSD-Controllern sog. “discard”-Operationen für logisch freigegebene Speicherelemente durchführt. Fortschrittliche Controllers sehen zudem regelmäßige Lösch- und Speicher-Reorganisationsverfahren auf den SSDs vor (SSD garbadge collection).

Nun können Betriebssystem und Raid-(Controlling)-SW in intelligenter Weise dazu beizutragen, um “Write Amplification” zu reduzieren. Hierfür sind meist Zwischenpufferungen von Operationen nötig. Siehe hierzu die interessanten Diskussionen unter

http://www.webhostingtalk.com/ showthread.php?t=1457939

http://cesg.tamu.edu/ wp-content/ uploads/2012/02/ hotstorage13.pdf

Aber:
Das Thema der Speicher-Freigabe und -Reorganisation bleibt unabhängig von der Anzahl der Schreiboperationen für SSD-Raid-Arrays bestehen. Somit stellt sich für die Auswahl eines bestimmten Raid-Verfahrens für SSDs auch die Frage, ob der “fstrim”-Befehl für die verschiedenen Raid-Varianten eigentlich durch die potentiell betroffenen Layer

Linux-Filesystem (z.B. ext4) – Logical Volume einer LVM-Gruppe – Array über Raid-Partitionen – Partitionen verschiedener SSDs

zu den Controllern der beteiligten SSDs durchgereicht wird.

Leider ist das gerade für Raid-5- oder Raid-6-Arrays nicht der Fall – weder im Falle von mdadm-SW-Raid-Arrays noch im Falle des Einsatzes von iRST-Technologie und imsm-Raid-Containern. Ich erhalte bei entsprechenden Versuchen regelmäßig Meldungen, dass die zugrundeliegende Infrastruktur den fstrim-Befehl nicht unterstützen würde.

Auf meinen Test-Systemen konnte ich dagegen feststellen, dass der “fstrim”-Befehl an logische LVM-Volumes auf Raid-0-, Raid-1– und Raid-10-Arrays anstandslos durchgereicht wird – zumindest für ext4-Filesysteme. (Andere Filesysteme wie BTRFS habe ich nicht getestet; generell herrscht ja die begründete Meinung vor, dass EXT4 dem Verhalten von SSDs am besten entgegenkommt). Das gilt für reines SW-Raid unter mdadm wie auch für den Einsatz von iRST/imsm-Containern. (Diese Aussagen kann ich genau genommen im Moment nur für Opensuse-Leap 42.1/42.2 (Kernel 4.4) und ein Debian Jessie-Test-Systeme mit Kernel 4.7 treffen.)

D.h.: Potentielle Einschränkungen der Performance sind zumindest bei ext4-Filesystemen auf Raid-5-Arrays vorprogrammiert, wenn nicht der Plattencontroller selbst die Garbage Collection und Speicherreorganisation übernimmt. Tatsächlich konnte ich für ext4-Partitionen nach Durchführung von Tests, bei denen mehr als 40 % eines Filesystems beschrieben wurden, regelmäßig Performanceverbesserungen nach Absetzen eines fstrim-Befehls feststellen. Zwar keine weltbewegenden Änderungen, aber doch im 10% – 20%-Bereich. Einschränkungen der Performance tauchen mit dem Auffüllen einer Partition also mit hoher Wahrscheinlichkeit auf.

Nun wird und wurde von SSD-Herstellern und Kommentatoren im Internet oft angeführt, dass gerade größere SSDs, die für den professionellen Einsatz gedacht sind, selbst für eine regelmäßige Garbage Collection sorgen. Ich habe sowohl EVO 840 Pros und EVO 850 Pros mit 500GB Kapazität auf verschiedenen Systemen im Einsatz und setze ab und zu den fstrim-Befehl für eingerichtete Partitionen manuell ab. Die benötigten Zeiten zur Speicherreorganisation dauern für meine Gefühl relativ lange und betreffen manchmal etliche zig GB. Dabei werden offenbar auch echte Operationen auf den Disks durchgeführt. Das spricht aus meiner Sicht zumindest nicht für eine hohe Frequenz der automatischen Garbage Collection durch die SSD-Controller von Samsung. Das mag bei anderen SSDs jedoch anders sein.

Aus meiner Sicht ist es daher empfehlenswert, vor dem produktiven Einsatz sicherzustellen, dass der fstrim-Befehl im angestrebten Raid-Verbund funktioniert.

Warnung von Red Hat vor dem Einsatz von SW-Raid-5 mit SSDs

Wie eine Recherche im Internet ergab, warnt(e) Red Hat vor dem Einsatz u.a. von Raid-5 für SSDs; s.

https://access.redhat.com/ documentation/ en-US/Red_Hat_ Enterprise_Linux/ 6/html/ Storage_Administration_Guide/ ch-ssd.html

https://access.redhat.com/ documentation/ en-US/ Red_Hat_Enterprise_Linux/ 7/html/ Storage_Administration_Guide/ ch-ssd.html

Zitat:

Red Hat also warns that software RAID levels 1, 4, 5, and 6 are not recommended for use on SSDs. During the initialization stage of these RAID levels, some RAID management utilities (such as mdadm) write to all of the blocks on the storage device to ensure that checksums operate properly. This will cause the performance of the SSD to degrade quickly.

Schlechte Schreibperformance von Raid-5 bei kleinen Datenpaketen?

Das anderes Argument gegen Raid-5 war die meist schlechte Performance für Random I/O-Bereich und dies vor allem bei einer kleinen Größe der stückweise zu schreibenden Datenpakete. Write-Caches einiger echter HW-Raid-Controller haben hier geholfen; der Einsatz eines Schreibpuffers ist aber – wie oben erläutert – auch mit Risiken verbunden; Batteriepuffer waren für dedizierte HW-Raid-Controller daher meist obligatorisch.

Eine vergleichsweise schlechte Performance attestieren viele Admins Raid-5-Arrays auch heute noch – selbst bei Einsatz von SSDs. Ich bin hier etwas vorsichtiger. Weder Raid-10 noch Raid-5 sind bei kleinen Datenpaketgrößen besonders schnell. Die Performance hängt aber auch stark von anderen Faktoren ab; u.a. von Raid-Array-Parametern, wie der Chunk Size, aber auch dem Lastprofil.

Um das Thema Performance Raid-5 vs. Raid-10 von SW-Raids unter Linux kümmere ich mich deshalb genauer in einem der kommenden Artikel. Bzgl. konkreter Zahlen muss ich den Leser deshalb noch vertrösten.

Fazit

Legt man die obigen Erfahrungen zugrunde, so läuft die Entscheidung zwischen Raid-10 und Raid-5 im Normalbetrieb auf

  • eine Abwägung von Performance-Vor- und -Nachteilen,
  • eine Bewertung des effektiv verfügbaren Plattenplatzes
  • und eine Bewertung des SSD-Verschleißes, der im Fall der Resynchronisation eines Degraded Raid-5-Arrays auftritt,

hinaus.

Man sollte ein Raid-5-Array aus meiner Sicht jedenfalls nicht ohne eine Bitmap betreiben. Das führt aber wieder zu zusätzlichen Schreibprozessen. Selbst wenn man die auf eine Platte außerhalb des Raid-Arrays verlagert, muss man den Overhead und den resultierenden Durchsatz testen. Diese separate Platte muss hinreichend schnell ansprechbar sein und sollte nicht die native und hohe Schreibperformance eines Raid-5-Arrays ohne Bitmap beeinträchtigen. Sequentielle Schreibraten von > 1GB/sec sind auf einem Raid-5-Array mit Consumer-SSDs durchaus möglich; auch wenn die Menge der Bitmap-Daten im Vergleich zur Menge der Realdaten relativ klein sein sollte – die Schreibrate dafür muss zum Gesamtdurchsatz passen. Man würde vermuten, dass das besonders bei kleinen Datenpaketen problematisch wird.

Hinzu kommen potentielle Performance-Einbußen durch ein fehlendes Weiterreichen des fstrim-Befehls an Filesysteme auf Raid-5-Arrays. Das relativiert die Performance-Vorteile beim Lesen, die ein Raid-5-System gegenüber einem Raid-10-System für sequentielles Schreiben aufweist, etwas. Zudem gilt:

Wer aus irgendwelchen Gründen eine verbesserte Lese-Performance unter Raid 10 anstrebt, kann auch mal das Far-Layout oder ein Near/Far-Layout des Raid10-Arrays ausprobieren. Das Far-Layout geht allerdings zu Lasten der Schreibperformance – und dies besonderes für Random I/O. Aber Raid-5 ist gerade für häufigen Random I/O kleinerer zu schreibender Datenmengen noch weniger performant.

Insgesamt erschien/erscheint mir das Aufsetzen eines Raid-5-Arrays doch ein
ziemlicher Balanceakt zu sein. Ich befasse mich in den kommenden Artikeln daher zuerst mit Raid-10-Arrays.

Ausblick

Im nächsten Beitrag
SSD Raid Arrays unter Linux – VIII – Setup von Raid-10-Arrays mit mdadm
gehe ich endlich ein wenig mehr auf praktische Schritte ein. Diskutiert wird dort die Anlage und Parametrierung eines SW-Raid-10-Arrays mit Hilfe von mdadm.

Interessante Links

https://www.thomas-krenn.com/ de/wiki/ ATA_Trim

https://wiki.debian.org/ SSDOptimization

http://cesg.tamu.edu/ wp-content/ uploads/2012/02/ hotstorage13.pdf

https://en.wikipedia.org/ wiki/Write_amplification

http://www.webhostingtalk.com/ showthread.php?t=1457939

http://serverfault.com/questions/ 513909/ what-are-the-main-points-to-avoid-raid5-with-ssd

https://lowendtalk.com/ discussion/ 10000/ don-t-build-ssd-in-raid5

https://www.reddit.com/ r/sysadmin/ comments/ 3m9req/ how_would_you_configure_ an_mdadm_raid_5_w_ssds/? st=ivpbg325&sh=a09d50fd

http://researchweb.watson.ibm.com/ haifa/ conferences/ systor2011/ present/ session5_talk2_systor2011.pdf

http://superuser.com/ questions/ 461506/ intel-matrix-storage-manager-vs-linux-software-raid

Bzgl. der grundsätzlichen Einstellung von LVMs und des Absetzens von TRIM-Anweisungen im Kontext von LVM-Operationen siehe etwa:
http://blog.neutrino.es/ 2013/ howto-properly-activate-trim-for-your-ssd-on-linux-fstrim-lvm-and-dmcrypt/

Near/Far-Layout füe Linux SW-Raid-10
http://www.ilsistemista.net/ index.php/ linux-a-unix/ 35-linux-software-raid-10-layouts-performance-near-far-and-offset-benchmark-analysis.html?start=1

Bitmaps
http://www.tutorialspoint.com/ unix_commands/ mdadm.htm