Ответ
Файловый дескриптор (File Descriptor, FD) — это неотрицательное целое число, которое ядро Linux возвращает процессу при открытии любого ресурса ввода-вывода: файла, сетевого сокета, канала (pipe) или устройства. Это низкоуровневый handle для работы через системные вызовы (read, write, close).
Ключевые аспекты для DevOps:
- Стандартные потоки: У каждого процесса есть три предопределённых FD:
0(stdin),1(stdout),2(stderr). - Лимиты: Система ограничивает количество FD, которые может открыть один процесс. Проверить и изменить лимит можно командой
ulimit -n. Превышение лимита — частая причина ошибок "Too many open files" в высоконагруженных приложениях. - Мониторинг: Утилиты
lsof(list open files) иls -la /proc/<PID>/fd/показывают, какие файлы и сокеты открыты процессом. Это критически важно для диагностики утечек дескрипторов.
Пример диагностики в bash:
# Найти процесс, открывший конкретный файл
lsof /var/log/nginx/access.log
# Посмотреть лимиты для текущей оболочки
ulimit -a
# Посмотреть открытые дескрипторы для процесса с PID 1234
ls -la /proc/1234/fd/
# Посчитать количество открытых сокетов у процесса
lsof -p 1234 | grep -c "SOCK"
Почему это важно: Утечка файловых дескрипторов (когда приложение открывает их, но не закрывает) приводит к исчерпанию лимита, после чего приложение не может открыть новые файлы или сетевые соединения, что вызывает его отказ. В DevOps-практике мы настраиваем мониторинг (например, Prometheus-метрику process_open_fds) и корректные лимиты в systemd-юнитах или контейнерах.