2017-02-26 1 views
1

Ich habe gelesen, dass SQLite für den Durchsatz mit den Standardeinstellungen optimiert ist. Was ist der beste Weg, um SQLite auf minimale (und vorzugsweise vorhersagbare) Schreiblatenz einzustellen? Ich versuche, die Latenz eines einfachen update + Commits unter 10ms in allen Fällen zu halten.Wie sollte ich SQLite auf minimale Latenz einstellen?

Ich denke, ich muss WAL und Checkpoint in einem anderen Thread verwenden, aber ich bin mir nicht sicher, ob Checkpoints Schreiber auf dem Hauptthread blockieren werden.

Meine Anwendung hat nur einen einzigen Prozess, der gleichzeitig auf die Datenbank zugreift, sodass Sie sich keine Gedanken über Nebenläufigkeit machen müssen. Es ist wichtig, dass die Datenbank nicht beschädigt ist, aber die Dauerhaftigkeit ist nicht so wichtig (jüngste Transaktionen können verloren gehen).

+0

"* Ich bin auf der Suche nach der Latenz eines einfachen update + commit unter 10ms in allen Fällen. *" Sie können nicht garantieren, dass, auch wenn Sie direkt zu und von der Datei manuell schreiben. Nebenläufigkeit ist immer noch wichtig, da es nur eine Festplatte gibt und Prozesse diese teilen müssen. –

+0

@ Nicol Bolas, kann ich das zu 99% der Fälle entspannen? –

+0

Auch - ein Schreiben in eine Datei trifft normalerweise auf den Puffer-Cache, daher denke ich, dass in fast allen Fällen eine Latenz von 10 ms erreicht werden sollte, solange die Haltbarkeit keine Voraussetzung ist. –

Antwort

1

Die einzige Möglichkeit, eine niedrige Latenzzeit für Schreibvorgänge zu erhalten, besteht darin, sie asynchron auszuführen, d. H. Nicht auf das Löschen der Daten aus dem Cache zu warten.

Die WAL documentation sagt dazu:

Beachten Sie, dass der Kontrollpunkt mit PRAGMA synchronous Satz auf NORMAL, der einzige Betrieb ist ein I/O-Barriere oder Synchronbetrieb (fsync() auf Unix oder Flushfilebuffers zu erteilen() unter Windows). Wenn eine Anwendung daher einen Prüfpunkt in einem separaten Thread oder Prozess ausführt, blockiert der Hauptthread oder -prozess, der Datenbankabfragen und Aktualisierungen durchführt, niemals bei einer Synchronisierungsoperation. Dies hilft, "Latch-up" in Anwendungen zu verhindern, die auf einem ausgelasteten Laufwerk ausgeführt werden. Der Nachteil dieser Konfiguration besteht darin, dass Transaktionen nach einem Stromausfall oder Hard-Reset nicht mehr haltbar sind und möglicherweise rückgängig gemacht werden.

Checkpoints, um zu verhindern, PRAGMA wal_autocheckpoint verwenden im Hauptthread passiert.

Dies kann jedoch weiterhin zu Verzögerungen führen, da der Prüfpunkt die gesamte Datenbank für die Dauer der Prüfpunktoperation sperren muss. Wenn Sie damit nicht leben können, verschieben Sie die Checkpoints in eine Leerlaufzeit, wenn Sie es sich leisten können, oder lassen Sie die WAL-Datei auf eine unendliche Größe wachsen.

+0

Danke, das ist interessant. Was passiert, wenn ich einen "passiven" Checkpoint verwende? Nach dem Lesen der Dokumente scheint es, als ob ein passiver Checkpoint nicht die gesamte Datenbank sperrt, aber ich bin mir nicht sicher. –

+0

Ein passiver Prüfpunkt sperrt die Datenbank nicht, wenn eine andere Verbindung schreibt. Wenn der Checkpoint jedoch zuerst die Sperre erhält, muss die andere Verbindung warten. –

+0

Super, danke für die Bestätigung. –

Verwandte Themen