Einige Fakten: Wir haben den Dienst wcf entwickelt, der als Schicht zwischen den Clients und der Datenbank fungiert. Es ist Selfhosted und läuft als Windows-Dienst..NET Garbagecollector-Problem. Blöcke für 15-40 Minuten
Der Dienst hält mehrere Caches, wobei die größten etwa 1-2 GB im Speicher sind. Die Gesamtspeicherbelegung beträgt normalerweise 5-8 GB. Verbindungen sind Duplex und verwendet TCP-Protokoll und die Serialisierung erfolgt mit Protobuf-Net. Die Anzahl unserer verbundenen Kunden reicht normalerweise von 1000 bis 1500. Der Server ist ein 8-Core-Xeon des neuen Modells mit 64 GB Arbeitsspeicher und läuft nicht mehr als der Service.
Das Problem: Nach x Zeit, es wurde überall von einem Tag bis zu einer Woche der Service wird extrem langsam. Anfragen, die 0,5 Sekunden dauern, können eine Minute dauern. Dieses Verhalten dauert 15 bis 40 Minuten oder bis der Dienst neu gestartet wird.
Was wir getan haben: Wir haben die Netzwerk- und Netzwerkverbindung zum Server überprüft und es gibt kein Problem. Die CPU-Auslastung steigt während dieser Zeit etwas von f.eks. 30% durchschnittlich bis 40-50% durchschnittlich Wir haben Speicherauszüge gemacht und es gibt keine logischen Sperren im Code, die die Benutzer blockieren und überhaupt nicht viel Aktivität. Unsere neueste Blei ist der Müllsammler. In perfmon können wir sehen, dass "% time in gc" konstant über 90% ist, (90-97%) und die Anzahl der Aufrufe steigt. Beide GC0 und GC1. Wir vermuten, dass es auch einen blockierenden GC2 gibt, aber wir mussten den Dienst neu starten, da dieser in Produktion ist, so dass er während des 5min Fensters, in dem wir arbeiten, nicht hochgezählt hat. Die Speicherbelegung betrug 7,6 GB. Hinweis: Anrufe, die ausstehen, steigen an, so dass die Anrufe zwar ankommen, aber der Dienst sie nicht bearbeitet.
Meine Fragen sind, kann der Garbage Collector in einem Zustand, in dem es läuft und blockiert ständig über 15 Minuten? Oder hängt das Problem wahrscheinlich mit einem anderen Problem zusammen?
Unser Dienst lief GC im Workstation-Modus und Latenzmodus: Interactive Wir haben dies jetzt zu Server und SustainedLowLatency geändert und hofft, dass dies etwas helfen wird. Gibt es noch etwas, was wir tun können, wenn es der Müllsammler ist?
Edit: Die große Speicherbelegung ist von Entwurf, die Daten in den Caches ist so groß und es gibt viel mehr Speicher verfügbar.
Schlagen Sie vor, die Ursache für hohe Speicherauslastung herauszufinden ... z. Versuchen Sie, "using" -Block zu verwenden, um den Speicher freizugeben, sobald Sie das Objekt fertig gestellt haben – User2012384
Nur aus Neugier, wie viele Threads haben Sie? Überprüfen Sie im Task-Manager. Vor mindestens ein paar Jahren gab es ein Problem, dass je mehr Threads Sie hatten (sogar im Leerlauf), desto langsamer ist der GC – xanatos
"Kann der Garbage Collector in einen Zustand kommen, in dem er ständig über 15 Minuten läuft und blockiert?" Absolut, wenn es ständig Speicher frei machen muss, aber nicht kann, weil du dich daran festhältst. Wie Raymond Chen es ausdrückte: "Ein Cache mit einer schlechten Richtlinie ist ein anderer Name für ein Speicherleck". –