В некоторых ситуациях на Linux могут возникать ошибки, связанные с превышением лимита использования файловых дескрипторов. Эти лимиты накладываются как самим ядром Linux, так и его программными модулями, например PAM.
Узнать текущее значение максимального количества файловых дескрипторов, определяемое ядром Linux можно командой:
# cat /proc/sys/fs/file-max
Этот лимит может быть изменён без перезагрузки системы (начинает действовать сразу и действует до перезагрузки):
# echo "1221724" > /proc/sys/fs/file-max
Чтобы требуемое значение использовалось постоянно, то есть действовало и после перезагрузки, его необходимо определить в конфиг.файле /etc/sysclt.conf
:
...
fs.file-max=1221724
...
Для получения информации о количестве всех открытых файлов всеми процессами в Linux некоторые «знатоки» предлагают использовать команду типа
# lsof | wc -l
Однако такая команда показывает гораздо большее значение, чем всего открыто файлов в системе на данный момент на самом деле. Это связано с тем, что по несколько раз в подсчёт попадают одни и теже открытые файлы, используемые разными процессами.
Поэтому проще для получения общего числа открытых файлов использовать данные ядра Linux
# cat /proc/sys/fs/file-nr 5248 0 610862
Первое число - общее количество занятых/используемых на данный момент времени файловых дескрипторов.
Второе число - количество выделенных процессам, но не используемых в данный момент дескрипторов.
Третье число - максимальное количество открытых дескрипторов
Получить список TOP-20 процессов с самым большим количеством открытых файловых дескрипторов:
# for x in `ps -eF| awk '{ print $2 }'`; \ do echo `ls /proc/$x/fd 2> /dev/null | \ wc -l` $x `cat /proc/$x/cmdline 2> /dev/null`; \ done | sort -n -r | head -n 20
Подсчитать количество открытых файлов в разрезе процессов (в первой колонке будет выведен PID процесса, во второй количество открытых файлов этим процессом):
# ps aux | sed 1d | awk \ '{print "fd_count=$(lsof -p " $2 " | wc -l) && echo " $2 " $fd_count"}' | \ xargs -I {} bash -c {}
Посмотреть открытые файловые дескрипторы во всех процессах для отдельно взятого пользователя, например «apache»
# lsof -u apache
Подсчитать количество открытых файлов в каждом процессе для отдельно взятого пользователя:
# lsof -u apache | awk '{print $2}' | sort | uniq -c | sort -n
Тоже самое, только в реальном режиме времени:
# watch 'lsof -u vdsm | awk '\''{print $2}'\'' | sort | uniq -c | sort -n'
Посмотреть открыте файловые дескриптры для отдельно взятого процесса (по PID процесса):
# lsof -p 9189
Подсчитать количество файловых дескриптров для отдельно взятого процесса:
# lsof -p 9189 | wc -l
Дополнительные источники информации:
Проверено на следующих конфигурациях:
Версия ОС |
---|
Debian GNU/Linux 8.10 (jessie) |
Автор первичной редакции:
Алексей Максимов
Время публикации: 09.06.2018 11:18