← Назад к вопросам

Как узнать текущее значение максимального количества одновременно открытых файлов в Linux

2.0 Middle🔥 201 комментариев
#Linux и администрирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Текущий лимит открытых файлов в Linux: методы определения

В Linux лимит на максимальное количество одновременно открытых файлов (file descriptors) — критически важный параметр как для системных администраторов, так и для разработчиков. Он определяет, сколько файлов, сокетов, пайпов и других дескрипторов может одновременно держать открытыми процесс или вся система. Превышение лимита ведёт к ошибкам EMFILE ("Too many open files"), что может нарушить работу веб-

серверов, баз данных и других сервисов. Вот основные способы проверки этого значения.

1. Проверка лимитов для конкретного процесса

Наиболее точный способ — узнать лимиты для уже запущенного процесса по его PID (Process ID).

А) Через /proc/<PID>/limits Этот файл содержит все установленные лимиты для процесса. Нас интересует строка Max open files.

# Например, для процесса с PID 1234
cat /proc/1234/limits | grep "open files"
# Или для текущей оболочки ($$ содержит её PID)
cat /proc/$$/limits | grep "open files"

Вывод будет выглядеть так:

Max open files            1024                 4096                 files

Где:

  • Первое число (1024) — мягкий лимит (soft limit): текущее значение, которое процесс может превысить только временно.
  • Второе число (4096) — жёсткий лимит (hard limit): максимальное значение, до которого процесс может сам повысить свой мягкий лимит (если имеет права).

Б) Использование утилиты prlimit Более современный и удобный способ, часть пакета util-linux.

# Показать все лимиты для процесса с PID 1234
prlimit --pid 1234
# Или показать только лимит открытых файдов
prlimit --pid 1234 --nofile

Для текущей оболочки:

prlimit --nofile

2. Проверка системных глобальных лимитов

Эти лимиты задают "потолок" для всех пользовательских процессов.

А) Через sysctl Глобальный системный лимит на файловые дескрипторы управляется параметром ядра fs.file-max.

sysctl fs.file-max
# Или
cat /proc/sys/fs/file-max

Это значение — абсолютный максимум для всей системы. Обычно оно очень велико (например, сотни тысяч или миллионы) и задаётся на этапе загрузки ядра.

Б) Лимиты для сессии пользователя (ulimit) Команда ulimit показывает или устанавливает лимиты для текущей сессии оболочки и её дочерних процессов.

# Показать мягкий лимит на открытые файлы
ulimit -n
# Показать жёсткий лимит
ulimit -Hn
# Показать все лимиты текущей оболочки
ulimit -a

3. Практический пример: диагностика проблемы

Допустим, упал Nginx с ошибкой "Too many open files". Алгоритм диагностики:

  1. Найти PID основного процесса Nginx:
    systemctl status nginx | grep PID
    # Или
    pgrep nginx
    
    Предположим, PID = 5678.

  1. Проверить его текущие лимиты:
    cat /proc/5678/limits | grep "open files"
    
    Увидим, например: `Max open files 1024 4096`.

  1. Узнать, сколько файлов он реально использует:
    ls -l /proc/5678/fd | wc -l
    
    Если число близко к 1024 — причина ясна.

  1. Проверить системный "потолок":
    cat /proc/sys/fs/file-max
    
    Убедиться, что он не исчерпан для всей системы.

4. Динамическая статистика системы

Чтобы увидеть общее использование файловых дескрипторов в системе, используйте:

cat /proc/sys/fs/file-nr

Вывод три числа:

1256    874    9223372036854775807
  • Первое число: выделенные файловые дескрипторы (используются прямо сейчас).
  • Второе число: свободные выделенные файловые дескрипторы (открыты, но не используются).
  • Третье число: максимально возможное значение (file-max).

Ключевые выводы

  • /proc/<PID>/limits и prlimit — лучшие инструменты для инспекции конкретного процесса.
  • ulimit управляет лимитами сессии оболочки.
  • fs.file-max — глобальный системный лимит, задаваемый в /etc/sysctl.conf.
  • Различие между мягким (soft) и жёстким (hard) лимитом важно: процесс может превысить мягкий лимит только временно, а для постоянного повышения (в пределах hard limit) нужны права и вызов setrlimit().

Для постоянного изменения лимитов (после перезагрузки) нужно править конфигурационные файлы: /etc/security/limits.conf для пользовательских лимитов и /etc/sysctl.conf для глобального fs.file-max.

Как узнать текущее значение максимального количества одновременно открытых файлов в Linux | PrepBro