wuhjaa
Goto Top

Unterschied Stripe Size (Raidcontroller) und Blockgröße (Festplatte)

Hallo zusammen,

ich hoffe das Ihr mir weiter helfen könnt. Ich bin gerade dabei für einen SQL-Server die beste Performance herauszufinden. Doch wenn ich mir das alles durch den Kopf gehen lasse stoße ich immer auf die gleiche Frage.

Also ich erstelle im Raidcontroller ein Raid 10 und stelle eine Stripe Size von 64kb ein. Bevor der SQL-Server installiert wird, wird die Festplatte standardmäßig mit einer Blockgröße von 4kb formatiert. Das heißt jetzt im grunde genommen das der mehrere Zugriffe statt finden, was nicht optimal wäre. Optimal wäre ja 64kb damit es mit einem Zugriff geregelt wird.

Jetzt zurück zu meiner eigentlichen Frage wie ist die Verbindung zwischen der Stripe Size des Controllers und der formartierten Blockgröße der Festplatte?

Ich habe mehrere Theorien wie z.B. das für jede 64kb der Stripe Size ein Block von 4kb genutzt wird???

Aber ich bin mir einfach nicht sicher, hoffe einer von euch kann mir weiterhelfen.

Gruß Wuhjaa

Content-Key: 189912

Url: https://administrator.de/contentid/189912

Printed on: April 19, 2024 at 00:04 o'clock

Member: Wuhjaa
Wuhjaa Aug 22, 2012 at 10:26:32 (UTC)
Goto Top
Habe jetzt nochmal im Internet geforscht.

Kann es sein das die Stripesize nur die Konfiguration der Festplatten ist und die Stripes auf dem Raid festlegt? Also so gesehen wenn ich eine 128kb Datei ablege, schreibt er vielleicht nur die 64kb auf den einen Raid 1 und 64kb vielleicht auf den anderen einser Raidverband?

Und die Blocksize spielt nur eine Rolle auf der Partition wo die "Stücke" der Datei gespeichert wird. Das heißt es wird die Datei auf der Partition gespeichert in 2 Blöcke bei einer Blockgröße von 64kb.

Um das ganze jetzt wieder zu trennen, die Datei befindet sich auf der gleichen Partition aber kann auf unterschiedlichen Festplatten gespeichert würden.
Mitglied: 108012
108012 Aug 22, 2012 at 15:24:50 (UTC)
Goto Top
Hallo Wuhjaa,

ich bin der Meinung dass es dort mehrere Ansätze gibt, den Du aber auch irgendwie allen nach gehen solltest.

Du entscheidest Dich für ein Raid Level in Punkto benötigter Geschwindigkeit, gewünschter Größe, Datenredundanz und Sicherheit.
D.h. für mich Du wählst einen Raid Level aus schließt die Festplatten am Raid Controller an und stellst dann am im Bios des Raid Controllers für das von Dir gewählte Stripping die optimal zum Raid Level passende Stripesize ein. Raid bezogen!

Dann setzt Du das von Dir gewählte Server OS auf und stellst für das Server OS die dafür optimale
Blockgröße ein. OS bezogen!

Hohe Datendichte da freut sich der Chef, aber die Benutzer meckern. = Mehr plattenplatz
Niedrige Datendichte da meckert der Chef und die Benutzer freuen sich. = Weniger Plattenplatz

Bleibt nur noch die Sache mit dem Backup, nicht das Du alles für jedermann (Chef & Benutzer)
gut gelöst hast, die Datendichte aber so groß geworden ist und jemand Nachts das Band für das Backup wechseln muss!!!!!!

Und mehr Performance kann man auch leicht für Geld haben ohne an den Festplatten und dem OS was ein zu stellen, einfach mehr RAM in die Kiste, kommt natürlich auf das Mainboard und das OS an, aber gibt dem ganzen einen ordentlichen Schub, es sei denn Du hast echte Performance Einbußen wenn Daten in die Datenbank
und auf die Festplatte geschrieben werden. Da hilft dann auch mehr RAM nicht.
Member: C.R.S.
C.R.S. Aug 22, 2012 at 19:23:26 (UTC)
Goto Top
Hallo,

also Du sprichst an sich von Dateisystem-Clustern, was einer Recherche nach "Blockgrößen" wohl im Wege steht. Die Blockgröße ist von der Festplatte vorgegeben und nur für den Raid-Controller relevant. Bei dem RAID-Verbund aus Sicht des OS handelt es sich ja um ein emuliertes Volume, welches dann mit einer bestimmten Cluster-Größe formatiert wird.
Die Stripe-Größe bestimmt nur die Aufteilung der Daten in der RAID0-Ebene.
Bei 4/64 hast Du im Ergebnis physisch 16 Cluster auf einem Stripe (ein "echter" RAID-Controller vorausgesetzt, der diesbezüglich das Alignment gewährleistet).

Über den Sinn verschiedener Konfigurationen lässt sich streiten. Ich sehe zwei Aspekte:
- Bzgl. der Cluster-Größe sind die Anforderungen der Anwendung für die Performance absolut maßgeblich. Ein Abweichen wegen der RAID-Stripe-Größe sollte gut begründet sein, oder außer Acht gelassen werden.
- Vom Standpunkt der Datenwiederherstellung würde ich auf 64k-Stripes maximal 32k, eher 16k Cluster formatieren und bei größeren Clustern auch die Stripe-Größe entsprechend erhöhen. Wenn gleichgroße oder größere Cluster verwendet werden, kann das die Datenrettung im Fall eines Misalignments i.V.m. mit einem Dateisystemfehler sehr erschweren, weil keine ganzen Cluster mehr auf dem Stripe vorhanden sind.

Mit besonderen Vorteilen von identischer Cluster-Größe habe ich mich insofern noch kaum beschäftigt. Vielleicht erläuterst Du deinen Gedankengang etwas. Natürlich kann der Stripe dann nicht mehr fragmentieren und es ergibt sich ein Alignment der Dateien, die kleiner als der Cluster/Stripe sind, auf dem RAID. Ich denke, das würde für diese Dateien die RAID-spezifischen Vorteile von der Leserate auf die Zugriffszeiten verlagern. Bei 32/64 könnte eine Datei größer 32k, kleiner 64k auf zwei halben Stripes verteilt liegen. D.h. RAID0 würde das Lesen beschleunigen. Bei 64/64 würde sie zwingend auf einem Cluster/Stripe liegen, d.h. RAID0 käme zum Tragen, wenn sie zusammen mit anderen Dateien sequenziell gelesen wird.

Grüße
Richard
Member: Wuhjaa
Wuhjaa Aug 23, 2012 at 05:47:13 (UTC)
Goto Top
So Morgen,

danke erstmal für Eure antworten. Zuerst einmal, benutzen wir einen Raid 10 das heißt die Datensicherheit ist gegeben.

Mein gedanken gang war so gemeint, das wenn ich eine Identische Cluster/Stripe Size benutze ich weniger schreib bzw Lesezugriffe benötigte, was die Geschwindigkeit meiner Meinung nach beschleunigen würde. Wenn ich jetzt da falsch liegen würde, bitte korriegiere mich.

Deswegen wäre es lieb wenn du nochmal hier genauer drauf eingehen würdest:

"""Bei 32/64 könnte eine Datei größer 32k, kleiner 64k auf zwei halben Stripes verteilt liegen. D.h. RAID0 würde das Lesen beschleunigen. Bei 64/64 würde sie zwingend auf einem Cluster/Stripe liegen, d.h. RAID0 käme zum Tragen, wenn sie zusammen mit anderen Dateien sequenziell gelesen wird."""

Die Konfiguration bezieht sich alleine auf die Partition für die SQL Datenbank wo eigentlich nur Schreibzugriffe bestehen. Ich habe mal gelesen gehabt das ein durchschnittliches SQL-Paket zwischen 32k bis 64k groß iot. D.h. wenn ich eine Cluster Size von 64kb wähle, wird der Speicherplatz doch eigentlich "fast" optimal aus genutzt.

Und wie mir gerade gesagt wurde, ist die Datensicherung mal außenvorgelassen.
Member: Lochkartenstanzer
Lochkartenstanzer Aug 23, 2012 at 06:47:13 (UTC)
Goto Top
Moint,

Du soltest einfach mal google oder eine andere Suchmaschine Deiner Wahl bemühen und Dich in die Grundlagen einlesen. Hie rnur ein Kurzüberblick.

  • Daten werden physikalisch auf Festplatten in "Blöcken", den sogenanten Sektoren geschrieben. Dies können unterschiedlich sein, und waren bis vor kurzem 512 Byte groß. Die Festplattenhersteller sind in letzter Zeit dazu übergegangen, 4k-Sektoren zu verwenden, um den "verschnitt" zu optimieren.

  • Betriebsysteme verwenden für Filesysteme auch Blöcke verschiedener Größe (z.B. Cluster genannt), die meist ein ganzhahliges vielfaches der Sektorgröße ist. Je größer die Cluster sijnd, desto weniger verwaltungsaufwand hat man, aber dafür auch um so mehr "verschnitt" bei kleinen Dateien.

  • RAID-Systeme schreiben auch Daten auf die Festplatten in Blöcken. um die Verwaltung und Performance zu verbessern, fassen sie auch dazu die Sektoren zu größeren Blöcken zusammen, den sogenannten chunks. Die chunk oder Stripe size gibt an, wie große ein einzelner Block ist, bevor auf die nächste Platte geschrieben wird. Da landen bei RAID0 z.B. die ersten 64k auf der ersten Platte. die nächsten auf der 2. Platte, die 3. 64k auf der 3. falls vorhanden oder wieder auf der ersten, wenn man nur zwei Platten hat.

Prinzipiell kann man zwar die Größen für Sektoren, Cluster und chunks unabhängig voneinander wählen und es funktioniert trotzdem alles, aber eine ungeschickte Wahl kann die Performance stark beeinträchtigen.

Um, nun für Dein Problem eine Lösung zu finden, müßte man erst protokollieren, wie die datenzugriffe deines SQL-Servers aussehen, um dann die cluster oder stripe-size darauf zu optimieren.

Bei RAID10 und kleinen Datenbröckchen in SQL (Adressverwaltung, Warenwirtschaft & Co.), wo keine blobs drin sind, wäre eine stripe size von <= 16k nicht verkehrt.

das beste wäre aber, daß Du für Deine Anwendung einfach einen Benchmark machst, weil jede Anwendung sich anders verhält.


lks

PS: Für Multi-user-DB-Anwendungen sind SSDs mit vielen IOPS meist sehr gut geeignet, weil die mehr bringen als ein RAID0 mit vielen Platten. HDDs haben meist IOPS von einigen hundert bis wenigen tausend. Eine SSD bringt dann meist schon die 10-fache Leistung, im RAID sogar deutlich mehr.

PPS: Man sollte natürlich die eigenheiten von SSDs kennen und bein Backup- und/oder HA-Konzept berücksichtigen.
Member: Wuhjaa
Wuhjaa Aug 23, 2012 updated at 13:44:55 (UTC)
Goto Top
Habe jetzt noch eine weitere Frage wie ich die Strip/Cluster Size testen kann ob ich die auf eine Wellenlänge bekomme. Also das das erste Stripe beim ersten block anfängt um unötige IOs zu vermeiden.
Member: C.R.S.
C.R.S. Aug 24, 2012 at 07:02:40 (UTC)
Goto Top
Zitat von @Wuhjaa:
Zuerst einmal, benutzen wir einen Raid 10 das heißt die Datensicherheit ist gegeben.

In Bezug auf die Festplatten. Ein RAID-Controller ist ein eigener Unsicherheitsfaktor. Es ist denkbar, dass bei einem Rebuild der Controller kein Alignment von Clustern und Stripes mehr hinbekommt und das Dateisystem beschädigt wird. Bei <1 ganzen Clustern pro Stripe wird eine Datenrettung abhängig von der Fragmentierung schwer zu automatisieren und damit mehrfach so teuer wie nötig.

Mein gedanken gang war so gemeint, das wenn ich eine Identische Cluster/Stripe Size benutze ich weniger schreib bzw Lesezugriffe
benötigte, was die Geschwindigkeit meiner Meinung nach beschleunigen würde. Wenn ich jetzt da falsch liegen würde,
bitte korriegiere mich.

Die Konfiguration bezieht sich alleine auf die Partition für die SQL Datenbank wo eigentlich nur Schreibzugriffe bestehen.
Ich habe mal gelesen gehabt das ein durchschnittliches SQL-Paket zwischen 32k bis 64k groß iot. D.h. wenn ich eine Cluster
Size von 64kb wähle, wird der Speicherplatz doch eigentlich "fast" optimal aus genutzt.

Und wie mir gerade gesagt wurde, ist die Datensicherung mal außenvorgelassen.

Also den von LKS angesprochenen Management-Overhead würde ich vernachlässigen. Die Kapazitäten sind i.d.R. für aktuelle Systeme einfach nicht groß genug, um durch große Cluster eine geringe Cluster-Anzahl sinnvollerweise anstreben zu müssen.

Das obige Beispiel gilt für Schreibzugriffe analog. Bei einer Datengröße von 32-64k ist verteiltes physisches Schreiben/Lesen der Datei im RAID0 ja nur denkbar, wenn die Clustergröße 32k oder kleiner ist und die Datei zufällig auf zwei Stripes verteilt ist. Das ist eine statistische Größe, denn die Daten können genauso innerhalb des 64k-Stripes Platz finden. Um den Effekt zu erzwingen, müssten auch die Stripes kleiner sein. Umgekehrt bei 64/64 belegen sie immer einen Cluster = Stipe, und damit kann ihr _vereinzeltes_ Schreiben/Lesen nicht RAID-spezifisch beschleunigt werden.

Eine Beschleunigung wird sich damit erst bei der sequenziellen Anforderung einstellen, und gerade in Bezug auf die Zugriffszeiten nur dann, wenn die Daten aus Sicht der Anwendung fragmentiert sind, weil dann die jeweils nicht belastete RAID-Platte vorpositionert wird.
Grundsätzlich wird aber eine Anwendung immer versuchen, die Daten sequenziell zu schreiben, über Cluster und Stripes hinweg. Im Idealfall bleibt es immer ein Zugiff. Welche Cluster-Größe gegenüber der möglichen Blockade einer Sequenz durch Fragmentierung geboten ist, musst Du der Dokumentation des jeweiligen Servers entnehmen. MS SQL wird wohl auf NTFS bestmöglich arbeiten, aber wie es das macht, und welche ideale Cluster-Größe daraus resultiert, weiß nur der Hersteller. Cluster können ja dateisystemunabhängig vorbelegt werden, womit eine dies vorweg nehmende, überhöhte Cluster-Größe unnötig wäre. Unterm Strich wäre sie also hinsichtlich kleinerer Datenpakete, der reinen Transferraten und der Datenrettung nachteilig.
Member: Wuhjaa
Wuhjaa Aug 24, 2012 at 07:49:16 (UTC)
Goto Top
Gut zuerst danke für deine Erklärung.
Ich habe noch genug Zeit weitere Tests zu machen, das heißt ich werde eine Feste Stripesize von 64kb benutzen und mit der Formatierung ein wenig rumspielen und mit SQLIO testen.

Neben der StripeSize und der ClusterSize ist das Alignment noch wichtig, wo ich mich heute morgen noch schlau gemacht habe. Der Server wird unter W2k8 R2 laufen und da ist ein Standard Partitions_Offset von 1024kb. Also müsste Theoretisch ein Alingment gegeben sein, oder nicht?

Das heißt nach diesen 1024kb folgen bei einer Clustersize weitere 64kb Blöcke oder?

Werde wenn der Server demnächst installiert ist merhre Tests machen und die Auswertung mal für weitere Interessierte Leser, hier hinter posten
Member: C.R.S.
C.R.S. Aug 25, 2012 at 18:45:52 (UTC)
Goto Top
Zitat von @Wuhjaa:
Server wird unter W2k8 R2 laufen und da ist ein Standard Partitions_Offset von 1024kb. Also müsste Theoretisch ein Alingment
gegeben sein, oder nicht?

Ja, mit einem herkömmlichen RAID-Controller und dem standardmäßigen Offset werden sich Cluster- und Stripe-Grenzen decken.
Überprüfen kannst Du das nur nachträglich an der einzelnen Festplatte in WinHex oder einem vergleichbaren Disk-Editor.