Прямо сейчас я знаю, как:
- найти количество открытых файлов на процесс:
ulimit -n
- подсчитать все открытые файлы по всем процессам:
lsof | wc -l
- получить максимально допустимое количество открытых файлов:
cat /proc/sys/fs/file-max
Мой вопрос: почему в Linux существует ограничение на количество открытых файлов?
open-files
limit
xanpeng
источник
источник
Ответы:
Причина в том, что операционной системе требуется память для управления каждым открытым файлом, а память является ограниченным ресурсом, особенно во встроенных системах.
Как пользователь root вы можете изменить максимальное количество открытых файлов для каждого процесса (через
ulimit -n
) и для системы (напримерecho 800000 > /proc/sys/fs/file-max
).источник
/.../file-max
с довольно большим значением, если память не используется?file-max
размера памяти, как представляется, делится на 10 КБ. Поскольку реальная память, используемая для обработчика файлов, должна быть намного меньше (размерstruct file
плюс некоторая память, зависящая от драйвера), это кажется довольно консервативным ограничением.Обратите внимание, что
lsof | wc -l
суммируется множество дублированных записей (разветвленные процессы могут использовать дескрипторы файлов и т. Д.). Это число может быть намного выше установленного предела/proc/sys/fs/file-max
.Чтобы узнать текущее количество открытых файлов с точки зрения ядра Linux, сделайте следующее:
cat /proc/sys/fs/file-nr
Пример: этот сервер имеет 40096 из максимально 65536 открытых файлов, хотя lsof сообщает о гораздо большем числе:
источник
lsof
будет сообщать о многих файлах дважды или более, например/dev/null
, вы можете сделать лучший выбор с:lsof|awk '{print $9}'|sort|uniq|wc -l
lsof|awk '!a[$NF]++{c++}END{print c}'
чтобы получить количество дубликатов открытых файлов.Я думаю, что это в значительной степени по историческим причинам.
Дескриптор Unix файл представляет собой небольшое
int
значение, возвращаемое функциями , какopen
иcreat
, и передаетсяread
,write
,close
и так далее.По крайней мере, в ранних версиях Unix файловый дескриптор представлял собой просто указатель на массив структур фиксированного размера для каждого процесса, где каждая структура содержит информацию об открытом файле. Если я правильно помню, некоторые ранние системы ограничивали размер этой таблицы до 20 или около того.
Более современные системы имеют более высокие пределы, но сохранили ту же общую схему, в основном из инерции.
источник
fileno
иfdopen
функции я бы ожидать , чтобы они были почти взаимозаменяемы.int
дескриптор илиFILE*
. Если у вас будет открыто более 20 файловopen()
, произойдетfdopen()
сбой?