Может ли утечка памяти .NET вызвать исчерпание порта?

388
CodingYoshi

Наш веб-сервер имел проблему из-за исчерпания порта. Это происходит каждые 2 недели, и перезагрузка устраняет проблему. Но я хочу докопаться до сути этой проблемы и найти постоянное исправление, чтобы избежать перезагрузок.

Я прочитал эту статью, и это было действительно полезно. Тем не менее, он упоминает это:

Итак, если вы видите процесс, который использует много портов, разговаривает с одним удаленным адресом или несколькими удаленными адресами, а состояние соединения - что-то вроде TIME_WAIT, то это, как правило, пустая распродажа, что у этого процесса есть проблема, и не освобождает эти порты должным образом .

(Акцент мой)

Затем еще ниже есть этот абзац:

Я упоминал выше, что утечки памяти тоже могут вызывать такое поведение - почему именно? Случается так, что для того, чтобы заставить порт использовать исходящее соединение, процессы должны получить дескриптор этого порта. Этот дескриптор выходит из памяти невыгружаемого пула. Таким образом, если у вас есть утечка памяти, и вы исчерпали пул невыгружаемого, процессы, которые должны общаться с другими машинами в сети, не смогут получить ручку и, следовательно, не смогут получить порт им нужен.

Вопросы :

  1. Что автор имеет в виду, не выпуская эти порты должным образом ? Чья это работа, программист?
  2. Может кто-нибудь объяснить, как утечка памяти может привести к исчерпанию порта, потому что я все еще не уверен после прочтения выше?

И последнее, что нужно иметь в виду, это то, что я программист, а не администратор (если это помогает в любом случае).

1
Должен ли я разместить этот вопрос где-то еще (какой-то другой сайт)? Пожалуйста, дайте мне знать, потому что мне нужно докопаться до сути. CodingYoshi 6 лет назад 0

1 ответ на вопрос

0
Viacheslav
  1. Да, это работа программиста.
  2. Да, утечка памяти может вызвать это. Проблема в том, что если сокет не был закрыт в явном виде, он закрывается только тогда, когда экземпляр Socket или другого производного класса будет удален . Это выполняется сборщиком мусора автоматически, однако он не уничтожит экземпляр класса, если где-то останется хотя бы одна ссылка (утечка памяти).

Может быть довольно сложно выяснить, что хранит ссылки на экземпляры и вызывает утечку памяти. Это могут быть потоки, которые все еще работают и хранят ссылки в своих локальных переменных. Это может быть какой-то массив, который используется для отслеживания всех соединений. Возможностей много, и все они зависят от реализации.

Мой вопрос не об утечке памяти или о том, как ее избежать. Речь идет о том, как утечка памяти может привести к исчерпанию порта. CodingYoshi 6 лет назад 0
@CodingYoshi, тогда позвольте мне перефразировать. Порт не освобождается, если сокет, связанный с этим портом, явно не закрыт, и класс, который его использует, все еще находится в памяти из-за утечки памяти. И есть ограниченное количество портов, которые могут быть открыты одновременно. Viacheslav 6 лет назад 0