为了进行测试,我将全局打开文件限制更改为 3000:
#sysctl -w fs.file-max=3000
fs.file-max = 3000
#cat /proc/sys/fs/file-nr
2016 0 3000
我创建了一些文件:
i=1; while [ "$i" -le 1000 ]; do : >> "$i"; i=$(($i + 1)); done
我把它们打开了:
i=1; while [ "$i" -le 1000 ]; do less "$i" & ; i=$(($i + 1)); done
我已经看到了我刚刚制造的混乱:
ksh: /bin/less: cannot execute [Too many open files in system]
我知道我达到了极限......
# cat /proc/sys/fs/file-nr
3008 0 3000
如果我现在提高打开文件限制(这样我就可以使用另一个控制台进行 ssh 了)并且如果我在将打开文件最大值设置为 3000 后检查最近生成的一个较少的文件,我会看到:
# cat /proc/28282/limits | grep 'Max open files'
Limit Soft Limit Hard Limit Units
Max open files 1024 16384 files
“硬限制”仍然设置得很高,虽然没有提到 3000。所以我们达到了系统限制,而不是每个进程的限制。
为什么不指示新创建的进程继承 3000 vs 16384?
我用一个新的 shell 登录了一个新的终端,那么为什么我的 shell 不被告知 3000 并将其传递给 less 呢?
这是一个 2.6.32 内核
根据此链接Ulimit 文件描述符限制不适用于特定进程
我引用:
“/etc/security/limits.conf 是 pam_limits 的一部分,因此在此文件中设置的限制由 pam_limits 模块在登录会话期间读取。登录会话可以通过 ssh 或通过终端”
/etc/sysctl.conf 是系统范围的全局配置,我们不能在这里设置用户特定的配置。它设置了所有用户/进程可以使用的最大资源量”
/etc/sysctl.conf 不是设置它的正确位置。
我需要全面调查 /etc/security/limits.conf 和“pam_limits”