Ограничения на количество файловых дескрипторов


34

Я пытаюсь установить 389-ds, и это дает мне это предупреждение:

WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.

Я понимаю о файловых дескрипторах, но не понимаю мягких и жестких ограничений.

Когда я бегу cat /proc/sys/fs/file-max, я возвращаюсь 590432. Это должно подразумевать, что я могу открыть до 590432 файлов (т.е. иметь до 590432 файловых дескрипторов.

Но когда я бегу ulimit, это дает мне разные результаты:

$ ulimit
unlimited

$ ulimit -Hn    # Hard limit
4096

$ ulimit -Sn    # Soft limit
1024

Но каковы жесткие / мягкие ограничения ulimitи как они соотносятся с количеством, хранящимся в /proc/sys/fs/file-max?

Ответы:


39

Согласно документации ядра , /proc/sys/file-maxэто максимальное, общее, глобальное количество файловых дескрипторов, которое ядро ​​выделит перед запуском. Это ограничение ядра, а не вашего текущего пользователя. Таким образом, вы можете открыть 590432 при условии, что вы один в режиме ожидания (однопользовательский режим, демоны не запущены).

Обратите внимание, что документация устарела: файл был proc/sys/fs/file-maxв течение длительного времени. Спасибо Martin Jambon за указание на это.

О разнице между мягкими и жесткими пределами можно узнать здесь, на SE . Вы можете повышать или понижать мягкое ограничение как обычный пользователь, при условии, что вы не превышаете жесткое ограничение. Вы также можете снизить жесткий лимит (но вы не можете повысить его снова для этого процесса). Как суперпользователь, вы можете поднимать и опускать как жесткие, так и мягкие ограничения. Схема двойного ограничения используется для обеспечения соблюдения системных политик, но также позволяет обычным пользователям устанавливать временные ограничения для себя, а затем изменять их.

Обратите внимание, что если вы попытаетесь снизить жесткий предел ниже мягкого (и вы не являетесь суперпользователем), вы EINVALвернетесь (неверный аргумент).

Итак, в вашем конкретном случае ulimit(что совпадает с ulimit -Sf) говорится, что у вас нет мягкого ограничения на размер файлов, записываемых оболочкой и ее подпроцессами . (это, вероятно, хорошая идея в большинстве случаев)

Ваш другой вызов ulimit -Hnсообщает об -nограничении (максимальное количество дескрипторов открытых файлов), а не об -fограничении, поэтому мягкий предел кажется выше жесткого ограничения. Если вы войдете, ulimit -Hfвы также получите «безлимитный».


14
В Linux 4.4.0, файл-макс путь /proc/sys/fs/file-max.
Мартин Джамбон

пожалуйста, жесткое ограничение ulimit -Hn предназначено для самого ограничения системы на выделенные возможности дескриптора файла?
Веб-леди

2
@ Вебман: нет, это не так. ulimitвлияет только на ограничения для текущего процесса . Пределы текущего процесса также передаются дочерним процессам, но каждый процесс имеет отдельный счет. Например ulimit -Hn 10, вы можете одновременно открыть только 10 файловых дескрипторов. Каждый дочерний процесс, который вы создаете, может иметь до 10 файловых дескрипторов. Только суперпользователь может увеличить лимит после установки. Если вы установите слишком низкое значение, единственным вариантом может быть уничтожение процесса оболочки и запуск нового.
Алексиос

0

Системный вызов «select» - это одно из многих ужасных решений Unix, которые заставляют задуматься о том, что даже Windows95 по-прежнему выглядит так хорошо в сравнении.

Он должен был быть забанен 20 лет назад, и тогда у нас теперь может быть возможность без ограничений обрабатывать файлы без ограничений.

Вы можете легко увеличить количество файловых дескрипторов с помощью конфигурации ядра и ulimit, НО помните, что если какая-либо библиотека использует системный вызов «select», ваша программа станет нестабильной (повреждение памяти) и завершится ошибкой.

Select может обрабатывать только файловые дескрипторы от 0 до 1023, и если вы передадите один из них с более высоким значением, он будет случайно вставляться в вашу память, и выборка никогда не повторит дескриптор как работающий. К сожалению, многие библиотеки используют select.


Ваш комментарий является полезным предупреждением, но вместо того, чтобы бушевать, было бы гораздо полезнее процитировать цитату из fd_set(3)справочной страницы и узнать, откуда исходит ограничение FD_SETSIZE. И лучшим было бы предложение о замене вызова, как poll(3), как в этом ответе
Davor Cubranic
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.