Почему в Linux ограничено количество открытых файлов?

Прямо сейчас я знаю, как:

  • найти ограничение на количество открытых файлов для каждого процесса: ulimit -n
  • подсчитать все открытые файлы всеми процессами: lsof | wc -l
  • получить максимально допустимое количество открытых файлов: cat/proc/sys/fs/file-max

Мой вопрос: почему в Linux существует ограничение на количество открытых файлов?


Причина в том, что операционной системе требуется память для управления каждым открытым файлом , а память — ограниченный ресурс, особенно во встроенных системах.

Как пользователь root вы можете изменить максимальное количество открытых файлов для каждого процесса (с помощью ulimit -n ) и для каждой системы (например, echo 800000>/proc/sys/fs/file-max ).


72

Обратите внимание, что lsof | wc -l суммирует множество повторяющихся записей (разветвленные процессы могут совместно использовать дескрипторы файлов и т. д.). Это число может быть намного выше предела, установленного в /proc/sys/fs/file-max .

Чтобы получить текущее количество открытых файлов с точки зрения ядра Linux, сделайте следующее:

cat/proc/sys/fs/ file-nr

Пример: на этом сервере 40096 из макс. 65536 открытых файлов, хотя lsof сообщает о гораздо большем количестве:

  # cat/proc/sys/fs/file-max65536 # cat/proc/sys/fs/file-nr 40096 0 65536 # lsof |  wc -l521504  

Поделиться
Улучшите этот ответ
отредактировал 25 января ’16 в 22:19
Джош
10333 бронзовые значки
ответил 09 дек. ’13 в 16: 26
  • 1
    Поскольку lsof будет сообщать о многих файлах дважды или больше, например /dev/null , вы можете попытаться угадать с помощью: lsof | awk '{print $ 9}' | sort | uniq | wc -l — Иван 08 марта ’18 в 07:27
  • вы можете использовать lsof | awk '! a [$ NF] ++ {c ++} END {print c}' , чтобы получить неповторяющееся количество открытых файлов . — П …. 28 мая ’19 в 18:04
  • Очень старый вопрос, но мне нужно изучить эти настройки на моем сервере и lsof | wc -l дает 40 000, а номер файла — 2300 — это несоответствие нормально? — a.smith 15 сен ’20 в 13:00
добавить комментарий |

Обратите внимание, что lsof | wc -l суммирует множество повторяющихся записей (разветвленные процессы могут совместно использовать дескрипторы файлов и т. д.). Это число может быть намного выше предела, установленного в /proc/sys/fs/file-max .

Чтобы получить текущее количество открытых файлов с точки зрения ядра Linux, сделайте следующее:

cat/proc/sys/fs/ file-nr

Пример: на этом сервере 40096 из макс. 65536 открытых файлов, хотя lsof сообщает о гораздо большем количестве:

  # cat/proc/sys/fs/file-max65536 # cat/proc/sys/fs/file-nr 40096 0 65536 # lsof |  wc -l521504  

18

Я думаю, это в основном по историческим причинам.

Файловый дескриптор Unix — это небольшое значение int , возвращаемое такими функциями, как open и creat и передаются в read , write , close и т. д. далее.

По крайней мере, в ранних версиях Unix дескриптор файла был просто индексом в массиве структур фиксированного размера для каждого процесса, где каждая структура содержит информацию об открытом файле. Если я правильно помню, некоторые ранние системы ограничивали размер этой таблицы до 20 или около того.

Более современные системы имеют более высокие пределы, но сохранили ту же общую схему, в основном по инерции.

Поделиться
Улучшите этот ответ
ответил апр. 19 ’12, в 18:55
  • 1
    20 было ограничение Solaris для структур данных FILE языка C. Количество дескрипторов файла всегда было больше. — Лотар, 14 сен 2014, в 3:29
  • @Lothar: Интересно. Интересно, почему бы различались лимиты? Учитывая функции fileno и fdopen , я ожидал бы, что они будут почти взаимозаменяемыми. — Кейт Томпсон, 14 сен. ’14 в 3:37
  • Файл unix — это больше, чем просто возвращаемый дескриптор файла (int). Есть дисковые буферы и блок управления файлом, который определяет текущее смещение файла, владельца файла, разрешения, индексный дескриптор и т. Д. — ChuckCottrill, 22 ноября 2017 г., 06:29
  • @ChuckCottrill: Да, конечно. Но большая часть этой информации должна храниться вне зависимости от того, осуществляется ли доступ к файлу через дескриптор int или через FILE * . Если с помощью open () открыто более 20 файлов, произойдет ли сбой fdopen () ? — Кейт Томпсон 22 ноя. ’17 в 17:14
добавить комментарий |

Я думаю, это в значительной степени по историческим причинам.

Дескриптор файла Unix — это небольшое значение int , возвращаемое такими функциями, как open и creat и передается в read , write , close и т. д.

По крайней мере, в ранних версиях Unix дескриптор файла был просто индексом в массиве структур фиксированного размера для каждого процесса, где каждая структура содержит информацию об открытом файле. Если я правильно помню, некоторые ранние системы ограничивали размер этой таблицы до 20 или около того.

Более современные системы имеют более высокие пределы, но сохранили ту же общую схему, в основном по инерции.

Оцените статью
Botgadget.ru
Добавить комментарий