1

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

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

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

(Акцент мой)

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

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

Вопросы:

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

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

1 ответ1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .