我有一个完全更新的 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
或时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
?systemd
SELinux 可能与此有关吗? 感谢您的帮助。
编辑:根据 @Gerrit 的建议,我运行了该命令systemd-cgls
,结果显示实际上我在本地用户下运行的所有程序都在:
-.slice
├─user.slice
│ ├─user-1005.slice
│ │ ├─session-2.scope
│ │ │ └─[many entries here]
│ │ └─[email protected]
│ │ └─[many entries here]
答案1
在 240 版之前的 systemd 设置中,所有用户进程都在内核建议的默认用户资源限制下运行,在 RHEL 8.1 中,硬限制似乎为 4096,软限制为 1024。在 systemd 240 中,此限制已更改为将默认硬限制设置为 512K,默认软限制保持不变,以避免程序为每个潜在文件描述符保留内存或其他兼容性问题。
您可以在 /etc/systemd/system.conf 中的 [Manager] 部分使用 DefaultLimitNOFILE= 设置更改 NOFILE 的默认 HARD 限制。需要重新启动才能使此设置生效。
/etc/security/limits.conf
之后,您确实可以通过设置来提高 NOFILE 的默认软限制* soft nofile nnnn
。无需将 pam_limits 添加到 /etc/pam.d/login,至少在 Centos 7 中不需要,因为它已通过 /etc/pam.d/system-auth 包含在内。