Debian Lenny。对于每个用户(包括 root 用户):
# cat /proc/sys/fs/file-max
262144
# sysctl fs.file-max
fs.file-max = 262144
# ulimit -Hn
1024
# ulimit -Sn
1024
文件/etc/security/limits.conf
没有未注释的行。
那这个 1024 是从哪里来的呢?
答案1
这fs.file-max
系统控制显示可分配的文件句柄数全系统,而ulimit
资源限制是针对每个进程(或每个 UID)的。前者在Documentation/sysctl/fs.txt:90
:
文件最大值和文件编号: file-max 中的值表示文件的最大数量 Linux 内核将分配的句柄。当你获得很多 关于文件句柄用尽的错误消息,你可能会 想要增加这个限制。
1024 个文件的 rlimit 没有在任何地方明确设置;它被硬编码到内核中,作为 pid 1 的默认值,include/asm-generic/resource.h:81
:
/* * init 任务的启动时间 rlimit 默认值: */ #定义 INIT_RLIMITS \ { \ ... [RLIMIT_NOFILE] = { INR_OPEN_CUR, INR_OPEN_MAX },\ ... }
参考文献INR_OPEN_CUR
和INR_OPEN_MAX
来自include/linux/fs.h:26
:
#define INR_OPEN_CUR 1024 /* nfile rlimits 的初始设置 */ #define INR_OPEN_MAX 4096 /* nfile rlimits 的硬限制 */
init
其他进程只是从(或任何 pid 1)继承限制。
为什么/proc/1/limits
Debian 上报告 1024 为软并且很硬nfile 限制?我不知道:sysvinit 源代码和 Debian 内核补丁都没有改变它。可能是 initramfs 脚本。(我运行的是 Arch,其默认值为 1024/4096。)
答案2
对于@grawity提出的问题,这个内核提交可以解释:
提交 0ac1ee0bfec2a4ad118f907ce586d0dfd8db7641 作者:蒂姆·加德纳 日期:2011 年 5 月 24 日星期二 17:13:05 -0700 ulimit:将文件数量的默认硬 ulimit 提高到 4096
至少在 RHEL5.4 中是 1024/1024,而在 RHEL6.2 中是 1024/4096。