MongoDB und Datensätze, die nicht in den Arbeitsspeicher passen, egal wie hart Sie trainieren

12

Dies ist sehr systemabhängig, aber die Chancen stehen gut, dass wir über eine beliebige Klippe hinaus in echte Schwierigkeiten geraten. Ich bin gespannt, welche Faustregeln es für ein gutes Verhältnis von RAM zu Festplattenspeicher gibt. Wir planen unsere nächste Runde von Systemen und müssen einige Entscheidungen in Bezug auf RAM, SSDs und die Menge der neuen Knoten treffen.

Nun aber zu einigen Details zur Leistung!

Während des normalen Workflows eines einzelnen Projektlaufs wird MongoDB mit einem sehr hohen Prozentsatz an Schreibvorgängen (70-80%) getroffen. Sobald die zweite Stufe der Verarbeitungspipeline erreicht ist, wird sie extrem häufig gelesen, da die in der ersten Hälfte der Verarbeitung identifizierten Datensätze dedupliziert werden müssen. Dies ist der Workflow, für den "Keep your working set in RAM" gemacht ist, und wir entwickeln nach dieser Annahme.

Der gesamte Datensatz wird ständig mit zufälligen Abfragen aus vom Endbenutzer abgeleiteten Quellen durchsucht. Obwohl die Häufigkeit unregelmäßig ist, ist die Größe normalerweise recht klein (Gruppen von 10 Dokumenten). Da dies dem Benutzer zugewandt ist, müssen die Antworten unter dem Schwellenwert für "gelangweiltes Jetzt" von 3 Sekunden liegen. Es ist viel unwahrscheinlicher, dass sich dieses Zugriffsmuster im Cache befindet, daher ist es sehr wahrscheinlich, dass Festplatten-Treffer auftreten.

Ein Sekundärverarbeitungsworkflow ist hochgelesen von früheren Verarbeitungsläufen, die Tage, Wochen oder sogar Monate alt sein können, und wird selten ausgeführt, muss aber dennoch schnell ausgeführt werden. Auf bis zu 100% der Dokumente des vorherigen Verarbeitungslaufs wird zugegriffen. Ich vermute, dass keine Menge an Cache-Erwärmung dabei helfen kann.

Die endgültigen Dokumentgrößen variieren stark, die mittlere Größe liegt jedoch bei etwa 8 KB.

Der häufig gelesene Teil der normalen Projektverarbeitung empfiehlt dringend die Verwendung von Replikaten, um den Leseverkehr zu verteilen. Ich habe an anderer Stelle gelesen , dass eine 1:10 RAM-GB auf HD-GB eine gute Faustregel für langsame Festplatten ist. Da wir ernsthaft über die Verwendung von viel schnelleren SSDs nachdenken, würde ich gerne wissen, ob es eine ähnliche Regel gibt Daumen für schnelle Festplatten.

Ich weiß, dass wir Mongo so verwenden, dass nicht wirklich alles im Cache läuft. Deshalb suche ich nach Möglichkeiten, ein System zu entwickeln, das eine solche Nutzung übersteht. Der gesamte Datensatz wird wahrscheinlich innerhalb eines halben Jahres die meisten TB umfassen und weiter wachsen.

sysadmin1138
quelle
Eine schwierige Frage, die gut gestellt ist.
gWaldo
Es hört sich so an, als würden Sie wahrscheinlich Probleme mit der Schreibsperre haben, bevor Sie ehrlich gesagt viel für IO tunen können. Wenn Sie die Datenbank mit Schreibvorgängen versehen, halten Sie die Schreibsperren wahrscheinlich lange genug, damit Abfragen blockieren, unabhängig davon, wie schnell die zugrunde liegende E / A ist. Etwas wie Fusion IO kann die Schreibsperre ein wenig reduzieren, aber es kostet nur etwas Zeit, es ist keine echte Lösung.
MrKurt
@ MrKurt Teil dessen, was ich herausfinden will, ist, wann ich scherben muss, zusätzlich dazu, wie bullig ich die einzelnen Replikatknoten machen kann. Meine vorläufige Spezifikation enthält eine PCIe-basierte SSD-Karte.
sysadmin1138
Ah, verstanden. Sie könnten von Anfang an in Betracht ziehen, einzelne Server werden häufig gesplittet. Damit können Sie die Schreibsperre umgehen und Schreibvorgänge effektiv auf Ihre gesamten Kerne skalieren. Außerdem ist es zu einem späteren Zeitpunkt einfach, Shards zwischen Servern zu verschieben.
MrKurt

Antworten:

5

Dies wird eine Menge kleiner Punkte sein. Es gibt jedoch leider keine einheitliche Antwort auf Ihre Frage.

MongoDB ermöglicht dem Betriebssystemkern die Speicherverwaltung. Abgesehen davon, dass Sie so viel RAM wie möglich in das Problem stecken, gibt es nur wenige Möglichkeiten, um Ihr Working Set aktiv zu verwalten.

Um Schreibvorgänge zu optimieren, können Sie zunächst nach diesem Datensatz fragen (einen Lesevorgang ausführen), damit er sich im Arbeitsspeicher befindet. Dadurch werden die mit der prozessweiten globalen Sperre verbundenen Leistungsprobleme vermieden (die in v2.2 pro-db werden soll).

Es gibt keine feste Regel für das Verhältnis von RAM zu SSD, aber ich denke, dass das rohe IOPS von SSDs es Ihnen ermöglichen sollte, mit einem viel niedrigeren Verhältnis zu arbeiten. Aus der Vogelperspektive ist 1: 3 wahrscheinlich das niedrigste, mit dem Sie gehen möchten. Angesichts der höheren Kosten und der geringeren Kapazitäten müssen Sie dieses Verhältnis wahrscheinlich trotzdem niedrig halten.

Lesen Sie in Bezug auf "Schreib- / Lesephasen" richtig, dass ein einmal geschriebener Datensatz nur selten aktualisiert wird ("Upserted")? In diesem Fall kann es sich lohnen, zwei Cluster zu hosten. der normale Schreibcluster und der leseoptimierte Cluster für "gealterte" Daten, die in [X-Zeitraum] nicht geändert wurden . Ich würde auf jeden Fall das Slave-Lesen in diesem Cluster aktivieren. (Persönlich würde ich das schaffen, indem ich einen vom Datum geänderten Wert in die Objektdokumente Ihrer Datenbank einfüge.)

Wenn Sie die Möglichkeit haben, vor dem Einstieg in Prod einen Belastungstest durchzuführen, können Sie dies verdammt noch mal überprüfen. MongoDB wurde mit der Annahme geschrieben, dass es häufig in VMs bereitgestellt wird (die Referenzsysteme befinden sich in EC2). Scheuen Sie sich also nicht, auf VMs zuzugreifen.

gWaldo
quelle
Während der Verarbeitung wird ein erster Dokumentenstub erstellt, der im ersten Teil der Verarbeitung durch verschiedene Unterschritte fortlaufend aktualisiert wird. Wir haben die Möglichkeit abgewogen, beim erstmaligen Erstellen einige Handpads auszuführen, um den Umfang der von uns ausgeführten Erweiterungen zu verringern, aber unser aktueller Prozentsatz an Schreibsperren ist erfreulicherweise niedrig.
sysadmin1138
Der Rat, einen Datensatz vor dem Schreiben zu lesen, um ihn in den Arbeitsspeicher zu laden, ist kein guter Rat. Seit 2.0 (Mitte 2011) hat MongoDB Nachholbedarf, wenn nicht im RAM auf Daten zugegriffen werden soll. Sie verursachen also ohne triftigen Grund einen zusätzlichen Lesevorgang und einen zusätzlichen Roundtrip zum Server, wenn Sie dies tun, da die Sperre dies nicht tun würde Ich werde sowieso nicht für diese Dauer festgehalten.
Asya Kamsky
13

Dies ist als Ergänzung zu den anderen hier veröffentlichten Antworten gedacht, in denen viele der hier zu berücksichtigenden relevanten Elemente behandelt werden. Es gibt jedoch einen anderen, oft übersehenen Faktor, wenn es um eine effiziente RAM-Auslastung in einem System mit wahlfreiem Zugriff geht - Readahead.

Sie können die aktuellen Einstellungen für readahead (unter Linux) überprüfen, indem Sie ausführen ( blockdev --reporterfordert normalerweise sudo / root-Berechtigungen). Dadurch wird eine Tabelle mit einer Zeile für jedes Plattengerät gedruckt. Die RA-Spalte enthält den Wert für readahead. Dieser Wert gibt die Anzahl der 512-Byte-Sektoren an (es sei denn, die Sektorgröße ist nicht die Standardgröße). Beachten Sie, dass zum Zeitpunkt des Schreibens dieses Beitrags auch Festplatten mit größeren Größen vom Kernel als 512-Byte-Sektoren behandelt werden Festplattenzugriff.

Sie können die Readahead-Einstellung für ein bestimmtes Festplattengerät festlegen, indem Sie Folgendes ausführen:

blockdev --setra <value> <device name>

Stellen Sie bei Verwendung eines softwarebasierten RAID-Systems sicher, dass der Readahead auf jedem Plattengerät sowie auf dem Gerät festgelegt ist, das dem RAID-Controller entspricht.

Warum ist das wichtig? Readahead verwendet dieselbe Ressource, die MongoDB verwendet, um Ihre Lesevorgänge für den sequentiellen Zugriff zu optimieren - RAM. Wenn Sie sequenzielle Lesevorgänge auf sich drehenden Datenträgern durchführen (oder auf Geräten, die sich sowieso wie sich drehende Datenträger verhalten - EBS, wie ich Sie ansehe), kann das Abrufen der in der Nähe befindlichen Daten in den Arbeitsspeicher die Leistung massiv steigern, Suchvorgänge ersparen und eine hohe Readahead-Einstellung bewirken Die richtige Umgebung kann zu beeindruckenden Ergebnissen führen.

Bei einem System wie MongoDB, bei dem der Zugriff in der Regel zufällig über einen Datensatz erfolgt, wird nur Speicher verschwendet, der an anderer Stelle besser verwendet wird. Das System, das, wie an anderer Stelle erwähnt, auch den Speicher für MongoDB verwaltet, wird einen Teil des Speichers für Readahead reservieren, wenn es angefordert wird, und daher weniger RAM für MongoDB zur effektiven Verwendung übrig lassen.

Die Auswahl der richtigen Readahead-Größe ist schwierig und hängt von Ihrer Hardware, der Konfiguration, der Blockgröße, der Stripe-Größe und den Daten selbst ab. Wenn Sie beispielsweise zu SSDs wechseln, möchten Sie eine niedrige Einstellung, die jedoch von den Daten abhängt, wie niedrig sie ist.

Zur Erklärung: Sie möchten sicherstellen, dass readahead hoch genug ist, um ein vollständiges einzelnes Dokument einzulegen, und nicht auf die Festplatte zurückkehren müssen. Nehmen wir die erwähnte mittlere Größe von 8 KB - da Sektoren auf der Festplatte im Allgemeinen 512 Byte groß sind, sind 16 Festplattenzugriffe erforderlich, um das gesamte Dokument ohne Readahead einzulesen. Wenn Sie einen Readahead von 16 Sektoren oder mehr hätten, würden Sie das gesamte Dokument mit nur einem Trip auf die Festplatte einlesen.

Da MongoDB-Index-Buckets 8 KB groß sind, sollten Sie Readahead ohnehin nie unter 16 festlegen, da sonst zwei Datenträgerzugriffe zum Lesen eines Index-Buckets erforderlich sind. Es wird allgemein empfohlen, mit Ihrer aktuellen Einstellung zu beginnen, diese zu halbieren, dann die RAM-Auslastung und die E / A neu zu bewerten und von dort aus fortzufahren.

Adam C
quelle
1
Wertvolle Informationen, die sich auf jeden Fall als nützlich erweisen werden, sobald wir Hardware im Haus haben. Vielen Dank!
sysadmin1138
3

Sie sollten erwägen, Replikate für Endbenutzerabfragen zu verwenden und Ihren Workflow auf anderen Computern ausführen zu lassen.

Unter Verwendung Ihrer Faustregel von 1:10 benötigen Sie etwa 128 GB RAM für 1 TB Festplattenspeicher. Während einige erschwingliche SSDs heutzutage behaupten,> 60K IOPS zu erreichen, können sich die tatsächlichen Zahlen erheblich unterscheiden, ebenso, ob Sie RAID mit Ihren SSDs verwenden oder nicht, und wenn ja, dann ist die RAID-Karte ebenfalls äußerst wichtig .

Zum Zeitpunkt dieses Beitrags scheint der Wechsel von 128 GB DDR3-ECC-RAM auf 256 GB auf einem 1U-Intel-Server etwa 2000 US-Dollar mehr zu sein, und dies gibt Ihnen ein Verhältnis von 1: 5 mit 1 TB Daten, was meiner Meinung nach ein Vorteil ist noch besseres verhältnis. Wenn Sie Ihre Arbeit so schnell wie möglich erledigen müssen, hilft auf jeden Fall mehr RAM, aber ist es wirklich so dringend?

Sie müssen auch das Dateisystem optimieren, beispielsweise "noatime, data = writeback, nobarrier" auf ext4, und Sie müssen möglicherweise auch einige Änderungen an den Kerneleinstellungen vornehmen, um die bestmögliche Leistung zu erzielen System.

Wenn Sie sich für RAID entscheiden, ist RAID-10 eine gute Wahl. Mit dem richtigen RAID-Controller können Sie die Leistung erheblich steigern, aber den verfügbaren Speicherplatz halbieren. Sie können sich auch mit RAID50 befassen, wenn Sie eine angemessene Leistungssteigerung wünschen, ohne den verfügbaren Speicherplatz zu halbieren. Das RAID-Risiko besteht darin, dass Sie auf Ihren Laufwerken nicht mehr auf TRIM zugreifen können. Dies bedeutet, dass Sie hin und wieder Ihre Daten auslagern, das RAID auflösen, die Laufwerke TRIMEN und das RAID neu erstellen müssen.

Letztendlich müssen Sie entscheiden, wie viel Komplexität Sie möchten, wie viel Geld Sie ausgeben möchten und wie schnell Sie möchten, dass Ihre Arbeitslast verarbeitet wird. Ich würde auch bewerten, ob MongoDB die ideale Datenbank ist, da Sie Mongo immer noch für Endbenutzer-Abfragen verwenden können, die schnelle Antworten benötigen, aber für die Verarbeitung Ihrer Daten etwas anderes verwenden müssen, das nicht in wenigen Sekunden einsatzbereit sein muss Außerdem können Sie so Ihre Arbeitslast einfacher auf mehrere Computer verteilen.

gekkz
quelle