【发布时间】:2014-09-17 07:36:51
【问题描述】:
在 Linux 上,当进程打开文件时,操作系统会检查最大打开文件限制。
如果限制是 1024,这个数字是什么意思?
是否代表
- 进程打开的文件数
- 拥有该进程的用户打开的文件数
- 目前操作系统中所有打开的文件个数?
【问题讨论】:
在 Linux 上,当进程打开文件时,操作系统会检查最大打开文件限制。
如果限制是 1024,这个数字是什么意思?
是否代表
【问题讨论】:
据我了解,这意味着每个用户打开文件(描述符)的最大数量。
编辑: 实际上,limits.conf 为每个用户设置了这个值:
* hard nofile 1024
这意味着对所有用户(所有用户都一样)的硬性限制
或者可以这样设置:
myuser hard nofile 1024
这意味着用户 myuser
的限制为 1024【讨论】:
它是打开文件的数量描述符 每个进程。它们都可以引用同一个文件,也可以引用不同的文件。
您可以在 shell 中使用 ulimit -a 查看当前限制,或者使用 getrlimit 以编程方式查看当前限制。系统范围的限制在/etc/security/limits.conf 中设置。
Linux 上的文件系统对象模型是:
file descriptor -> file description -> dentry -> inode
dup 为相同的文件描述创建一个新的文件描述符。
open 创建一个新的文件描述符和一个文件描述。
【讨论】:
您可以通过ulimit -a 命令查看系统的软限制和硬限制。
任何用户都可以设置软限制,而硬限制只能由 root 更改。限制是过程的属性。它们在创建子进程时被继承,因此应在初始化脚本中的系统初始化期间设置系统范围的限制,并应在用户登录期间设置用户限制,例如使用pam_limits。
机器启动时通常会设置默认值。因此,即使您可以在单个 shell 中重置 ulimit,您也可能会发现它会在重新启动时重置回之前的值。如果要更改默认值,您可能需要 grep 引导脚本以获取存在 ulimit 命令。
如果限制为 1024,则意味着您/进程最多可以打开 1024 个文件。如果超过此限制意味着open、pipe 和dup 系统调用将失败:
RLIMIT_NOFILE:
指定一个比该进程可以打开的最大文件描述符数大一的值。尝试(
open(2)、pipe(2)、dup(2)等)超过此限制会产生错误EMFILE。
【讨论】:
如果是linux,验证输出:
ulimit -a
它会告诉系统中打开文件的数量限制是多少,因为在 linux 中有一种方法可以限制打开文件的数量,并将打开文件的限制设置为无限制,这将解决问题。
【讨论】: