Sollen wir mit data = writeback und barrier = 0 auf ext3 mounten?

13

Wir haben einen Server auf einer VM in einem Hosting-Unternehmen ausgeführt und uns gerade für einen dedizierten Host angemeldet (AMD Opteron 3250, 4 Kerne, 8 GB RAM, 2 x 1 TB in Software-RAID, ext3).

Bei der Ausführung von Leistungstests haben wir festgestellt, dass einige SQLite-Übergänge (Kombination aus Einfügungen, Löschungen und / oder Aktualisierungen) 10- bis 15-mal länger dauerten als bei meinem 2010 MacBook Pro.

Nachdem wir viel gegoogelt und gelesen hatten, haben wir uns die Mount-Optionen angesehen, die waren:

    data=ordered,barrier=1

Wir haben experimentiert und die beste Leistung erzielt

    data=writeback,barrier=0

Ich habe darüber nachgelesen und verstehe die Grundlagen, was sie tun, aber ich habe kein gutes Gespür dafür, ob es eine gute Idee für uns ist, so zu rennen?

Fragen

Ist es überhaupt sinnvoll, die obige Konfiguration für einen gehosteten Dienst in Betracht zu ziehen?

Bei einem Stromausfall oder einem schweren Absturz können Daten verloren gehen oder Dateien beschädigt werden. Wenn wir alle 15 Minuten Snapshots der Datenbank erstellen, könnte dies die Situation entschärfen, aber die Datenbank wird möglicherweise nicht synchronisiert, wenn der Snapshot erstellt wird. Wie sollen (können?) Wir die Integrität eines solchen Schnappschusses sicherstellen?

Gibt es andere Möglichkeiten, die wir in Betracht ziehen sollten?

Vielen Dank

NeilB
quelle
Viele Faktoren spielen eine Rolle. Erwarten Sie viele harte Abstürze? Haben Sie eine USV (oder etwas Äquivalentes) an Ihren gehosteten Computer angeschlossen? Haben Sie ein Benchmarking mit anderen Dateisystemen (z. B. ext4, XFS usw.) durchgeführt? Können Sie den Festplattencache steuern ((de) aktivieren)? Wie haben Sie Ihr Software-RAID konfiguriert? Ist Ihre Festplatte richtig ausgerichtet (bei 4K-Blöcken)?
Huygens
Wir erwarten nicht viele harte Abstürze. Wir haben keine UPS. Die Maschinenspezifikation war ein Standard "von der Stange" der Hosting-Firma, also haben wir keine anderen fs verglichen, ext3 ist das, was wir bekommen haben. Ich weiß nicht, was den Festplattencache angeht, werde das untersuchen und in ähnlicher Weise nach RAID- und Festplattenausrichtung suchen. Vielen Dank.
NeilB
Eine andere Frage, die ich vergessen habe, ist, wie viel Geschichte du dir leisten kannst, um zu verlieren. Oder können Sie sich keine verlorenen leisten? Hinweis: SQLite unterstützt Snapshots oder mit anderen Worten das Sichern einer laufenden Datenbank. sqlite.org/backup.html
Huygens
Was ist deine Kernel-Version? Barrieren werden von md seit 2.6.33 geehrt, nicht in früheren Kernel-Releases.
Huygens
uname -r meldet "2.6.32-220.2.1.el6.x86_64". Was ist "md"? Wenn Barrieren in dieser Version des Kernels nicht berücksichtigt werden, warum habe ich beim Deaktivieren von Barrieren eine Leistungsverbesserung festgestellt?
NeilB

Antworten:

15

Erste Ratschläge
Wenn Sie es sich nicht leisten können, Daten zu verlieren (ich meine, sobald ein Benutzer neue Daten eingegeben hat, wenn dies nicht in den nächsten Sekunden verloren gehen kann) und Sie keine UPS haben, dann würde ich die Schreibsperre nicht entfernen. Ich würde auch nicht auf Writeback umsteigen.

Entfernen der Schreibsperre
Wenn Sie die Schreibsperre entfernen, muss das Dateisystem im Falle eines Absturzes oder eines Stromausfalls eine fsck durchführen, um die Festplattenstruktur zu reparieren obwohl die Wiederholung des Journals ausreichend sein sollte). Wenn Sie die Schreibsperre entfernen, ist es ratsam, das Festplatten-Caching (auf der Hardware) nach Möglichkeit zu entfernen, um das Risiko zu minimieren. Sie sollten jedoch die Auswirkungen einer solchen Änderung bewerten. Sie können diesen Befehl versuchen (wenn Ihre Hardware dies unterstützt) hdparm -W0 /dev/<your HDD>.
Beachten Sie, dass ext3 zwei Barrieren für die Änderung von Metadaten verwendet, während ext4 bei Verwendung der Mount-Option nur eine verwendet journal_async_commit.

Obwohl Ted T'so erklärte, warum in den frühen Tagen von ext3 einige wenige Datenbeschädigungen aufgetreten sind (Barrieren waren bis Kernel 3.1 standardmäßig ausgeschaltet ), wird das Journal so platziert, dass, sofern kein Journalprotokollumbruch stattfindet (Journal ist ein zyklisches Protokoll). Daten werden in einer sicheren Reihenfolge auf die Festplatte geschrieben - zuerst Journal, dann Daten - auch wenn die Festplatte das Umordnen von Schreibvorgängen unterstützt.
Grundsätzlich wäre es unglücklich, dass ein Systemabsturz oder ein Stromausfall beim Umbrechen des Journalprotokolls auftritt. Sie müssen jedoch behalten data=ordered. Versuche zusätzlich mit zu benchmarken data=ordered,barrier=0.

Wenn Sie es sich leisten können, ein paar Sekunden Daten zu verlieren, können Sie beide Optionen aktivieren und data=writeback,barrier=0dann versuchen, auch mit dem commit=<nrsec>Parameter zu experimentieren . Überprüfen Sie das Handbuch für diesen Parameter hier . Grundsätzlich geben Sie eine Anzahl von Sekunden an. Dies ist ein Zeitraum, in dem das ext3-Dateisystem seine Daten und Metadaten synchronisiert.
Sie können auch versuchen, mit einigen Kernel-Tunables in Bezug auf schmutzige Seiten (die auf die Festplatte geschrieben werden müssen) zu fummeln und Benchmarks zu erstellen. In diesem Artikel erfahren Sie alles über diese Tunables und wie man damit spielt.

Zusammenfassung der Barrieren
Sie sollten einige weitere Kombinationen von Tunables vergleichen:

  1. Verwenden Sie data=writeback,barrier=0in Verbindung mithdparm -W0 /dev/<your HDD>
  2. Verwenden data=ordered,barrier=0
  3. Verwendung data=writeback,barrier=0in Verbindung mit der anderen Option montieren commit=<nrsec>und verschiedene Werte für nrsec versuchen
  4. Verwenden Sie Option 3. und versuchen Sie es mit einer weiteren Optimierung auf Kernelebene in Bezug auf die fehlerhaften Seiten.
  5. Verwenden Sie den Safe data=ordered,barrier=1, aber probieren Sie andere Tunables aus: insbesondere den Dateisystemaufzug (CFQ, Deadline oder Noop) und die entsprechenden Tunables.

Überlegen Sie, ob Sie zu ext4 wechseln und ein Benchmarking durchführen möchten.
Da ext4 für das Schreiben weniger Barriere benötigt als ext3. Außerdem unterstützt ext4 Extents, die für große Dateien eine bessere Leistung bringen könnten. Es ist also eine Lösung, die es wert ist, erkundet zu werden, zumal es einfach ist, von ext3 auf ext4 zu migrieren, ohne erneut installieren zu müssen: offizielle Dokumentation ; Ich habe das auf einem System gemacht, aber mit diesem Debian-Handbuch . Ext4 ist seit Kernel 2.6.32 sehr stabil und kann daher sicher in der Produktion verwendet werden.

Letzte Überlegung
Diese Antwort ist noch lange nicht vollständig, bietet Ihnen jedoch genügend Material, um mit der Untersuchung zu beginnen. Dies hängt so stark von den Anforderungen ab (auf Benutzer- oder Systemebene), dass es schwierig ist, eine eindeutige Antwort zu erhalten.

Huygens
quelle
Vielen Dank - viele nützliche Dinge. Ich habe bereits das ext3-Dokument auf kernel.org gelesen und versucht, das Commit zu ändern, hatte aber keinen Sinn für einen großen Wert. Auf 15 anstatt auf 5 Sekunden eingestellt, sah ich keine Veränderung. Ich werde noch ein paar Benchmarks durchführen, um die von Ihnen vorgeschlagenen Permutationen abzudecken. Danke noch einmal.
NeilB
Das war eine gute Idee, die Festschreibungszeit zu verlängern und die sicheren Standardeinstellungen beizubehalten! Möglicherweise handelt es sich bei SQLite um das Leeren / Synchronisieren. Dies könnte eine Erklärung dafür sein, warum Sie keine Leistungsänderung mithilfe der Festschreibungsoption gemessen haben.
Huygens
@NeilB stolpert nur über folgende Artikel: 1. sqlite.org/draft/lockingv3.html suche ext3darin. Es gibt eine vielleicht einfachere (oder vereinfachte) Erklärung dessen, was ich in meiner Antwort versucht habe. 2. sqlite.1065341.n5.nabble.com/… Sie könnten versuchen, die sicheren ext3-Standardeinstellungen (bestellt + Barriere) beizubehalten , aber die Synchronisierung in SQLite entfernen. Ich werde bald meine Antwort bezüglich dieses zweiten Aspekts aktualisieren.
Huygens
Danke dafür. Ich bin dabei, alle Permutationen zu erarbeiten und Leistungstests mit ihnen durchzuführen. Schon früh habe ich versucht, die Synchronisierung in SQLite zu deaktivieren, und gute Leistungsdaten erhalten. Ich muss zuerst Code schreiben, um eine Reihe von Daten für verschiedene Kombinationen von Schreiboperationen zu erfassen. Ich werde eine Zusammenfassung hier posten, aber wenn Sie mehr Details wollen, bin ich neil bei Bowers Dot Com.
NeilB
10

Vorsichtsmaßnahme: Es kann unten zu Ungenauigkeiten kommen. Ich habe viel über dieses Zeug gelernt, also nimm es mit einer Prise Salz. Dies ist ziemlich lang, aber Sie können einfach die Parameter lesen, mit denen wir gespielt haben, und dann zum Abschluss übergehen.

Es gibt eine Reihe von Ebenen, auf denen Sie sich über die Schreibleistung von SQLite Gedanken machen können:

verschiedene Ebenen für das Nachdenken über die Leistung

Wir haben uns die fett hervorgehobenen angesehen. Die besonderen Parameter waren

  • Schreibcache der Festplatte. Moderne Festplatten verfügen über einen RAM-Cache, der zum Optimieren der Schreibvorgänge für die sich drehende Festplatte verwendet wird. Wenn diese Option aktiviert ist, können Daten in Blöcke außerhalb der Reihenfolge geschrieben werden. Wenn also ein Absturz auftritt, können Sie eine teilweise geschriebene Datei erhalten. Überprüfen Sie die Einstellung mit hdparm -W / dev / ... und stellen Sie sie mit hdparm -W1 / dev / ... ein (um sie einzuschalten, und -W0, um sie auszuschalten).
  • Barriere = (0 | 1). Viele Online-Kommentare sagen: "Wenn Sie mit Barriere = 0 ausführen, ist das Cache-Speichern für Schreibvorgänge nicht aktiviert." Eine Diskussion der Barrieren finden Sie unter http://lwn.net/Articles/283161/.
  • data = (Journal | bestellt | zurückschreiben). Eine Beschreibung dieser Optionen finden Sie unter http://www.linuxtopia.org/HowToGuides/ext3JournalingFilesystem.html .
  • commit = N. Weist ext3 an, alle N Sekunden alle Daten und Metadaten zu synchronisieren (Standard 5).
  • SQLite Pragma synchron = ON | AUS. Wenn diese Option aktiviert ist, stellt SQLite sicher, dass eine Transaktion auf die Festplatte geschrieben wird, bevor Sie fortfahren. Wenn Sie diese Option deaktivieren, sind die anderen Einstellungen weitgehend irrelevant.
  • SQLite Pragma cache_size. Steuert, wie viel Speicher SQLite für den speicherinternen Cache verwendet. Ich habe zwei Größen ausprobiert: eine, bei der die gesamte DB in den Cache passt, und eine, bei der der Cache die Hälfte der maximalen DB-Größe hat.

Weitere Informationen zu den ext3-Optionen finden Sie in der ext3-Dokumentation .

Ich habe Leistungstests für eine Reihe von Kombinationen dieser Parameter durchgeführt. Die ID ist eine Szenarionummer, auf die unten Bezug genommen wird.

Szenarien, die ich ausprobiert habe

Ich habe zunächst mit der Standardkonfiguration auf meinem Computer als Szenario 1 ausgeführt. Szenario 2 ist meines Erachtens das "sicherste" und habe dann verschiedene Kombinationen ausprobiert, sofern dies angemessen / erforderlich ist. Dies ist wahrscheinlich am einfachsten mit der Karte zu verstehen, die ich letztendlich verwendet habe:

Zuordnung von Szenarien zu Parametern

Ich habe ein Testskript geschrieben, das viele Transaktionen mit Einfügungen, Aktualisierungen und Löschungen ausführte, und zwar alle in Tabellen, die entweder nur INTEGER, nur TEXT (mit ID-Spalte) oder gemischt enthalten. Ich habe dies mehrmals für jede der obigen Konfigurationen ausgeführt:

Plot zeigt Timings für Szenarien

Die beiden untersten Szenarien sind # 6 und # 17, bei denen "Pragma synchron = aus" ist, was nicht überrascht, dass sie die schnellsten waren. Die nächsten drei Gruppen sind # 7, # 11 und # 19. Diese drei sind in der obigen "Konfigurationsübersicht" blau hervorgehoben. Grundsätzlich besteht die Konfiguration aus einem Schreibcache auf der Festplatte, einer Barriere = 0 und einer Datenmenge, die sich von 'journal' unterscheidet. Das Ändern des Commits zwischen 5 Sekunden (# 7) und 60 Sekunden (# 11) scheint wenig zu bewirken. Bei diesen Tests schien es keinen großen Unterschied zwischen data = orders und data = writeback zu geben, was mich überraschte.

Der gemischte Update- Test ist der mittlere Peak. Es gibt eine Reihe von Szenarien, die bei diesem Test deutlich langsamer sind. Dies sind alles diejenigen mit data = journal . Ansonsten gibt es nicht viel zwischen den anderen Szenarien.

Ich hatte einen anderen Timing-Test, der eine heterogenere Mischung aus Einfügungen, Aktualisierungen und Löschungen für die verschiedenen Typenkombinationen durchführte. Diese haben viel länger gedauert, weshalb ich sie nicht in die obige Handlung aufgenommen habe:

gemischte Typen einfügen / aktualisieren / löschen

Hier können Sie sehen, dass die Rückschreibkonfiguration (Nr. 19) etwas langsamer ist als die bestellten (Nr. 7 und Nr. 11). Ich habe erwartet, dass das Zurückschreiben etwas schneller sein wird, aber vielleicht hängt es von Ihren Schreibmustern ab, oder vielleicht habe ich auf ext3 einfach noch nicht genug gelesen :-)

Die verschiedenen Szenarien waren in gewisser Weise repräsentativ für die von unserer Anwendung ausgeführten Vorgänge. Nachdem wir eine Auswahlliste von Szenarien ausgewählt hatten, führten wir Timing-Tests mit einigen unserer automatisierten Testsuiten durch. Sie stimmten mit den obigen Ergebnissen überein.

Fazit

  • Der Commit- Parameter schien kaum einen Unterschied zu machen, also verlassen wir ihn bei 5s.
  • Wir werden den Cache für Festplattenschreibvorgänge aktivieren, Barriere = 0 und Daten = geordnet . Ich las einige Dinge online, die meinten, dies sei ein schlechtes Setup, und andere, die meinten, dies sollte in vielen Situationen der Standard sein. Ich denke, das Wichtigste ist, dass Sie eine fundierte Entscheidung treffen und wissen, welche Kompromisse Sie eingehen.
  • Wir werden das synchrone Pragma in SQLite nicht verwenden.
  • SQLite einstellen Pragma cache_size so festlegen, dass die Datenbank in den Arbeitsspeicher passt, wird die Leistung bei einigen Vorgängen wie erwartet verbessert.
  • Die obige Konfiguration bedeutet, dass wir etwas mehr Risiko eingehen. Wir werden die SQLite-Backup-API verwenden um die Gefahr eines Festplattenausfalls bei einem teilweisen Schreibvorgang zu minimieren: alle N Minuten wird ein Snapshot erstellt, und das letzte M wird beibehalten. Ich habe diese API während der Ausführung von Leistungstests getestet, und wir sind zuversichtlich, diesen Weg einzuschlagen.
  • Wenn wir noch mehr wollten, könnten wir uns das Durchatmen mit dem Kernel ansehen, aber wir haben die Dinge genug verbessert, ohne dorthin zu gehen.

Vielen Dank an @Huygens für verschiedene Tipps und Hinweise.

NeilB
quelle