我有一个完全更新的 Red Hat Enterprise Linux (RHEL) 8.1 x86_64 系统,作为本地终端中的本地用户(即不是通过 SSH 远程),当我运行ulimit -Sn
它时会说1024
并ulimit -Hn
产生4096
. 我想增加这些数字,因为通常当我编译大型项目时gcc
,该make
步骤会因too many open files
错误而失败。我什至尝试将编译移到podman
容器中,但这并没有帮助,因为容器只是继承了我本地用户的ulimit
s。
这是我在主机上尝试过的:
- 在
/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
or时prlimit
,相关的输出行仍然显示:
NOFILE max number of open files 1024 4096 files
我现在唯一的线索是,当我使用 Gnome 的系统活动应用程序查看我的进程时,当我打开一个终端窗口时,有两个 bash
进程都在我的本地用户下。奇怪的是,当我cat /proc/[process id]/limits
在两个进程上运行时,一个显示大32767
限制,而另一个显示原始1024
限制。我想检查我的~/.bashrc
,~/.bash_profile
但他们没有改变我的ulimit
.
我难住了!
我还可以检查和尝试什么来增加我的ulimit -n
? 或者 SELinux可能systemd
与它有关吗?谢谢您的帮助。
编辑:根据@Gerrit 的建议,我运行systemd-cgls
它说几乎所有在我的本地用户下运行的东西都在:
-.slice
├─user.slice
│ ├─user-1005.slice
│ │ ├─session-2.scope
│ │ │ └─[many entries here]
│ │ └─[email protected]
│ │ └─[many entries here]
在版本 240 之前的 systemd 设置中,所有用户进程都在内核建议的默认用户资源限制下运行,在 RHEL 8.1 上,硬限制似乎是 4096,软限制是 1024。在 systemd 240 中,这已更改为将默认硬限制设置为 512K,默认软限制保持不变,以避免程序为每个潜在的文件描述符或其他兼容性问题保留内存的问题。
您可以使用 DefaultLimitNOFILE= 设置在 [Manager] 部分的 /etc/systemd/system.conf 中更改 NOFILE 的默认 HARD 限制。需要重新启动才能使其生效。
之后,您确实可以通过设置 NOFILE 来提高默认的软
/etc/security/limits.conf
限制* soft nofile nnnn
。不需要将 pam_limits 添加到 /etc/pam.d/login,至少在 Centos 7 中不需要,因为 /etc/pam.d/system-auth 已经包含了。