Ich habe eine Anwendung, die ständig Daten an MongoDB überträgt. Die MongoDB-Instanz läuft mit 2 Replikaten, jedes mit 3 TB gp2 EBS-Volumen.
Wie Sie in der folgenden Grafik sehen können,
irate(node_disk_reads_completed_total{}[1m])
irate(node_disk_writes_completed_total{}[1m])
Die Leseleistung ist langsam und stabil, was normal ist, aber die Schreibleistung scheint zu wünschen übrig zu lassen.
Selbst in den Spitzenzeiten erreichen wir nie die theoretischen 3 IOPS/GB * 3000 GB = 9.000 IOPS. Die Anwendung selbst verbringt die meiste Zeit damit, immer mehr Daten in die Datenbank zu pumpen. Aus Sicht der Anwendung ist die Datenbank also eindeutig der Engpass.
Warum geht es also nicht schneller? Und warum ist es so eine Welle? Ich würde erwarten, dass das Schreiben in WAL eine konstante Quelle der Schreibaktivität darstellt und Dinge wie periodisches Fsync auf die Festplatte nicht wirklich solche extremen Auf- und Ab-Muster verursachen würden.
Könnte es sein, dass die Synchronisierung zwischen Replikaten zu Durchsatzpausen führt? Ich verwende jedoch die Standardschreibfunktion, die w: 1, j: true
das Warten auf Replikate nicht erfordern sollte.
Gibt es sonst noch etwas, das ich übersehen habe?