Приложение пишет в логи too many opened files, как это диагностировать?devops-40

Пошаговая диагностика

1. Определить текущие лимиты процесса

# Для уже работающего процесса:
cat /proc/<PID>/limits | grep "open files"

# Или найти PID по имени:
pid=$(pgrep -f <имя_процесса>)
cat /proc/$pid/limits

2. Проверить системные лимиты

ulimit -n          # Текущая оболочка
ulimit -n -H       # Жесткий лимит
sysctl fs.file-max # Общий системный лимит

3. Найти процесс с максимальным количеством открытых файлов

lsof -n | awk '{print $2}' | sort | uniq -c | sort -nr | head

4. Анализ открытых файлов конкретного процесса

ls -l /proc/<PID>/fd | wc -l  # Количество открытых файлов
lsof -p <PID>                 # Детальный список
lsof -p <PID> | awk '{print $5}' | sort | uniq -c  # Группировка по типам

5. Проверить настройки systemd

systemctl show <сервис> | grep LimitNOFILE

Глубокий анализ

1. Определить типы открытых файлов

lsof -p <PID> | awk '{print $5}' | sort | uniq -c | sort -nr

Типичные проблемы:

  • Утечка сокетов
  • Не закрытые временные файлы
  • Множественные лог-файлы

2. Трассировка открытия файлов

strace -f -e trace=open,openat,close -p <PID> 2>&1 | grep -v ENOENT

3. Проверить настройки ядра

sysctl -a | grep file
cat /proc/sys/fs/file-nr

Ключевые параметры:

  • fs.file-max - максимальное число файлов в системе
  • fs.nr_open - максимальное число файлов на процесс

Решение проблемы

1. Временное увеличение лимитов

ulimit -n 65536

2. Постоянное изменение лимитов

Добавить в /etc/security/limits.conf:

<user> soft nofile 65536
<user> hard nofile 65536

Для systemd сервисов:

[Service]
LimitNOFILE=65536

3. Оптимизация приложения

  • Добавить обработку ошибок при работе с файлами
  • Реализовать пул соединений
  • Убедиться в корректном закрытии файлов

Резюмируем

  1. Диагностика:

    • Проверить лимиты процесса (/proc/<PID>/limits)
    • Анализировать открытые файлы (lsof -p <PID>)
    • Искать утечки (strace)
  2. Решение:

    • Увеличить лимиты (временные и постоянные)
    • Оптимизировать работу с файлами в приложении
    • Настроить мониторинг количества открытых файлов
  3. Профилактика:

    • Регулярный аудит кода на корректное закрытие ресурсов
    • Мониторинг лимитов в production
    • Настройка alert'ов при приближении к лимитам

Проблема "Too many open files" часто указывает либо на утечку ресурсов в приложении, либо на неадекватно настроенные лимиты для рабочей нагрузки.