Назад | Перейти на главную страницу

Чем отличаются ulimit -n и / proc / sys / fs / file-max?

Я заметил, что в новом образе CentOS, который я только что загрузил с EC2, значение ulimit по умолчанию - 1024 открытых файла, но / proc / sys / fs / file-max установлено на 761 408, и мне интересно, как работают эти два ограничения. все вместе. Я предполагаю, что ulimit -n - это ограничение на количество файловых дескрипторов для каждого пользователя, в то время как / proc / sys / fs / file-max является общесистемным? Если это так, скажем, я дважды входил в систему как один и тот же пользователь - имеет ли каждый вошедший в систему пользователь ограничение на количество открытых файлов в 1024, или это ограничение в 1024 объединенных открытых файла между каждым из зарегистрированных - в пользователях?

И имеет ли большое влияние на производительность установка максимального количества файловых дескрипторов на очень большое число, если ваша система никогда не открывает очень много файлов?

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

Нет риска снижения производительности за счет увеличения file-max. В современных дистрибутивах максимальное значение FD установлено довольно высоко, тогда как в прошлом требовалась перекомпиляция и модификация ядра для увеличения значения выше 1024. Я бы не стал увеличивать общесистемный уровень, если у вас нет технической необходимости.

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

Ограничение ulimit для уникального пользователя. Таким образом, user1, независимо от того, сколько раз входил в систему или выполнялся какой-либо процесс, будет ограничен до 1024. Все вместе.

Я не уверен, полностью ли я понимаю значение этого предложения (английский не является моим родным языком). Если это предложение означает, что конфигурация ulimit для дескрипторов файлов не является ограничением для каждого процесса, принятый ответ (AFAIK) неверен.

Я имею в виду, что если какой-то пользователь запустил 4 процесса и конфигурация ulimit для FD равна 1024, каждый процесс может открыть 1024 FD. Пользователь будет ограничен не 1024 FD, а процессами, которые запускает этот пользователь.

Например:

me@superme:~$ ulimit -n
1024
me@superme:~$ lsof | grep $USER | wc -l
8145

Вот пример Perl, в котором мы достигли предела (это ограничение для каждого процесса):

#!/usr/bin/perl

$count = 0;
@filedescriptors;

while ($count <= 1024) {
    $FILE = ${count};
    open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
    push(@filedescriptors, $FILE);
    $count ++;
}

Результат:

FDs: 1021 Too many open files at ./test.pl line 8.

1021, потому что до достижения цикла while было 3 открытых файловых дескриптора (stdout, stdin и stderr)

Извините, если я совершенно не прав или неправильно понял ответ.