
Прямо сейчас я знаю, как:
- найти лимит открытых файлов на процесс:
ulimit -n
- подсчитать все открытые файлы всеми процессами:
lsof | wc -l
- получить максимально допустимое количество открытых файлов:
cat /proc/sys/fs/file-max
У меня вопрос: почему в Linux существует ограничение на количество открытых файлов?
решение1
Причина в том, что операционной системе необходима память для управления каждым открытым файлом, а память является ограниченным ресурсом, особенно во встраиваемых системах.
Как пользователь root вы можете изменить максимальное количество открытых файлов для каждого процесса (через ulimit -n
) и для каждой системы (например echo 800000 > /proc/sys/fs/file-max
).
решение2
Обратите внимание, что это lsof | wc -l
суммирует множество дублирующихся записей (разветвленные процессы могут совместно использовать дескрипторы файлов и т. д.). Это число может быть намного больше, чем предел, установленный в /proc/sys/fs/file-max
.
Чтобы получить текущее количество открытых файлов с точки зрения ядра Linux, выполните следующие действия:
cat /proc/sys/fs/file-nr
Пример: На этом сервере открыто 40096 из 65536 файлов, хотя lsof сообщает о гораздо большем числе:
# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr
40096 0 65536
# lsof | wc -l
521504
решение3
Я думаю, что это во многом обусловлено историческими причинами.
Дескриптор файла Unix — это небольшое int
значение, возвращаемое такими функциями, как open
и creat
, и передаваемое в read
, write
, close
, и так далее.
По крайней мере в ранних версиях Unix файловый дескриптор был просто индексом в массиве структур фиксированного размера для каждого процесса, где каждая структура содержала информацию об открытом файле. Если я правильно помню, некоторые ранние системы ограничивали размер этой таблицы примерно 20.
Более современные системы имеют более высокие пределы, но сохранили ту же общую схему, во многом по инерции.