SSD Raid Arrays unter Linux – V – SW-Raid vs. iRST-Raid – Boot-Unterstützung?

Im letzten Beitrag dieser Serie zu SSD-Raid-Arrays unter Linux

SSD Raid Arrays unter Linux – IV – OS und Daten auf demselben Raid-Array?

hatte ich mich mit der Frage auseinandergesetzt, ob wir eigentlich das Betriebssystem [OS] nicht auch auf einem Raid-Array unterbringen können oder sollten, das für hochperformante Datenzugriffe von Anwendungen vorgesehen ist. Ich habe dafür zwar wenig übrig; aber dennoch kann es Umstände geben, in denen man das Betriebssystem in einem (ggf. separaten) Raid-Array installieren muss oder will.

In einer solchen Situation könnte man größere Sorgen bzgl. der Boot-Unterstützung bekommen. Im Besonderen, wenn man vor hat, Linux-SW-Raids zu nutzen. Das Thema beim Booten ist ja immer:

Wer oder was findet eigentlich das Kernel-Image und eine ggf. notwendige Informationen zu einem initramfs, wenn das alles auf Partitionen eines Raid-Arrays liegt? Ggf. auch noch unter einem LVM-Layer versteckt? Der Kernel jedenfalls nicht – der ist zu diesem Zeitpunkt ja noch nicht geladen. Und wenn er geladen wäre, müsste er mit dem jeweiligen Raid-Verbund umgehen können. Dazu braucht er Treiber, sprich Kernel-Module, die er aus dem initramfs auslesen müsste. Wer aber stellt im Bootvorgang die “initram” auf Basis von File-Informationen bereit, die selbst auf einem Raid-Array liegen?

Braucht es da nicht schon irgendwelche magischen Kenntnisse des BIOS über das Raid-Layout? Und im Fall von Intel-Sata-Controllern, die in Mainboard-Chipsätze integriert sind: Braucht man dann nicht zwingend iRST-Technologie ? Und einen Layer in einem System mit (U)EFI-BIOS, der das Raid-Layout der Platten am Intel-Raid-Controller kennt?

Das sind berechtige Fragen. Evtl. Sorgen sind jedoch unbegründet.

Grub2 ist intelligent – dieser Bootmanager kann mit Linux-SW-Raid-Arrays, dortigen Partitionen und auch LVM umgehen

Grub2 ist in den letzten Jahren so ertüchtigt worden, dass dieser Boot-Manager nicht nur mit verschiedenen Partionierungs-und Filesystem-Schemata, sondern auch mit verschiedenen Varianten von Linux-SW-Raids und auch mit LVM/LVM2 umgehen kann. Dass es dafür letztlich kein Hexenwerk benötigt, mag man daran erkennen, dass unter Linux sowohl Raid- als auch LVM-Informationen im Superblock der beteiligten Partitionen auf den einzelnen miteinander verkoppelten Platten bzw. Partitionen hinterlegt werden.

Auf Basis der dortigen Imformationen kann Grub2 die angelegte (komplexe und sich ggf. über mehrere Platten erstreckende Filesystemstruktur aufdröseln, von dort ein Kernel-Image laden und ein initramfs bereitstellen.

Ferner ist Grub2 ist in seiner EFI-Variante natürlich auch in der Lage, Boot-Informationen in EFI-Partitionen zu lesen bzw. über den Grub-Installer Boot-Informationen in EFI-Partitionen zu schreiben und auch den EFI-Bootmanager mit Informationen zur Boot-Reihenfolge und mit entsprechenden Zieladressen zu versorgen.

https://www.gnu.org/software/grub/manual/grub.html
https://wiki.gentoo.org/wiki/GRUB2/AdvancedStorage

Ist der Einsatz von iRST auf einem UEFI-System notwendig, damit Grub2 ein Linux-System aus einer Partition eines Linux-SW-Raid-Arrays oder eines imsm-Raid-Arrays booten kann?

Die Antwort ist: Mit Grub2 kann man Linux-Betriebsysteme auf einem UEFI-System von beiden Raid-Varianten (SW-Raid und von iRST-imsm-Volumes) booten. Der Einsatz von Intels iRST-Technologie ist jedenfalls nicht erforderlich! Mann kann auch von Linux-SW-Arrays booten!

Das Aufsetzen des Betriebssystems auf einem reinen Linux-SW-Raid-Array ist nur geringfügig komplizierter als auf einem im BIOS
vorkonfigurierten iRST-Array. Allerdings sind ein paar Regeln zu beachten:

  1. Die efi-boot-Partition selbst darf nicht Bestandteil einer Linux-LVM– oder mdadm-Raid-Gruppe an Partitionen werden. Das erscheint logisch: Grub2 oder Linux müssen schon da sein, um LVM oder mdadm-Raids auswerten zu können. Das Grub2-Modul “grubx64.efi” wird ja aber gerade auf der EFI-Partition für den EFI-Bootmanager hinterlegt und von dort geladen.
  2. Die efi-Boot-Partition darf nicht Bestandteil des reinen SW-Raid-Arrays sein. Es gilt eine analoge Begründung wie beim vorherigen Punkt.
  3. Eine “initram” mit einem initramfs mit den notwendigen Treibermodulen für den Kernel ist erforderlich. Aber das wird von den meisten Linux-Installern sowieso im Zuge der Erstinstallation ordentlich prepariert.

Das bedeutet in der Praxis, dass ihr die EFI-Partition entweder auf eine separate SSD oder HDD Platte legen müsst, die nicht am vorgesehenen SSD-Raid-Verbund beteiligt ist. Oder aber: Ihr legt auf jeder der SSD-Platten, deren größere Roh-Partitionen man später in SW-Raid-Arrays unter mdadm einbinden will, zunächst eine kleine, ca. 170 MB umfassende Partition an; eine dieser Partitionen wird im Installationsvorgang bereits mit FAT formatiert und erhält dann die richtigen EFI-Einträge udn EFI-Module. Die anderen 170MB-Partitionen werden später per “”dd”-Kommando als Clones dieser ersten EFI-Partition mit Inhalten versorgt.

Keine dieser kleinen EFI-Partitionen auf den SSDs wird aber an den anzulegenden SW-Raid-Arrays beteiligt.

Grundsätzliches Vorgehen im Zuge der OS-Installation am Beispiel Opensuse

Auf einem laufenden Linux-System legt man SW-Raid-Arrays mittels mdadm-Befehlen auf der Kommandozeile an. Es lohnt sich jedenfalls, sich mit diesem Linux Raid-Tool und seinen Optionen auseinanderzusetzen. Wir gehen auf mdadm ganz konkret in einem späteren Blog-Beitrag ein. Eine etwas weniger mächtige Möglichkeit zur Anlage von SW-Raid-Arrays ergibt sich unter Opensuse aber z.B. auch der über den “YaST-Partitioner”; der kommt ja auch während einer Standardinstallation um Tragen.

Man beginnt bei der Installation zunächst mit der Anlage einer EFI-System-Partition [ESP] – z.B. unter “/dev/sda1”. Diese wird dann mit FAT formatiert. Unter Opensuse bietet der Installer über YaST-Module aber auch

  • eine grafisch unterstützte Konfiguration von mdadm-SW-Raid-Arrays aus verschiedenen unformatierten (Raid-)Roh-Partitionen unterschiedlicher HDDs/SSDs an,
  • und eine automatische Konfiguration des Grub2-Bootloaders unter Einbeziehung einer EFI-Partition an.

Partitionierungs- und mdadm-Befehle können während der Installation aber auch an einer Konsole (Wechsel etwa mit Ctrl-Alt-F2) abgesetzt werden. Das ist zu einer genaueren Parametrierung als mit YaST ggf. nötig. Der YaST-Partitioner bietet nämlich leider nicht alle für die Performance relevanten Raid-Konfigurationsmöglichkeiten als Optionen an! Eine Erstellung der Raid-Arrays über mdadm-befehle empfiehlt sich also unmittelbar vor Verwendung des YaST-Partitioners.

Der YaST-Partitioner erkennt dann die bereitgestellten Raid-Arrays und erlaubt deren weitere Bearbeitung.

Angelegte mdadm-SW-Arrays werden dann entweder direkt für bestimmte Filesysteme formatiert oder aber über LVM in Logical Volumes unterteilt und dann formatiert; geeignete Partitionen werden im Zuge der Plattenkonfiguration dann dem “/”- wie dem “/boot”-Verzeichnis zugeordnet und dort gemountet.

Die als EFI-Device mit Modulen auszustattende Partition (z.B. unter /dev/sda1) wird im weiteren Verlauf des Installationsprozesses ausgewählt, mit FAT formatiert und vom
Installer in den UEFI-Boot-Prozess eingebunden; der Grub2-Installer in seiner EFI-Variante schreibt die dafür notwendigen Infos in die ausgewählte EFI-Partition und der System-Installer nordet per “efibootmgr”-Kommando hinter den Kulissen auch das UEFI-Bootsystem richtig ein.

Installer wie YaST sorgen zudem dafür, dass das “initramfs” mit den notwendigen Kernelmodulen für den Umgang mit Raid-Arrays ausgestattet wird.

Warum mehrere EFI-Partitionen?

Der Grund, warum man letztlich mehrere EFI-Partitionen (je eine auf jeder SSD) erzeugt, ist eine Absicherung gegenüber einem Plattenausfall. Man kopiert dazu nach einer Installation die Inhalte der auf “/dev/sda1” angelegten EFI-Partition mittels des Kommandos “dd” auf die vorbereiteten, noch leeren, aber für EFI vorgesehenen 170MB-Partitionen der anderen am Array beteiligten SSDs.

Die meisten UEFI-Systeme erkennen selbständig gültige ESPs; fällt die erste davon aus, wird automatisch die nächste gültige im Bootvorgang herangezogen. Man kann die Reihenfolge der für den Bootvorgang heranzuziehenden ESPs aber auch gezielt vorgeben.

Hinweise darauf, wie man insgesamt zu verfahren hat, liefert etwa der folgende Artikel, der sich von Ubuntu auf andere Linux-Varianten verallgemeinern lässt:
http://askubuntu.com/questions/660023/how-to-install-ubuntu-14-04-64-bit-with-a-dual-boot-raid-1-partition-on-an-uefi

Ein vorkonfiguriertes iRST-Container-Volume würde das Leben bzgl. der EFI-Partition lediglich etwas vereinfachen: Da der iRST-Controller für UEFI-Systeme Boot-Unterstützung (Zwischenschicht) liefert, wird die EFI-Boot-Partition direkt als unabhängige Partition eines definierten “imsm”-Containers vorbereitet.

Hat man alles richtig gemacht, wird man feststellen, dass das EFI/Grub2-Gespann Linux-Betriebssysteme sowohl von reinen Linux-SW-Raid-Arrays als auch von iRST-Arrays bootet. Man hat das vor allem der Fähigkeit von Grub 2 zu verdanken, Files aus Raid- und LVM-Konfigurationen auszulesen.

Wir können somit Linux-Betriebssysteme und auch andere Daten auf einem Linux-SW-Raid-System bereitstellen – aber wir müssen das nicht unbedingt. Wer es dennoch tun will, kann trotzdem regulär booten!

Eine Fallgrube

Allerdings ist das “iRST/efi/grub2”-Geschäft manchmal auch mit unerwarteten Falltüren versehen:

Irrtümliches Löschen einer gültig beschriebenen EFI-Partition
Ein spezieller Fall ist der, dass man im Zuge einer OS-Installation auf einem neuen Raid-Array die Grub-Informationen nicht auf eine spezifische, neu angelegte EFI-Partition hat schreiben lassen – sondern den Grub-Eintrag auf eine bereits existierenden EFI-Partition (auf einer anderen Platte) anlegen ließ. Löscht man später wiederum irrtümlich diese ursprüngliche EFI-Partition, so geht im Bootprozess natürlich gar nichts mehr.

Mir ist das z.B. passiert, als ich das erste Mal mit einer OS-Installation auf einem SW-Raid experimentierte. Vorher lag die bis dahin gültige EFI-Partition auf einer separaten Platte und blöderweiser habe ich diese vorhandene Partition während der Installation anstelle der neu formatierten EFI-Partitionen auf den SSDs ausgewählt. Später habe ich diese Partition aber irrtümlich gelöscht, da ich ja Partitionen auf den SSDs für EFI vorgesehen hatte – aber nicht mit GRUB-Einträgen versehen hatte. Hat man dann keine weitere Partition mit einem gültigen grub-Eintrag mehr, so führt das ins Boot-Nirwana.

Ähnliches kann auch passieren, wenn parallel auch noch iRST-Container mit einer EFI-Partition vorhanden sind. Hat man die während der Installation eines OS auf neuen SW-Raid-Arrays ausgewählt, und vernichtet anschließend das iRST-Array, so kann man auch nicht mehr booten. Selbst wenn man auf anderen Platten noch gültige Grub-Boot-Einträge haben
sollte, so muss man den SATA-Controller im BIOS zunächst auf den AHCI-Modus umstellen (Storage-Einstellungen), um diese alten gültigen EFI-Boot-Einträge überhaupt finden zu können. Hier wird die iRST-Zwischenschicht offenbar auch mal zum Verhängnis. Ein Grund mehr, von vornherein nicht auf den iRST-Mechanismus zurückzugreifen.

Also: Bevor man Experimente mit der Installation eines Linux OS auf einem iRST-Raid oder auf einem SW-Raid-Array macht, vorab einen gültigen Grub-Boot-Eintrag für ein bereits existierendes Linux OS auf einer anderen Platte erstellen lassen.

Ich lege ach meinen ersten schlechten Erfahrungen vor solchen Experimenten auf irgendeiner unbeteiligten Platte meines Systems immer ein kleines Not-Linux an, dass ich zur Not von einer zugehörigen separaten EFI-Partition booten kann. Diese EFI-Partition rühre ich dann nie mehr ohne Not an. So kommt man wenigstens immer und auch nach Auflösung der experimentell angelegten RAID-Arrays oder Löschung zugehöriger EFI-Partitionen wieder in ein gültiges System. Hinweis: Manchmal muss dazu im EFI-Bootmanager (sprich im UEFI-BIOS die eingetragene Bootreihenfolge ändern).

Ein paar zusammenfassende Ratschläge

Folgende Ratschläge erscheinen mir deshalb bedenkenswert:

  • OS-Anlage – wenn möglich – am besten auf einer separaten SSD außerhalb des Raid-Systems.
  • Wenn ihr dennoch unbedingt einen Raid-Verbund mit OS auf dem Raid betreibt, so sorgt dafür, dass ihr ein zweites (!) boot- und lauffähiges OS auf einer separaten Platte (außerhalb des Raid-Verbunds) verfügbar habt. Legt auf dieser Platte (außerhalb des Raids) ebenfalls eine funktionierende EFI-Partition an. Schreibt dann vom sekundären OS einen funktionierenden Bootloader-Eintrag in genau diese EFI-Partition.
    Kurz gesagt: Sorgt dafür, dass ihr eine gültige EFI-Partition mit gültigen Grub-Einträgen auch außerhalb der am Raid-Array beteiligten Platten habt. Definiert dann die Boot-Prioritäten im BIOS. Viele UEFI-BIOS suchen bei Problemen automatisch die nächste valide efi-Partition. Ansonsten sollte man immer ein gutes Linux-Live-System parat haben.
  • Vergesst nicht, dass gerade bei SSDs der zunehmende gleichmäßige Verschleiß der Platten im Raid-Verbund die Wahrscheinlichkeit eines parallelen und zeitlich kurz hintereinander getakteten Ausfalls mehrerer Platten erhöht. Macht also von allem regelmäßig Backups. Das erspart einem im Ernstfall viel Ärger.

Ausblick

Ich habe versucht zu verdeutlichen, dass wir mit Grub2 auch auf UEFI-Systemen Linux-Systeme booten können, die auf einem Linux-SW-Raid-Array eingerichtet wurden. Weder aus Gründen der Boot-Unterstützung, noch aus Gründen der Performance (s. die früheren Artikel) ist also ein Rückgriff auf iRST-Technologie erforderlich.

Linux-SW-Raids bieten aber auch noch andere Vorteile – nämlich u.a. eine weitgehenden Flexibilität bei der Anlage verschiedener Raid-Arrays. Das ist das Thema des nächsten Beitrags dieser Serie:

SSD Raid Arrays unter Linux – VI – SW-Raid vs. iRST-Raid – Flexibilität?

 

SSD Raid Arrays unter Linux – IV – OS und Daten auf demselben Raid-Array ?

Im letzten Beitrag dieser Serie zu SSD-Raid-Arrays unter Linux

SSD Raid Arrays unter Linux – III – SW- Raid vs. Intel-RST-Raid – Performance?

hatte ich mich mit der Frage auseinandergesetzt, ob ein SSD-Raid-Array an einem Intel-Raid-Controller typischer aktueller Mainboards als iRST-Array oder nicht besser gleich als natives Linux-SW-Raid-Array erstellt werden sollte.

iRST bedeutet Intel Rapid Storage Technologie; wir hatten diese Technologie im letzten Artikel genauer beleuchtet. Aus Performance-Tests für sequentielle Read- oder Write-Zugriffe haben sich dabei keine Anhaltspunkte ergeben, die zwingend für den Einsatz der iRST-Technologie sprechen würden:

Ein natives Linux-SW-Raids mit dem gleichen Onboard-Controller im AHCI-Modus (!) liefert eine vergleichbare oder höhere Performance!

Nun könnte man aber noch Sorgen bzgl. der Boot-Unterstützung haben. Einige Leute werden ja mit dem Gedanken spielen, das Linux-Betriebssystem [OS] selbst auf dem zu konfigurierenden Raid-Array zu installieren.

Ich möchte diesen Wunsch nachfolgend zunächst kritisch hinterfragen, da die Platzierung des OS auf einem ggf. hoch belasteten Raid-Array zumindest einen zusätzlichen Komplexitätsgrad erzeugt. Im nächsten Blog-Beitrag sehe ich mir dann die Boot-Unterstützung genauer an.

Motive für die Installation des Betriebssystem auf einem Raid-Array?

Typische Motive für die Installation des Betriebssystems auf einer Partition des SSD-Raid-Arrays könnten sein:

Verbesserung der Ausfallsicherheit und potentieller Performance-Gewinn

Raid-10- oder Raid-5-Arrays können ja die Lese- und Schreibperformance eines Raid-Verbundes deutlich über die einer einzelnen SSD hinaustreiben! Bei angeblich guter Sicherheit gegenüber dem Ausfall einer einzelnen der beteiligten Platten! Warum das nicht nur für Datenzugriffe von Spezialanwendungen sondern gleich auch für normale operationale Lese- und Schreibzugriffe das Betriebssystems mit nutzen?

Aus meiner Sicht gilt jedoch :

Es gibt mehr gute Gründe gegen die Installation des OS auf einem Raid-Array für die Daten von Anwendungen als dafür. Auf gewöhnlichen Systemen empfiehlt sich eher eine Installation des OS auf einer separaten SSD. Auf Hochperformance-Systemen würde ich das OS zumindest auf einem anderen Array als einem High-Performance-Array für datenintensive Anwendungen anlegen.

Ich führe dafür nachfolgend ein paar Argumente an. Als Voraussetzung nehme ich ein Einsatz-Szenario an, in dem vor allem Datenzugriffe spezieller Anwendungen durch ein Raid-10- oder ein Raid-5-Array beschleunigt werden sollen. Das Raid-Array mit den zugehörigen Daten sei dabei einer regelmäßig hohen Belastung ausgesetzt. Wir nennen es nachfolgend “Last-Array”.

Das ist zwar eine spezielles Szenario; einige der angeführten Argumente sind jedoch auch in anderen Szenarien valide. Das gewählte Szenario zeigt zumindest auf, dass man über die Sinnhaftigkeit einer OS-Installation auf einem für Last ausgelegten Raid-Array nachdenken sollte.

Verbesserung der Ausfallsicherheit?

Aus meiner Sicht gilt ganz grundsätzlich:

Keine einzige Raid-Variante entbindet von regelmäßigen Backups!

Das liegt auf der Hand und ist für Zweifler so oft im Internet begründet worden, dass ich hier auf weitere Ausführungen verzichte.

Zu berücksichtigen ist ferner, dass die Wahrscheinlichkeit, dass gleich belastete SSDs in einem Raid-1/10/5-Verbund etwa gleichzeitig ausfallen werden, ziemlich hoch ist. Auf einem Raid-1, einem Raid-10- oder Raid-5-System darf genau nur eine Platte ausfallen. (Dass es bei Raid-10
Situationen gibt, in denen auch das noch verkraftbar ist, ändert nichts am Grundargument.) Da die Platten in solchen Raid-Verbünden einem in etwa gleichen Verschleiß ausgesetzt sind, wird auch ihr Lebensende etwa zum gleichen Zeitpunkt eintreffen – ggf. stirbt die zweite Platte noch während eines langwierigen Rekonstruktionsvorgangs. Bei einem nicht mehr rekonstruierbaren Raid-System muss man dann aber aber in jedem Fall auf Backups zurückgreifen können.

Ein Szenario mit dem OS auf einer separaten SSD oder einem separaten SSD-Array plus Backups ist demgegenüber also nicht unsicherer. Es reduziert aber die Komplexität und beinhaltet auch eine Lastentkopplung.

Komplexitätsreduktion und Lastentkopplung

Liegen das OS und das Root-Verzeichnis auf einer vom Last-Array separaten SSD bzw. auf einem separaten SSD-Array, so werden die Ausfallmöglichkeiten des Last-Arrays von denen der OS-SSD entkoppelt.

Zudem kommt es zu einer Entkopplung der Last und damit des Verschleißes: Ein hoher Verschleiß der SSDs des Last-Arrays für High-Performance-Anwendungen schlägt sich nicht 1 zu 1 auf die SSD oder das separate SSD-Array des OS nieder. Und ggf. vice versa.

Zudem werden die Strukturen einfacher und flexibler, auch wenn das zunächst nicht den Anschein hat: Nicht ohne Grund mountet man von Haus aus Datenpartitionen oder spezielle Anwendungspartitionen auf bestimmte Zweige des Verzeichnisbaums. Das ermöglicht separate Backups und im Fall von System-Upgrades bleibt die Datenhaltung völlig außen vor. Man denke etwa an Datenbank-Daten, imap-Daten, die Partitionen virtualisierter Systeme etc., die man ggf. auf dem Last-Array platziert hat.

Fällt das Last-Array aus oder degradiert, ist nicht das OS betroffen. Fällt dagegen die SSD des OS aus, kann man das Array sofort wieder auf das Rootverzeichnis eines OS auf einer Ersatz-SSD mounten.

Die Rekonstruktion eines Raid-Arrays erfordert ein laufendes Betriebssystem – eine schnelle Rekonstruktion ein OS auf einer separaten Platte!

Es ergibt sich ein weiterer Punkt, über den man nachdenken sollte:

Hat das Raid-System einen Schaden oder fällt es gar ganz aus, will man trotzdem zeitnah booten können. Die Rekonstruktion eines (SW-) Arrays und das Monitoring dieses Prozesses setzen meist ein laufendes Linux-System voraus. Es ist also durchaus sinnvoll, das OS auf einer separaten SSD oder einem separaten (kleinen) Raid-Array zu halten.

Das Betriebssystem selbst ist bei vernünftiger Partitionierung relativ klein; bei Ausfall der OS-Platte oder -Partition ist es auf einer separaten Ersatzplatte sehr viel schneller rekonstruiert als ein großes Raid-System insgesamt.

Die Rekonstruktion eines defekten degraded Raid-Arrays aus einem auf dem Raid selbst liegenden OS heraus dauert ggf. sehr lange: Eine von Haus aus schlechte Restaurierungs-Performance von z.B. Raid-5-Arrays würde durch den laufenden OS-Betrieb im beschädigten Raid-Verbund noch einmal verschlechtert. Laufende Schreibprozesse aus dem Betriebssystem interferieren mit der Array-Rekonstruktion und können über die heranzuziehenden Paritätsalgorithmen auch nur langsam an das (noch) beschädigte Raid-Array übertragen werden.

Performancegewinn für das Betriebssystem durch RAID?

Linux puffert den normalen Festplattenzugriff so gut, dass man aus meiner Sicht nicht zwingend ein SSD-Array für eine hinreichend gute Basisperformance des Linux-Systems benötigt. Das sieht für spezielle Anwendungen oder etwa einen hochbelasteten Fileservice ggf. anders aus. Für das Kern-OS und seine Platteninteraktionen selbst genügt eine einzelne SSD bei möglichst großem RAM jedoch völlig. Das gilt umso mehr, als gerade bei kleineren Datenpaketen die Raid-Performance je nach Parametrierung sich nur wenig von der perfromance einer SSD abheben mag. Ich werde auf diesen interessanten Punkt in späteren Artikeln zurückkommen.

Beeinträchtigung der Performance eines Last-Raid-Arrays durch ein dort installiertes OS?

Nach meiner bisherigen Erfahrung gilt:

Würde man das OS auf einer Partition eines vorgesehenen (Daten-) Raid-Arrays installieren, so hätte das spürbaren (!) Einfluss auf die Gesamt-Performance dieses Last-Array und dessen Latenz. Random I/O-Prozesse des OS interferieren dann mit denen der Anwendungsprozesse, die man ja eigentlich mit Hilfe des Raid-Systems performanter machen will. Ich habe im Mittel etwa 10% an Performance-Einbußen durch Tests von Arrays mit aktivem OS nachvollziehen können. Für Datenbankanwendungen wie Fileservices, die verschieden konfigurierte Last-Arrays nutzten.

Man sollte das auf seinen eigenen Systemen in jedem Falle überprüfen.

Separates Raid-System für das OS?

Die Frage, ob das OS auf einem (separaten) Raid-System liegen soll, hängt letztlich auch von der Anzahl erstellbarer Raid-Arrays (bzw. im Fall des iRST von der Anzahl separat erstellbarer Container) und damit vom Geldbeutel ab. Ich sehe für eine Installation des OS auf einem Raid-Array, das primär für performanten Daten-I/O bestimmter High-Performance-Anwendungen gedacht ist, keinen überzeugenden Grund. (Es sei denn, man möchte aus irgendwelchen Eitelkeiten heraus extrem schnelle Bootzeiten produzieren.)

Will man das OS aber aus Gründen einer verbesserten Ausfallsicherheit auf einem SSD-Array anlegen, dann bitte auf einem separaten Array (bzw. beim iRST: auf einem Volume eines separaten Containers); dieses Array sollte nicht auch gleichzeitig die Daten geplanter Hochperformance-Anwendungen beherbergen.

Unbestritten ist: Ein separates Raid-10-System mit ggf. hochwertigen Enterprise SSDs ist ein guter Ort für das OS eines Hochperformance-Systems – wenn man denn das dafür nötige Kleingeld hat.

Rücksichtnahme auf Lastprofile!

Ein Raid-System für ein OS erfordert aus Performancegründen ggf. eine andere Parametrierung als ein Last-Array für die Daten von Anwendungen mit einer ganz bestimmten Zugriffs-Charakteristik. Ein Lastprofil, das laufend durch kurze einzelne aufeinander folgende I/O-Spikes für kurze Datenblöcke (< 64KB) gekennzeichnet ist (OS oder bestimmte DB-Anwendungen), ist anders zu bewerten als ein Lastprofil, bei dem viele Jobs parallel große Datenpakete (> 1 MB) auf und von einem Raid-System befördern müssen (Fileserver) oder gar ein Profil, auf dem große Videodateien (> n x 10MB) sequentiell verarbeitet werden.

Entsprechend unterschiedlich sollten zugehörige Raid-Systeme konfiguriert werden. Ich komme darauf in weiteren Artikeln zurück. Auch dieser Punkt spricht für die Trennung des Last-Arrays von Arrays für das OS.

Lösungsansatz: Wie gehe ich persönlich vor?

Sieht man einmal von puren Performance ab, so ist aus den obigen Gründen in vielen Fällen ein Vorgehen sinnvoll, bei dem das OS samt Root-Filesystem auf einer vom Raid-Verband unabhängigen SSD liegt und das Last-Array auf ein Spezialverzeichnis gemountet wird. Zudem ist für eine hinreichende RAM-Ausstattung des Systems zu sorgen. Zu finanzieren ist ferner eine Ersatz-SSD.

Für dieses Vorgehen gilt:

  • Es reduziert Komplexität im Bootvorgang.
  • Es kann durch Einsatz einer weiteren Ersatz-SSD, die mit einer boot- udn laufenden OS-Installation versehen wird, gegen Ausfälle der OS-SSD abgesichert werden. Die Ersatz-SSD kann gegen Verschleiß weitgehend geschont werden; sie muss erst im Notfall mit einem aktuellen OS-Abbild aus einer Sicherung, die z.B. täglich auf konventionellen Medien (HDD) hinterlegt wurde, versehen werden. Ein solcher Transfer dauert heutzutage nur wenige Minuten. Tipp am Rande: Die Identifikation der OS-Platten im Boot-Loader in diesem Szenario eher konventionell, also neutral und nicht über eindeutige Device-IDs, vornehmen.
  • Eine
    eintretende Degradierung des Last-Arrays durch einen SSD-Ausfall betrifft nicht die Operabilität anderer Systembestandteile. Mit einem “degraded SSD-Spezial-Array” kann man sich dann kontrolliert von einem immer noch funktionierenden separaten OS aus befassen.
  • Die SSD für das OS sollte aber Enterprise-Qualität haben und seitens des Herstellers gegen schnellen Verschleiß gewappnet sein.

Käme es auf Geld nicht an, würde ich auf manchen Systemen dem OS und der Root-Partition ein eigenes Raid-10-Array spendieren.

Ausblick

OK – man hat schon gemerkt: Ich halte nicht viel davon, das OS auf einem Raid-Array für die Daten von Hoch-Performance-Anwendungen unterzubringen. Aber manch einer hat entweder so viel Geld, dass er sich ein separates, dediziertes SSD-Raid-Array für das Betriebssystem leisten kann. Oder manch einer ist aus anderen Gründen gzwungen, das OS im einzigen vorhandenen SSD-Raid-Array zu installieren (z.B. auf einem Laptop). dann stellt sich die Frage:

Wird das Booten eines OS in einem Linux-SW-Raid-Array überhaupt unterstützt? Oder ist man hier beim Einsatz von Mainboards mit Intel Chipsatz auf iRST angewiesen?

Darum dreht sich der nächste Artikel dieser Serie:
SSD Raid Arrays unter Linux – V – SW-Raid vs. iRST-Raid – Bootunterstützung?

 

SSD Raid Arrays unter Linux – III – SW- Raid vs. Intel-iRST-Raid – Performance?

In den ersten beiden Beiträgen zu SSD-Raid-Arrays unter Linux

SSD Raid Arrays unter Linux – I – ein facettenreiches Thema
SSD Raid Arrays unter Linux – II – Hardwarecontroller ?

hatte ich angekündigt, die Frage zu beantworten, ob sich auf einem Linux-System der Einsatz des Intel-Z170-SATA3-Controllers als iRST-Controller im Gegensatz zur Erstellung eines nativen Linux-SW-Raids lohnen würde.

iRST bedeutet Intel Rapid Storage Technologie; sie erlaubt eine Bündelung von Platten, die an den Z170-Onboard-Controller angeschlossen sind, zu einem Raid-Verbund (Raid 0, 1, 10, 5, 6) – und zwar erfolgt die Konfiguration dabei über BIOS-Funktionalitäten.

Einen iRST-fähigen Raid-Controller findet man im Moment auf vielen aktuellen Consumer-Mainboards mit Intel-Chipsätzen vor. Ein Beispiel liefert das von mir auf einem Testssystem eingesetzte Board “ASRock Z170 Extreme 7”.

Die vorweggenommene Antwort auf die Eingangsfrage ist aus meiner Sicht: Nein – zumindest nicht aus Performancegründen.

Das gilt, obwohl einfache Performance-Tests für RAID 10-Arrays zunächst das Gegenteil anzudeuten schienen.

Grundsätzliche Anmerkungen zur Intel RST Technologie

Intels Z170 SATA3 Controller im iRST-Modus entspricht einem Raid-Fake-Controller mit minimaler Intelligenz – aber guter Boot-Unterstützung. Im AHCI-Modus behandelt der SATA3-Controller die angeschlossenen SSDs über das SATA3-Interface als einzelne Platten. Der iRST-Modus lässt sich im BIOS dagegen über die Option “Array” statt AHCI aktivieren. Die Platten werden dann zu einem sog. Container-Verband (Raid) zusammengeschlossen, auf dem wiederum Volumes definiert werden können.

Konfigurationsoptionen im (UEFI-) BIOS
Der iRST-Modus zieht eine Zwischenschicht zum (UEFI-) BIOS ein. Je nach Board, BIOS und OpRom-Einstellungen ist das iRST-Setup-Menü über eine spezielle Tastenkombination (Ctrl-I) während des BIOS Self-Tests oder durch einen Menüpunkt im UEFI-Interface selbst zugänglich. Oft unter “Advanced” – nach dem man vorher unter einem Punkt “Storage” (o.ä.) die Behandlung der SSDs von “AHCI” auf “RAID” umgestellt hat.

Eigenes Containerformat “imsm”
iRST benutzt für die Datenorganisation eines Raid-Verbunds ein eigenes Container-Metaformat (das sog. “imsm”-Format; man spricht von sog. “imsm”-Containern; dei Abkürzung steht für “Intel Matrix Storage Manager”). Ein Container bindet mehrere Platten zu einer Gruppe zusammen. Bei hinreichender Plattenanzahl können auch mehrere Raid-Container angelegt werden, die sich über jeweils unterschiedliche, disjunkte Gruppen von vorhandenen Platten erstrecken. Hat man einen Raid-10-Verbund als Ziel und nur 4 Platten zur Verfügung, so ist jedoch bereits mit einem Container das Ende der Fahnenstange erreicht.

Genau zwei Volumes pro Container
Ein imsm-Raid-Container, der sich über n definierte Platten hinweg erstreckt, kann genau zwei sog. Raid-Volumes (entspricht landläufigen Raid-Arrays) enthalten.

Für das erste Volume ist die Kapazität (also die Größe in MByte) noch festlegbar; das zweite nutzt dann aber den kompletten Rest der verbliebenen Container-Kapazität. Die einmal definierten Kapazitäten sind im Nachhinein nicht dynamisch veränderbar. Das ganze Raid-System ist bei notwendigen Modifikationen neu anzulegen.

Die zwei möglichen Volumes erstrecken sich über dieselbe Anzahl an Platten; sie können aber 2 verschiedenen Raid-Levels (z.B. Raid 1 und
Raid 10) zugeordnet werden (das ist gerade das Kennzeichen der Intel Raid Matrix Technologie).

Ein Volume – also ein Raid Array – steht unter Linux (mit aktiven Raid-Modulen) dann als ein partitionierbares Block-Device zur Verfügung.

Der/die Raid-Container mit jeweils maximal 2 Raid-Volumes können bereits im (UEFI)-BIOS (über ein OpROM Optionsmenü für Storagesysteme) erstellt werden. Die Möglichkeit zur Anlage von Raid-Containern und Arrays über BIOS-Funktionen ist im Besonderen für Dual-Boot-Systeme mit Windows nützlich.

Anlage von imsm-Containern über mdadm unter Linux
Auf einem reinen Linux-System kann man Container wie Volumes im laufende Betrieb aber auch über das Raid-Administrations-Tool mdadm erstellen und verwalten – unter Angabe des imsm-Metadaten-Formats (mdadm-Option “-e imsm”). Bei Linux-Installern, die während des Install-Prozesses den Rückgriff auf Terminals erlauben, geht das auch während des Installierens.

So weit, so gut. Es ist auf den ersten Blick durchaus bequem, bereits vor einer Linux-Installation die Raid-Arrays über UEFI-BIOS-Funktionen anzulegen, um sie dann schon während der Installation als einfache Pseudo-Laufwerke vorzufinden, die man direkt formatieren kann. Unter Opensuse Leap 42.1/42.2 klappt das ohne Probleme.

Die Volumes der angelegten Container sind auf einem Dual-Boot-System auch von der Windows-Installation aus ansprechbar, formatier- und bootbar. Das ist ein echter Vorteil des iRST.

Links zu iRST
Details zu iRST – im Besonderen zur Einrichtung unter Linux mit Hilfe von mdadm – findet man hier:
http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/rst-linux-paper.pdf
https://en.wikipedia.org/wiki/Intel_Matrix_RAID
http://www.intel.de/content/www/de/de/support/boards-and-kits/000005789.html
http://www.intel.de/content/www/de/de/support/boards-and-kits/000006040.html
http://www.intel.com/content/dam/support/us/en/documents/solid-state-drives/RSTe_NVMe_for_Linux_SW_User_Guide.pdf
http://www.intel.com/content/dam/support/us/en/documents/
chipsets/rste/sb/intelr_rste_linux.pdf

Wie intelligent ist iRST wirklich? Ist ein iRST-Controller unter Linux ein Fake-Controller?

Es stellen sich die Frage:

  • Wer oder was steuert eigentlich bei einem laufenden Betriebssystem [OS] die Datenverteilung auf die Platten? Das Betriebssystem [OS] oder der iRST-Controller?

Hierzu ist Folgendes zu sagen:

Die Funktionalität der definierten Container und ihrer Arrays hängt völlig von den Treibern und den Fähigkeiten des gebooteten Betriebssystems ab. Der iRST wird unter Linux durch angepasste Komponenten/Module des “md”-Raid-Systems und administrationsseitig durch mdadm unterstützt. Ohne eine vorhandene Linux-Steuer-SW und zugehörige Kernel-Module (u.a. md_mod, raid5, raid10, etc.) bringt iRST unter Linux gar nichts.

Ein iRST-Controller ist also tatsächlich ein sog. Fake Controller:

Die Hauptarbeit wird nicht durch den Controller selbst, sondern durch das Betriebssystem und zugehörige Software (Treiber) geleistet. Es ist deshalb zwar nicht ausgeschlossen, aber zumindest unwahrscheinlich,
dass der in mdadm integrierte spezielle iRST/imsm-Treiber unter Linux besondere Performancevorteile gegenüber einem reinen, nativen SW-Raid, das man auch mit mdadm aufsetzt, bieten wird.

Raid 10 aus 4 SSDs – sequentielle I/O-Performance mit und ohne iRST

Wir betrachten nachfolgend die Performance eines mit Hilfe des Z170-iRST-Controllers erstellten Raid10-Verbands aus 4 850 EVO SSDs von Samsung. Verglichen wird das iRST-Raid-Array mit einem reinen Linux-SW-Raid-Array, das mit denselben Platten aufgesetzt wurde.

Das Betriebssystem lag in beiden Fällen auf einer separaten SSD und nicht auf einer Partition des Raid-Verbunds. (Das gibt uns im Schnitt mindestens 10% Performance-Vorteile.)

Bei der Erstellung des iRST-Raid10-Volumes habe ich mich an die Default-Chunksize gehalten, die die BIOS Funktionen angeboten werden.

Default Chunk-Size des iRST: 32 KB

Ein Hinweis für diejenigen, die die Tests konkret nachstellen wollen:

Für die SW-Raid-Konfigurationen unter Linux sollte man den Controller in den AHCI-Modus für den SSD-Zugriff versetzen! Dies ist i.d.R. über eine Option im BIOS möglich!

An dieser Stelle mag ein Blick auf Daten des Test-Tools “gnome-disks” genügen. Ich zeige hier Daten für Lese/Schreib-Zugriffe für relativ große sog. “Messwertgrößen” – was immer das genau bei diesem Test intern bedeutet. Aus bestimmten Gründen glaube ich nicht, dass es sich bei der “Messwertgröße” um die Blocksize von einzelnen Datenpaketen handelt; das verträgt sich nämlich nicht mit Daten aus anderen Tests. Aber im vorliegenden Artikel kommt es mir ja nur auf relative Verhältnisse an! Differenziertere und genauere Tests, die ich später mit dem Tool “fio” durchgeführt habe, ändern übrigens nichts am Ergebnis des hier präsentierten Vergleichs des iRST-Raids gegenüber einem Standard SW-Linux Raid.

Die untersuchten Partitionen waren (soweit nichts anderes angegeben ist) in beiden Fällen als LVM-Volumes erstellt worden.

Daten für den iRST-Controller – 20 MB “Messwertgröße”
irst_raid_ssdroot_20mb

Daten für ein reines Linux SW-Raid – 20 MB “Messwertgröße”
swraid_ssdroot_20mb

Die bereits hier erkennbare Tendenz etwas höherer Lese- und geringerer Schreibraten wird scheinbar noch deutlicher bei kleineren “Meßwertgrößen”:

Daten für den iRST-Controller – 1 MB “Messwertgröße” – nach TRIM
irst_raid_ssdroot_1mb_after_trim

Daten für den iRST-Controller – 1 MB “Messwertgröße” – Sättigung
irst_raid_ssdroot_1mb

Dagegen:
Daten für eine reines Linux SW-Raid – 1 MB “Messwertgröße” – Sättigung
swraid_ssdroot_1mb

Zwischenergebnis:

Die obigen Daten wirken so, als ob ein reines SW-Raid unter Linux langsamer sei. Der
gemessene Unterschied in der Schreibrate von bis zu 100 MB/sec bei 1MB Daten (vermutlich mit deutlich kleinerer Blocksize geschrieben) bei einem Minimalwert von 290 MB/sec wiegt auf den ersten Blick schwer und entspricht einem relativen Unterschied von ca. 34%.

Zudem wird die theoretisch mögliche reine Datenschreibrate einer einzelnen EVO 850 SSD (zw. 300 und 490 MB/s je nach Testsetup und Größe der zu schreibenden Blöcke) durch das Raid-System bereits unterschritten.

Aber ist dieser Befund tatsächlich valide?

iRST-Performance-Vorteile ?

Bringt der iRST-NModus des Intel SATA-3-Controllers gegenüber einem reinen SW-Raid doch spürbare Vorteile? Nein, das obige Ergebnis täuscht in zweierlei Hinsicht.

Nachfolgend betrachten wir zunächst die Daten für ein besser parametriertes reines SW-Raid-System: Die Performance wird nun mit der des iRST-Arrays vergleichbar wird.

Bei den nachfolgenden Abbildungen ist ferner zu beachten, dass die Unsicherheit der Daten (u.a. durch nicht getrimmtes Filesystem, interferierende Prozesse im OS) ca. 10 – 20 MB/sec ausmachen kann. Die dargestellten Abbildungen zeigen zufällige und nicht die in Tests zeitweise erreichten maximalen Werte.

Daten für besser parametriertes reines SW-Raid – mit LVM – 20 MB “Messwertgröße”
swraid_ssd_optimiert_20mb_with_lvm

Daten für besser parametriertes reines SW-Raid-Array – ohne LVM – 20 MB “Messwertgröße”
swraid_ssd_optimiert_20mb_without_lvm

Daten für besser parametriertes reines SW-Raid-Array – mit LVM – Chunk Size: 16KB – 20 MB “Messwertgröße”
swraid_ssd_optimiert_16k_20mb_with_lvm

Für die Messgröße 1MB betrachten wir nun mal den Einfluss der sog. Chunk-Size des Arrays etwas genauer:

Daten für ein besser parametriertes reines SW-Raid-Array – ohne LVM – Chunk Size: 512KB – 1 MB “Messwertgröße”
swraid_ssd_optimiert_512k_1mb_without_lvm

Daten für ein besser parametriertes reines SW-Raid-Array – mit LVM – Chunk Size: 64KB – 1 MB “Messwertgröße”
swraid_ssd_optimiert_64k_1mb_with_lvm

Daten für besser parametriertes reines SW-Raid-Arrays – mit LVM – – Chunk Size: 32KB – 1 MB “Messwertgröße”
swraid_ssd_optimiert_32k_1mb_with_lvm
 
Die letzten Bilder deuten bereits an, dass die Chunk-Size eines Raid-Arrays gerade bei kleineren Datenblöcken offenbar einen größeren Einfluss auf die Performance – und im besonderen die Write-Performance – hat. Wir kommen hierauf in detaillierterer und systematischer Weise in einem späteren Beitrag zurück.

Der Einsatz von LVM als Zwischenschicht zwischen Partitionen und Filesystem der LVM-Volumes fällt
dagegen kaum ins Gewicht.

Ich darf an dieser Stelle verraten, dass für die Annäherung an die bzw. das Übertreffen der iRST-Werte genau eine kleine Änderung bei der Erstellung des SW-Raids eine wesentliche Rolle spielte. Siehe hierzu einen der nächsten Beiträge in dieser Serie.

Die Graphiken zu den Schreibraten täuschen aber auch in anderer Hinsicht:

Sie geben nicht die tatsächlich erreichbaren Schreibraten wieder. Ein differenzierter und genauer einstellbarer Test mit dem Tool FIO liefert ganz andere und deutlich höher Schreibraten für Datenpaketgrößen von 1 MB. Ich komme hierauf in einem späteren Artikel der Serie zurück. Die “gnome-diskd”-Ergebnisse für die erreichbaren Schreibraten sind aus meiner Sicht also mit einem Fragezeichen zu versehen.

Ist der Einsatz des iRST-Modus des Intel Z170-SATA3-Controllers notwendig für eine optimale SSD-Performance?

Die Antwort auf Frage ist klar Nein. Die obigen Daten belegen, dass Performance-Aspekte keinen Grund für oder gegen den Einsatz des iRST-Modus darstellen. Sie sprechen eher für den Einsatz eines reinen SW-Raid-Systems unter Linux:

Richtig konfiguriert, erreicht man bei den Schreibraten mindestens die Werte des iRST und in der Leserate übertrifft man sie regelmäßig.

Kein Argument für oder gegen den iRST-Einsatz stellt aus meiner Sicht zudem die CPU-Belastung dar. Ich konnte keine substanziellen Unterschiede erkennen:

Auf einem Linux-System mit 4 CPU Cores (i7 6700K) und Hyperthreading ist die CPU-Belastung für die 8 CPU-Threads außerhalb von (Re-)Sync-Phasen in der Praxis unerheblich, solange nicht viele große Raid-Verbände angesteuert werden müssen. Die Raid-Behandlung (Striping etc.) erfolgt in aktuellen Kerneln (seit Version 3.12) zudem multi-threaded.

Ausblick

Genug für heute. Im nächsten Artikel

SSD Raid Arrays unter Linux – IV – OS und Daten auf einem Raid-Array ?

gehe ich ein wenig auf die Datenverteilung ein. Sollte man z.B. das Betriebssystem samt root-Verzeichnis auf demselben Raid-Array installieren, das für hochperformante Datenzugriffe von Spezialanwendungen gedacht ist? Ich werde einen solchen Lösungsansatz kritisch hinterfragen.

Auf einem UEFI-System könnte sich anschließend folgende Frage stellen:

Muss nicht schon das UEFI-BIOS das Intel-RAID-System des Z170-Controllers genau kennen, damit über Grub2 ein Linux-OS, das auf einem SSD-Raid-Array am Intel-Controller installiert wird, anstandslos gebootet werden kann? Ist deswegen nicht zwingend iRST erforderlich?

Wir werden aber in einem kommenden Beitrag

SSD Raid Arrays unter Linux – V – SW-Raid vs. iRST-Raid – Boot-Unterstützung?

sehen, dass diese Sorgen ganz unbegründet sind.

 

SSD Raid Arrays unter Linux – I – ein facettenreiches Thema

Ein neues Test-System bietet eine gute Gelegenheit, neue Technologie unter Linux auszuprobieren. In diesem Fall einen SSD-Raid-Verbund. So etwas mache ich natürlich nicht nur zum Vergnügen. Mein eigentliches Ziel ist es, Berechnungen eines Kunden, die auf Daten einer oder mehrerer MySQL-Datenbanken mit Tabellen mit bis 20 Millionen Datensätzen zurückgreifen, für die HW eines kleineren Standalone-Servers zu optimieren. Dabei sollen die Raid-Arrays auf ein bestimmtes Lastverhalten und andere Faktoren hin optimiert werden. Ich habe dabei doch ein paar Überraschungen erlebt.

Bzgl. SSDs hat sich in den letzten Jahren ja viel getan; die aktuellen SSDs sind schneller, die preislich erschwingliche Kapazität ist deutlich größer geworden. Am wichtigsten ist aber, dass sich die Haltbarkeit verbessert hat. Das ist für kleinere Unternehmen durchaus ein Punkt. Der Austausch von mehreren SSDs kostet ja nicht nur Geld, sondern auch Betriebsausfallzeiten und ggf. Aufwände externer Administratoren.

Diese Artikelserie ist für Leute gedacht, die sich dem Einsatz von SSD-Arrays im privaten Bereich oder aber in kleinen Unternehmen annähern wollen – und dabei sicher über einige grundlegende Fragen stolpern. Wir betrachten also SSD-Raid-Arrays in Linux-Workstations oder kleineren Linux-Servern. Dabei fassen wir auch den Einsatz von SATA3-Onboard-Controllern ins Auge – für Intel Chipsätze wie den Z170, dessen Sunrise-Point-Controller und Intels zugehörige, sog. “iRST”-Technologie.

In einem Linux-Blog ist vor allem auch der Einsatz von Linux-SW-Raid-Arrays von Interesse. Viele der in den kommenden Artikeln getroffenen Feststellungen zu Linux-SW-Raids gelten dabei ganz unabhängig von der Anlagengröße oder dem verwendeten SATA/SAS-Controller.

Raid mit SSDs – ein facettenreiches Thema

Warum will man überhaupt SSD-Raid-Arrays einsetzen? Typische Motive sind: Eine Verbesserung der Ausfallsicherheit und Performanceverbesserungen über das Leistungsvermögen einer einzelnen SSD hinaus.

Nach meiner Meinung sollte man diese Punkte jedoch gut hinterfragen, bevor man unbedarft Geld in die Beschaffung mehrerer SSDs steckt. Im Besonderen sollte man nicht auf Werbeversprechen, die mit sequentiellen Lese- und Schreibraten argumentieren, hereinfallen. Ferner gibt es (nicht nur unter Linux) einige weitere Punkte zu beachten:

  • Kann man für kleinere Server Mainboard-Sata-Controller nutzen? Oder ist ein Griff zu HW-Controllern schon aus Performancegründen unumgänglich?
  • Bietet der Einsatz spezieller Technologie (wie etwa Intels iRST; s.u.) für einfache Mainboard SATA3-Controller Vorteile gegenüber nativen SW-Raid-Verfahren unter Linux?
  • Will man das System aus einem Raid-Array heraus booten? Geht das überhaupt?
  • Wie sieht es mit dem Verschleiß der SSDs aus? Hat die Art des Raid-Systems darauf einen Einfluss? Lässt sich der fstrim-Befehl für Partitionen auf Raid-Arrays absetzen?
  • Von welchen Faktoren und Konfigurationsparametern hängt die Performance eines Linux-SW-Raid-Arrays ab?
  • Kann man den Standardeinstellungen vertrauen, die manche Linux-Installer für die Konfiguration von Raid-Arrays anbieten?

Arbeitet man sich in die Thematik ein, so merkt man schnell, dass das Thema “SSD-Arrays” eine Wissenschaft für sich ist. Und dann stößt man z.T. auch auf wirklich widersprüchliche Hinweise im Internet:

Das schlimmste Beispiel sind Artikel zur sog. Chunk-Size eines Arrays. Da werden von Administratoren mal möglichst große Chunk-Sizes im Bereich von 2 MB empfohlen, während andere möglichst kleine “Chunk Size”-Größen zwischen 8 und 32 KB empfehlen. Jeweils natürlich mit unterschiedlichen Begründungen, die vom Leser
selten zur Deckung gebracht werden können. Es kommt dann die Frage auf, ob die jeweiligen Autoren nicht implizite Annahmen bzgl. bestimmter Lastprofilen gemacht haben …

Ich habe nun mehrere Tage mit eigenen Tests und Informationsbeschaffung verbracht – erst jetzt hat sich ein Vorgehensmodell herauskristallisiert. Ich werde mir dabei aus guten Gründen Reserven für weitere datenbankspezifische Experimente offen lassen. Inzwischen habe ich immerhin einige Erkenntnisse gewonnen, die auch anderen helfen können, wenigstens ein paar essentielle Fehler und eine unkritische Übernahmen von Empfehlungen zu vermeiden.

Verfügbare Ressourcen auf dem neuen Test-System

Mein neues Testsystem hat folgende Ressourcen:
i6700K-CPU, 64 GB RAM, 4 Raid10 HDDs mit HW-Controller, 1 rel. teure SSD 850 Pro, 4 relativ kostengünstige SSDs 850 EVO.

Das Z170-Mainboard weist einen onboard Intel Z170-SATA3-Controller (Sunrise Point) auf, der mit Intel Rapid Storage Technologie [iRST] betrieben werden kann. Es handelt sich dabei um eine Lösung von Intel, die eine (Vor-) Konfiguration von Raid-Platten-Verbänden bereits im BIOS zulässt. Ich spreche in den kommenden Artikeln kurz vom “iRST-Controller”, wenn denn iRST im BIOS aktiviert ist.

Was ist das vorläufige Zwischenergebnis nach etlichen Tests?

Um den Leser einen Vorgeschmack zu geben, hier ein paar vorläufige Entscheidungen:

  1. Ich habe eine klare Entscheidung für Linux-SW-Raid getroffen und gegen den Einsatz von iRST getroffen. Weniger aus Performance-Gründen, als vor allem aus Gründen der Flexibilität. Auf iRST werde ich ganz verzichten; die Platten werden BIOS-seitig im reinen AHCI-Modus angesprochen.
  2. Es werden hauptsächlich Raid-10-Arrays und keine Raid-5-Arrays zum Einsatz kommen. Dies ist eine fundamental wichtige Entscheidung! Sie ist primär dadurch motiviert, die SSDs zu schonen. Raid 10 ist hinsichtlich Plattenplatz teuer – aber das erscheint mir im Vergleich zur Plattenabnutzung nach meinen bisherigen Erfahrungen ein relativ kleiner Preis zu sein.
  3. Ich werde das Betriebssystem (OS Suse 42.2 und alternativ Debian) nicht auf einer Partition des Raid-Systems selbst aufsetzen – und wenn doch, dann nur zu Testzwecken, aber nicht zum produktiven Arbeiten.
  4. Ich werde die Raid-Erstellung nicht halbautomatisch über YaST, sondern manuell vornehmen. Hierfür gibt es einen guten Grund, den ich in einem kommenden Artikel erläutern werde.
  5. Bzgl. des Partition-Alignments werde ich dagegen nach vielen manuellen Checks Opensuses’ YaST bzgl. dessen Alignment-Algorithmen vertrauen.
  6. Insgesamt werde ich auf den SSDs ca. 12% Plattenplatz ungenutzt lassen. Das ist teuer, aber bzgl. des Verschleißes eine Vorsichtsmaßnahme.

  7. LVM wird zum Einsatz kommen; die logischen Volumes werden mit guten Reserven bzgl. des eigentlichen Platzbedarfes angelegt.
  8. Ich werde mir die Option für mehr als 2 Raid Arrays auf ein und demselben Plattenverbund offen lassen. Für echte Hochperformance-Aufgaben werde ich kleine Raid-5-Arrays weiter austesten.
  9. Für weitere intensivere Applikations- und Datenbanktests werde ich mindestens 2 Raid-Arrays mit ganz unterschiedlichen Raid Chunk Sizes, nämlich 512KB bzw. 32KB verwenden. Die Chunk Size hat sich als ein essentieller Parameter für eine gute Performance erwiesen.
  10. Bzgl. der endgültigen Wahl der Chunk Size gibt es gleich mehrere Aspekte zu beachten – u.a. die Art der Last: Random I/O? Kleine Blocksizes? Viele parallele und konkurrierende Prozesse mit Plattenzugriff oder eher
    zeitlich getrennte Einzelprozesse mit hohen Last-Peaks? Viele separate Zugriffe? Applikationen mit Threading zur Lastverteilung? Auf einem halbwegs ausgelasteten Fileserver wüsste ich jetzt bereits die richtige Wahl; für unsere spezielle PHP/MySQL-Anwendung sind weitere Tests und ggf. sogar eine stärkere Parallelisierung des SW-Algorithmen für mehrere CPU-Cores erforderlich.

Eine wichtige Sache, die ich auch gelernt habe:

Man kann die potentiellen Probleme nicht allein mit einfachen Testtools wie “hdparm -tT”, “dd” für das Lesen und Schreiben größerer Test-Datenmengen mit unterschiedlichen Blockgrößen oder grafischen Tools wie “gnome-disks” erfassen.

Ein Ergebnis wie

irst_raid_ssdroot_20mb_400_from_old_rux

für den iRST ist nicht wirklich aussagekräftig. Tools wie “fio”, die eine differenzierter parametrierte Last erzeugen können, sind wesentlich hilfreicher.

Aber der Reihe nach – in den zunächst kommenden Teilen dieser Miniserie
SSD Raid Arrays unter Linux – II – HW-Controller?
gehe ich zunächst ein wenig auf das Thema HW-Controller ein. Lohnt sich deren Einsatz?

Es folgen dann ein paar Beiträge zum Einsatz von iRST im Vergleich zu nativen SW-Raids.

Danach werde ich mich mit Frage Raid-5 vs. Raid-10 auseinandersetzen. Ein weiterer Artikel zeigt dann, wie man Raid-10-Arrays unter Linux praktisch konfiguriert.

Schließlich werde ich Performance-Daten präsentieren und daraus Schlussfolgerungen bzgl. der Raid-Konfiguration ziehen.

Der eine oder andere praktisch veranlagte Leser wird sich im Gegensatz zu der von mir gewählten Themenfolge vielleicht als erstes auf das Thema einer Anlage und Konfiguration von SW-Raid-Arrays stürzen wollen. Bitte, kein Problem! Ich empfehle vorab eine intensive Auseinandersetzung mit dem “mdadm”-Kommando und seinen Optionen. Siehe zur Einführung etwa

https://raid.wiki.kernel.org/index.php/RAID_setup
https://www.thomas-krenn.com/de/wiki/Software_RAID_mit_MDADM_verwalten
https://www.digitalocean.com/community/tutorials/how-to-create-raid-arrays-with-mdadm-on-ubuntu-16-04
https://linux.die.net/man/8/mdadm
https://doc.opensuse.org/documentation/leap/reference/html/book.opensuse.reference/cha.advdisk.html#sec.yast2.system.raid

Einen kleinen “Kurs” zu mdadm bietet die Seite
https://www.tecmint.com/understanding-raid-setup-in-linux/.

Open Visual Traceroute, Opensuse Leap 42.1 and sudo – howto – II

In the last article
https://linux-blog.anracom.com/2016/08/16/open-visual-traceroute-opensuse-leap-42-1-and-sudo-howto-i/
of this series I discussed basic steps to get OVT running on an Opensuse Leap 42.1 system. All recipes were based on assigning root rights to the Java-execution of the application’s jar. Root rights were required to perform network packet capturing.

Now, on a multiuser system

  • we want to restrict the access rights to OVT to a group of selected users,
  • we want to improve the startup – such that the selected users do not need to provide the root password.

Note that none of the steps below solves any security problems. It only makes things more convenient.

Change access rights to the OVT files

As in the first article we assume that the OVT-files were placed in a directory “/PATH/TO/OVT” – e.g. “/opt/ovt”.

  • Step 1 – Create a group “ovt” : We create a user group named “ovt” (e.g. with “yast2” or at the commandline with “groupadd”). Then we add the users who later on shall get the privilege to execute “ovtr.sh” – even without giving the root password!
  • Step 2 – Change ownership of “/PATH/TO/OVT” and its subdirectories/files:
    chown -R root.ovt /PATH/TO/OVT
  • Step 3 – Change access rights to “/PATH/TO/OVT” and subdirectories/files:
    chmod -R u+rwx,g+rx-w,o-rwx /PATH/TO/OVT

Changes to /etc/sudoers

We change the file “/etc/sudoers” by using the “visudo” command. (Do NOT edit the “/etc/sudoers”-file directly with an editor – get acquainted with elementary vi-commands if necessary!) I only show options which have an impact on the execution of the “ovtr.sh” file, which starts the OVT Java-program. I do not care about other settings and restrictions in comparison to the standard /etc/sudoers file Opensuse delivers.

  • Step 4 – Add a “Default” definition to the sudoers file:
    Below the last line of existing DEFAULT-definitions in the standard “/etc/sudoers”-file of Opensuse add a line
     
    Defaults!/PATH/TO/OVT/ovtr.sh env_keep += “DISPLAY XAUTHORIZATION XAUTHORITY”
     
    (With the double quotation marks! And, of course, you have to replace /PATH/TO/OVT by the path where you actually installed OVT.) This settings will later allow to keep up the named environment variables (DISPLAY, XAUTHORITY, …) when the command “ovtr.sh” is executed.
  • Step 5 – Add a group related definition to the sudoers file:
    Add a line at the end of your settings for users and groups saying
     
    %ovt ALL = (root) NOPASSWD: /PATH/TO/OVT/ovtr.sh

The last rule guarantees that all members of the group “ovt” can execute

sudo /PATH/TO/OVT/ovtr.sh

without providing the root passsword (or their own password depending on whether Opensuse’s default setting “Defaults targetpw” is kept up in your “sudoers”-file). The first rule preserves the present environment settings of user (member of group “ovt”) regarding DISPLAY and XAUTHORITY, thus enabling the access to the presently open X11-screen.

Simplify the contents of “ovtr.sh”

After the changes described above we only need a small modification to ovtr.sh:

#!/bin/bash
java -Djava.awt.headless=false  -Xmx512m -jar org.leo.
traceroute.jar

 
This is now all that is required!

Let us test it

me@mytux:/opt/ovt> sudo ./ovtr.sh 
12:43:54.768 [main] INFO  org.leo.traceroute.Main - Open Visual Traceroute 1.6.3 
12:43:54.776 [main] INFO  org.leo.traceroute.install.Env - Java run-time version: 1.8.0_101
12:43:54.777 [main] INFO  org.leo.traceroute.install.Env - NASA World Wind Java 2.0 2.0.0
12:43:54.777 [main] INFO  org.leo.traceroute.install.Env - /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
12:43:54.777 [main] INFO  org.leo.traceroute.install.Env - OS:Linux / arch:amd64
Locale en_GB
12:43:57.230 [SwingWorker-pool-1-thread-1] INFO  o.leo.traceroute.core.geo.GeoService - Use geoip db /root/ovtr/GeoLiteCity.dat which is 0 day(s) old
12:43:58.818 [pool-2-thread-1] INFO  o.leo.traceroute.core.ServiceFactory - Try using device eth0 null
12:43:59.056 [pool-2-thread-2] INFO  o.leo.traceroute.core.ServiceFactory - Try using device br0 null
12:43:59.251 [pool-2-thread-3] INFO  o.leo.traceroute.core.ServiceFactory - Try using device virbr_vmw null
12:44:00.389 [pool-2-thread-8] INFO  o.leo.traceroute.core.ServiceFactory - Try using device vmnet1 null
12:44:01.488 [pool-2-thread-9] INFO  o.leo.traceroute.core.ServiceFactory - Try using device virbr1 null
12:44:02.589 [pool-2-thread-10] INFO  o.leo.traceroute.core.ServiceFactory - Try using device virbr2 null
12:44:03.691 [pool-2-thread-11] INFO  o.leo.traceroute.core.ServiceFactory - Try using device vmnet3 null
12:44:04.799 [pool-2-thread-12] INFO  o.leo.traceroute.core.ServiceFactory - Try using device virbr3 null
12:44:05.908 [pool-2-thread-13] INFO  o.leo.traceroute.core.ServiceFactory - Try using device virbr4 null
12:44:07.027 [pool-2-thread-14] INFO  o.leo.traceroute.core.ServiceFactory - Try using device virbr5 null
12:44:08.124 [pool-2-thread-15] INFO  o.leo.traceroute.core.ServiceFactory - Try using device virbr6 null
12:44:09.231 [pool-2-thread-17] INFO  o.leo.traceroute.core.ServiceFactory - Try using device lo null
12:44:11.467 [AWT-EventQueue-0] INFO  org.leo.traceroute.Main - Startup completed in 16704ms

 
ovt6

Great !

Final convenience steps

We eventually add the path of our OVT installation to the system path variable or tell the users of group “ovt” to add it to their environment.
Another way for a user to simplify the OVT startup would be to put a small script “ovsh” in his home directory with just the lines :

#!/bin/bash
sudo /opt/ovt/ovtr.sh

Then he/she may start OVT by executing “ovsh”. The only difference is that we do not need to type the “sudo”.

Security?

In this article we have made the startup of OVT more convenient by using the /etc/sudoers” file. We also restricted access to OVT to members of a group. Still: Java is executed with root rights. This is something I, personally, do not like because of security reasons. The next article, therefore, concentrates on the possibility to start OVT in a chroot jail.