У меня есть полностью обновленная система Red Hat Enterprise Linux (RHEL) 8.1 x86_64, где в качестве локального пользователя в локальном терминале (т.е. не удаленно через SSH) при запуске ulimit -Sn
это говорит 1024
и ulimit -Hn
дает 4096
. Я хотел бы увеличить эти цифры потому что часто, когда я компилирую большие проекты, такие как gcc
, то make
шаг потерпит неудачу с too many open files
ошибка. Я даже пробовал переместить компиляцию в podman
контейнер, но это не помогло, потому что контейнер только что унаследовал моего локального пользователя ulimit
с.
Вот что я пробовал на хосте:
/etc/security/limits.conf
Я добавил:* soft nofile 32767
* hard nofile 65535
[username] soft nofile 32767
[username] hard nofile 65535
ls -a /etc/security/limits.d/
а файлов там нет./etc/sysctl.conf
есть строка, в которой говорится fs.file-max = 65535
. Я также побежал sysctl -p
.session required pam_limits.so
до конца файла /etc/pam.d/login
.ls -a /etc/sysctl.d/
показал два файла ./ ../ 50-libreswan.conf 99-sysctl.conf@
, ни один из них не содержал ничего, связанного с количеством открытых файлов.cat /proc/sys/fs/file-max
говорит 65535
./etc/systemd/user.conf
пуст (все строки закомментированы), и я попытался явно установить DefaultLimitNOFILE=65535
.Попробовав описанное выше, когда я бегу cat /proc/self/limits
или prlimit
, соответствующая строка вывода по-прежнему говорит:
NOFILE max number of open files 1024 4096 files
Единственная подсказка, которая у меня есть прямо сейчас, заключается в том, что когда я использую приложение Gnome System Activity для просмотра своих процессов, когда у меня открыто окно терминала, есть два bash
процессы, как под моим локальным пользователем. Как ни странно, когда я бегу cat /proc/[process id]/limits
на двух процессах один показывает большой 32767
предел, но у другого есть оригинал 1024
предел. Думал проверить свой ~/.bashrc
и ~/.bash_profile
но они не меняют мой ulimit
.
Я в тупике!
Что еще можно проверить и попробовать, чтобы увеличить свой ulimit -n
? Мог systemd
или SELinux тут причем? Спасибо за помощь.
РЕДАКТИРОВАТЬ: Предложение Per @ Gerrit, я побежал systemd-cgls
который говорит, что практически все, что работает под моим локальным пользователем, находится под:
-.slice
├─user.slice
│ ├─user-1005.slice
│ │ ├─session-2.scope
│ │ │ └─[many entries here]
│ │ └─user@1005.service
│ │ └─[many entries here]
В настройке systemd до версии 240 все пользовательские процессы выполняются с ограничениями пользовательских ресурсов по умолчанию, предложенными ядром, которые в RHEL 8.1 кажутся равными 4096 для жесткого ограничения и 1024 для мягкого ограничения. В systemd 240 это было изменено, чтобы установить жесткое ограничение по умолчанию на 512 КБ, мягкое ограничение по умолчанию остается тем же, чтобы избежать проблем с программами, резервирующими память для каждого потенциального файлового дескриптора или других проблем совместимости.
Вы можете изменить установленный по умолчанию предел HARD для NOFILE в /etc/systemd/system.conf в разделе [Manager] с помощью параметра DefaultLimitNOFILE =. Для этого требуется перезагрузка.
После этого вы действительно можете поднять мягкий лимит по умолчанию NOFILE, установив его в /etc/security/limits.conf
с участием * soft nofile nnnn
. Добавление pam_limits в /etc/pam.d/login не требуется, по крайней мере, не в Centos 7, так как это уже включено через /etc/pam.d/system-auth.