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
Antworten:
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 benchmarkendata=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=0
dann versuchen, auch mit demcommit=<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:
data=writeback,barrier=0
in Verbindung mithdparm -W0 /dev/<your HDD>
data=ordered,barrier=0
data=writeback,barrier=0
in Verbindung mit der anderen Option montierencommit=<nrsec>
und verschiedene Werte für nrsec versuchendata=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.
quelle
ext3
darin. 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.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:
Wir haben uns die fett hervorgehobenen angesehen. Die besonderen Parameter waren
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.
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:
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:
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:
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
Vielen Dank an @Huygens für verschiedene Tipps und Hinweise.
quelle