Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья5 мин чтенияПросмотры1

Too many open files: проверяем лимит работающего процесса

Ошибка может относиться к одному процессу, хотя свободная память и место на диске ещё есть. Инструкция для Ubuntu 24.04 показывает, где прочитать действующий лимит и как отличить его от настроек текущего терминала.

Комментарии 0

Открытые ящики картотеки с бумажными папками — метафора открытых файлов. Сгенерированная иллюстрация.
В этой статье

Приложение перестало открывать файлы или принимать соединения и сообщает Too many open files. Свободные гигабайты на диске здесь могут ни при чём. В Linux файловые дескрипторы используются не только для обычных файлов, но и для сокетов, каналов и других объектов. Сначала нужно проверить процесс, который получил ошибку, а не увеличивать все ограничения на сервере.

Применимость: Ubuntu 24.04 LTS, утилита prlimit из util-linux 2.39.3, GNU coreutils 9.4 и доступная файловая система proc. Проверено по документации 26 сентября 2026 года. Все команды ниже читают состояние. Изменение лимитов, конфигурации и перезапуск служб в эту инструкцию не входят. Для чтения чужого процесса могут потребоваться разрешённые администратором права; отказ доступа не следует обходить изменением защиты.

Найдите процесс, к которому относится ошибка

Идентификатор берут из сообщения приложения, журнала или проверенного списка процессов. У сервиса могут быть главный процесс и несколько рабочих: ошибка одного рабочего не означает, что ограничение исчерпал главный. После перезапуска идентификаторы меняются, а старый номер со временем может получить другая программа.

Во всех командах PID — заглушка. Вместо неё подставьте проверенный числовой идентификатор нужного процесса, без угловых скобок. Выполняйте команды в той среде, где виден этот процесс. Номер внутри контейнера и номер на хосте могут различаться. Если процесс уже завершился, его текущее состояние прочитать нельзя; остаются журналы и ранее собранные показатели.

prlimit --pid PID --nofile

Здесь у параметра --nofile нет знака равенства и числового значения: команда показывает ограничение, не устанавливая новое. Не копируйте вместо неё примеры с --nofile=... из инструкции по настройке — они меняют состояние.

В результате найдите строку NOFILE и столбцы SOFT и HARD. Мягкий предел действует сейчас, жёсткий задаёт потолок для его обычного повышения самим непривилегированным процессом. Строго говоря, предел ограничивает номер нового дескриптора: он на единицу больше максимально допустимого номера. Поэтому число открытых объектов полезно для диагностики, но не является точным универсальным счётчиком «оставшихся мест».

Те же сведения можно прочитать в списке ограничений процесса:

cat /proc/PID/limits

Нужна строка Max open files. Это действующее состояние, а не только намерение из конфигурационного файла. Значение, прочитанное командой ulimit -n в вашем терминале, относится к этой оболочке и само по себе ничего не доказывает о давно работающем серверном процессе.

Посмотрите, какие объекты остаются открытыми

ls -l /proc/PID/fd

Каталог содержит ссылки с числовыми именами. Обычный путь указывает на файл, запись вида socket:[...] — на сокет, pipe:[...] — на канал. Встречаются и анонимные объекты ядра. Это не список файлов, занимающих место на диске: сотни сетевых соединений тоже используют дескрипторы.

Для просмотра только номеров без расшифровки целей используйте:

ls -1 /proc/PID/fd

Это снимок меняющегося состояния. Пока команда читает каталог, программа может открывать и закрывать объекты. Сообщение об исчезнувшей ссылке не обязательно означает повреждение системы. При отказе доступа или отсутствии каталога нельзя трактовать пустой результат как ноль открытых дескрипторов.

При большом количестве объектов вывод может оказаться длинным и создать дополнительную работу. Не запускайте частые обходы всех процессов на загруженном сервере. Для первого разбора достаточно выбранного процесса и нескольких разнесённых во времени наблюдений. Перед передачей вывода уберите чувствительные имена файлов: они могут раскрывать структуру проекта или данные клиентов.

Сопоставьте ошибку, предел и момент наблюдения

В условном примере мягкий предел равен 1024, а в момент сбоя почти все доступные номера заняты. Это повод искать, какие операции удерживают дескрипторы: соединения с внешним сервисом, незакрытые файлы, растущий пул клиентов. Если после завершения нагрузки количество возвращается к обычному уровню, картина отличается от непрерывного роста при стабильной нагрузке.

Одного позднего снимка недостаточно. Ошибка могла возникнуть на кратком пике, после которого приложение закрыло часть объектов. И наоборот, большой текущий список без ошибок не доказывает утечку. Нужны время события, правильный процесс и динамика относительно его обычной работы.

Ошибка EMFILE связана с пределом дескрипторов процесса. ENFILE относится к системному пределу открытых файлов; это другой уровень диагностики. Текст приложения может скрывать исходный код ошибки, поэтому при возможности сохраните полное сообщение. Бездумное увеличение лимита одного процесса не является решением системной проблемы и может лишь отложить проявление утечки.

В тестовой среде Ubuntu 24.04.3 с util-linux 2.39.3 чтение через prlimit выполнено для отдельного дочернего процесса: получены оба предела 16384. Чтение его каталога proc в этой среде оказалось недоступно, поэтому полный сценарий просмотра дескрипторов на стенде не подтверждён. Команды чтения каталога сверены с документацией Linux и GNU coreutils; их результат на вашем сервере зависит в том числе от пространства процессов и прав.

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

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.