Warum reagiert MongoDB während eines Auslastungstests nicht?

8

Ich habe ein Problem damit, dass MongoDB nicht mehr reagiert und Verbindungen in der Produktion verweigert.

Beim Testen kann ich die "Aussperrung" konsistent reproduzieren, indem ich viele Anfragen an meine App sende.

Hier ist eine Beispielausgabe von mongostat:

%Vor%

Wie Sie sehen können, fallen die Lese- und Schreibvorgänge in der Mitte des Auslastungstests so gut wie aus. Während dieser Zeit kann ich keine Verbindung zu MongoDB über Mongo oder Mongostat herstellen (Verbindung verweigert). Wie Sie sehen können, sind die Verbindungen ziemlich niedrig und es gibt 16000 Verbindungen in den maximalen Verbindungen für Mongo.

Ich kann das konsequent reproduzieren. Allerdings ist jedes Mal die "Aussperrung" eine andere Länge. Ich habe 51 Sekunden, 20 Sekunden, 28 Sekunden beobachtet. In jedem Fall bin ich immer noch mit Mongo über Mongostat verbunden (und empfange Output), aber neue Verbindungen werden abgelehnt.

%Vor%

Was könnte das Problem sein? Ich verwende MongoDB v1.8.2.

Abgesehen davon kann ich ein ähnliches Problem reproduzieren, bei dem die Befehle nicht vollständig abfallen, aber ein geringes Volumen haben und stark schwanken.

    
Homer6 06.09.2013, 18:20
quelle

1 Antwort

0

Es wurde behoben:

%Vor%

Starten Sie dann Mongo neu.

Alternativ können Sie es zu /etc/sysctl.conf hinzufügen (damit es beim Neustart ausgeführt wird):

%Vor%

Führen Sie dies aus, um neu zu laden (ohne Neustart)

%Vor%

Dieser "Fix" deaktiviert den Zeitwartezustand für TCP-Sockets (serverweit). Also, es ist wirklich keine Lösung. Bis Mongo jedoch ihren Zeitwartezustand mit SO_LINGER reduziert, wird eine große Anzahl von Server-Sockets im Zustand TIME_WAIT zusammengefasst und bleibt für neue Verbindungen unbenutzbar. Sie können die Anzahl der Verbindungen in TIME_WAIT damit anzeigen:

%Vor%

Damit konnte ich sehen, dass es bei ungefähr 28.000 TIME_WAIT-Verbindungen scheiterte. Mit diesem Kernel-Flag:

%Vor%

Der Server schlägt bei 45k-Verbindungen fehl. Um den Fehler also leichter zu reproduzieren, können Sie den Bereich auf 200 oder etwas kleiner reduzieren.

Also, das Ergebnis dieser war eine Programmierfrage schließlich (wie Sie aus dem letzten Link sehen können):

TCP-Option SO_LINGER (Null) - wenn es ist erforderlich

Ссылка

    
Homer6 07.09.2013, 00:24
quelle

Tags und Links