Kann ein .NET-Speicherverlust zur Erschöpfung der Ports führen?

424
CodingYoshi

Unser Webserver hat ein Problem wegen Port-Erschöpfung. Dies geschieht alle 2 Wochen und ein Neustart behebt das Problem. Aber ich möchte diesem Problem auf den Grund gehen und eine dauerhafte Lösung finden, um den Neustart zu vermeiden.

Ich habe diesen Artikel gelesen und war wirklich nützlich. Es erwähnt jedoch Folgendes:

Wenn Sie also einen Prozess sehen, der viele Ports verbraucht, mit einer einzelnen Remoteadresse oder mehreren Remoteadressen kommuniziert und der Status der Verbindung etwas wie TIME_WAIT ist, ist dies normalerweise ein toller Hinweis darauf, dass dieser Prozess ein Problem hat diese Ports nicht richtig freigeben .

(Betonung Mine)

Dann weiter unten gibt es diesen Absatz:

Ich habe oben erwähnt, dass Speicherlecks auch dieses Verhalten verursachen können - warum ist das genau so? Um einen Port für eine ausgehende Verbindung verwenden zu können, müssen Prozesse einen Handle für diesen Port erwerben. Dieses Handle kommt aus dem nicht ausgelagerten Poolspeicher. Wenn Sie also einen Speicherverlust haben und der nicht ausgelagerte Pool ausgeht, können Prozesse, die mit anderen Computern im Netzwerk kommunizieren müssen, nicht den Zugriff erhalten, und daher auch nicht Port brauchen sie.

Fragen :

  1. Was bedeutet der Autor, wenn er diese Ports nicht ordnungsgemäß freigibt ? Wessen Job ist das, der Programmierer?
  2. Kann jemand bitte erarbeiten, wie ein Speicherleck verursachen könnte Erschöpfung Port, weil ich die oben nach dem Lesen noch nicht sicher bin?

Eine letzte Sache, die ich im Hinterkopf behalten sollte, ist, dass ich Programmierer bin und kein Administrator (falls das irgendwie hilft).

1
Sollte ich diese Frage woanders (auf einer anderen Seite) gestellt haben? Bitte lass es mich wissen, weil ich dem auf den Grund gehen muss. CodingYoshi vor 6 Jahren 0

1 Antwort auf die Frage

0
Viacheslav
  1. Ja, es ist ein Programmiererjob.
  2. Ja, ein Speicherverlust kann dies verursachen. Wenn das Socket nicht explizit geschlossen wurde, wird das Problem nur dann geschlossen, wenn die Instanz eines Socket oder einer anderen abgeleiteten Klasse entstört wird . Dies erfolgt automatisch durch die Garbage-Collection. Die Instanz einer Klasse wird jedoch nicht zerstört, wenn mindestens eine Referenz noch vorhanden ist (Speicherverlust).

Es kann ziemlich schwierig sein, herauszufinden, was Verweise auf Instanzen enthält und den Speicherverlust verursacht. Es könnten Threads sein, die noch laufen und Verweise in ihren lokalen Variablen enthalten. Es könnte sich dabei um ein Array handeln, mit dem alle Verbindungen verfolgt werden. Es gibt viele Möglichkeiten und sie hängen alle von der Implementierung ab.

Meine Frage bezieht sich nicht auf Speicherleck oder wie man es vermeiden kann. Es geht darum, wie ein Speicherleck zur Porterschöpfung führen kann. CodingYoshi vor 6 Jahren 0
@CodingYoshi, lassen Sie mich dann umformulieren. Der Port wird nicht freigegeben, wenn der diesem Port zugeordnete Socket nicht explizit geschlossen wird und sich die Klasse, die ihn verwendet, aufgrund eines Speicherverlusts noch im Speicher befindet. Und es gibt eine begrenzte Anzahl von Ports, die möglicherweise gleichzeitig geöffnet sind. Viacheslav vor 6 Jahren 0