ulimit -n和/ proc / sys / fs / file-max有何区别?


32

我注意到在刚从EC2启动的新CentOS映像上,ulimit的默认值为1024个打开的文件,但是/ proc / sys / fs / file-max设置为761,408,我想知道这两个限制是如何工作的一起。我猜测ulimit -n是每个用户的文件描述符数量限制,而/ proc / sys / fs / file-max是系统范围的?如果是这种情况,请说我已经以同一用户身份登录过两次-每个登录用户的打开文件数是否有1024个限制,或者每个登录用户之间限制有1024个合并的打开文件,在用户中?

如果您的系统从未打开太多文件,那么将最大文件描述符设置为很高的数量是否会对性能产生很大影响?


添加的标签:bash linux内核系统资源
Warner

Answers:


28

file-max是在内核级别强制执行的最大文件描述符(FD),如果不增加,则所有进程都不能超过它。在ulimit强制执行上的工艺水平,其可以是小于file-max

通过增加不存在性能影响风险file-max。现代发行版的最大FD设置很高,而在过去,它要求内核重新编译和修改才能增加到1024以上。除非您有技术需要,否则我不会在系统范围内增加。

通常需要调整每个进程的配置以服务特定的守护程序,无论它是数据库还是Web服务器。如果完全删除该限制,则该守护程序可能会耗尽所有可用的系统资源。这意味着您将无法解决问题,除非按下重置按钮或重启电源。当然,其中任何一个都可能导致任何打开的文件损坏。


我的理解正确吗,使用ulimit设置的每个用户限制对所有用户都是相同的吗?是否可以为每个用户使用不同的值?
奥利弗

是的,这些设置既可以全局设置,也可以基于每个用户设置。
华纳

如果我的职位正确,那是不正确的。它是由用户xy生成的每个进程,并且受/etc/sysctl.conf中定义的最大文件系统限制
Jeredepp 2013年

3
ulimit限制是不是每个用户,但每个过程!见unix.stackexchange.com/questions/55319/...
托南

@Tonin-是的,这个答案是错误的。
Nemo

11

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

在下面的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 ++;
}

结果:

FDs: 1021 Too many open files at ./test.pl line 8.

1021因为在到达while循环之前有3个打开的文件描述符(stdout,stdin和stderr)

抱歉,如果我完全错了,或者我误解了答案。


所以,你是对的。@Warner的回应在这种意义上是错误的,因为限制是基于每个进程而不是每个用户的
filipenf 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.