ban*_*tic 37 linux bash kernel ulimit
我注意到在我刚从 EC2 启动的新 CentOS 映像上,ulimit 默认值是 1024 个打开的文件,但是 /proc/sys/fs/file-max 设置为 761,408,我想知道这两个限制是如何工作的一起。我猜 ulimit -n 是每个用户的文件描述符数量限制,而 /proc/sys/fs/file-max 是系统范围的?如果是这种情况,假设我已经以同一用户身份登录了两次——每个登录用户的打开文件数是否有 1024 个限制,或者每个登录的用户之间是否有 1024 个组合打开文件的限制——在用户?
如果您的系统从未打开过很多文件,那么将最大文件描述符设置为非常高的数字是否会对性能产生很大影响?
War*_*ner 35
file-max是在内核级别强制执行的最大文件描述符 (FD),如果不增加,所有进程都无法超过。在ulimit强制执行上的工艺水平,其可以是小于file-max。
增加 不会有性能影响风险file-max。现代发行版的最大 FD 设置得相当高,而在过去,它需要内核重新编译和修改才能增加到 1024 以上。除非您有技术需要,否则我不会在系统范围内增加。
每个进程的配置通常需要调整以服务于特定的守护进程,无论是数据库还是 Web 服务器。如果您完全取消限制,该守护进程可能会耗尽所有可用的系统资源;这意味着您将无法解决问题,除非按下重置按钮或重启电源。当然,其中任何一个都可能导致任何打开的文件损坏。
小智 15
ulimit 的限制是针对每个唯一用户。所以user1,无论登录多少次或进程运行多少,都将被限制为1024。它是组合的。
我不确定我是否完全理解那句话的意思(英语不是我的母语)如果这句话意味着文件描述符的 ulimit 配置不是每个进程的限制,那么接受的答案(AFAIK)是错误的。
我的意思是,如果某个用户启动了4个进程并且FD的ulimit配置为1024,那么每个进程可能会打开1024个FD。用户将不限于 1024 个 FD,而是由该用户启动的进程。
例如:
me@superme:~$ ulimit -n
1024
me@superme:~$ lsof | grep $USER | wc -l
8145
Run Code Online (Sandbox Code Playgroud)
这是我们达到限制的 perl 示例(它是每个进程的限制):
#!/usr/bin/perl
$count = 0;
@filedescriptors;
while ($count <= 1024) {
$FILE = ${count};
open $FILE, ">", "/tmp/example$count" or die "\n\n FDs: $count $!";
push(@filedescriptors, $FILE);
$count ++;
}
Run Code Online (Sandbox Code Playgroud)
结果:
FDs: 1021 Too many open files at ./test.pl line 8.
Run Code Online (Sandbox Code Playgroud)
1021 因为在到达 while 循环之前有 3 个打开的文件描述符(stdout、stdin 和 stderr)
对不起,如果我完全错了或者我误解了答案。
| 归档时间: |
|
| 查看次数: |
46406 次 |
| 最近记录: |