如何在Linux中更改打开文件限制数量?

217

当运行我的应用程序时,有时会出现一个关于“打开文件太多”的错误。

运行ulimit -a报告限制为1024。如何将限制增加到1024以上?

编辑ulimit -n 2048导致权限错误。


请参考以下内容关于编程的相关问题:https://unix.stackexchange.com/a/8949/231660 - Guy Avraham
我刚在Centos 7上经历了这个问题(在RHEL上也是一样的),并写了一篇博客来覆盖它,因为即使有这些帖子,我仍然遇到了很多麻烦:https://coding-stream-of-consciousness.com/2018/12/21/centos7-and-rhel7-increasing-open-file-descriptors-process-limits/. 通常,除了打开文件之外,您还需要增加nproc,它实际上驻留在多个设置文件中...如果您使用systemd/systemctl,则具有其自己的单独设置。 这有点疯狂。 - John Humphreys
如果您在Linux上使用VSCode,这个解决方法可能会有所帮助:https://dev59.com/K1QJ5IYBdhLWcg3wZlGZ#55027686 - Juri Sinitson
a-bars在GeeksForGeeks.com上尝试解决这个问题时,linus关闭了这个问题。 - undefined
4个回答

168

你可以尝试执行 ulimit -n 2048 命令。这将仅重置当前 shell 的限制,并且您指定的数量不能超过硬限制。

每个操作系统都在配置文件中设置不同的硬限制。例如,Solaris 上的硬打开文件限制可以在 /etc/system 启动时设置。

set rlim_fd_max = 166384
set rlim_fd_cur = 8192

在OS X系统中,必须将相同的数据设置在/etc/sysctl.conf文件中。

kern.maxfilesperproc=166384
kern.maxfiles=8192

在Linux下,这些设置通常位于/etc/security/limits.conf。

有两种限制:

  • 软限制是当前强制执行的限制。
  • 硬限制是不能通过设置软限制超过的最大值。

任何用户都可以设置软限制,而只有root用户才能更改硬限制。限制是进程的属性,当创建子进程时,它们会被继承。因此,在系统初始化时应该设置系统范围内的限制,例如在init脚本中设置,而在用户登录时应该设置用户范围内的限制,例如使用pam_limits。

通常在计算机启动时会设置默认值。因此,即使您在单个shell中重置了ulimit,您可能会发现它在重新启动后恢复到先前的值。如果要更改默认值,您可能需要使用grep命令搜索启动脚本是否存在ulimit命令。


4
你能告诉我如何在Windows中使用这个吗? - Pritam
@hoyhoy,我可以将它更改为“2048”,但为什么不能更改为“4500”?请参见此处 - alhelal
@GaneshKrishnan,您提到的Linux文件中应该添加什么? - aviral sanjay
1
@Pritam Windows系统没有任何ulimit。您必须指定您正在使用的系统(例如WSL,Cygwin)。 - Melebius

113
如果你正在使用Linux系统且出现了权限错误,你需要在/etc/limits.conf/etc/security/limits.conf文件中增加允许的限制(该文件的位置取决于你使用的Linux发行版)。
例如,如果要让机器上的任何人将其打开的文件数增加到10000,则需在limits.conf文件中添加以下内容: * hard nofile 10000 然后注销并重新登录系统,就可以执行以下命令而无需获得权限错误: ulimit -n 10000

9
注意:通配符 不适用于“root”用户。如果您想调整“root”限制,您必须指定“root hard nofile 10000”。 - Joshua Pinter
2
@JoshPinter 哈哈,我刚刚花了过去3个小时左右的时间浏览了每一个关于如何更改ulimit的教程,最终发现我已经以root身份登录。这就是为什么我一直看到ulimit -a中的1024。我更改了通配符,并在limits.conf中添加了一个*。现在一切都好了,(我正在使用ssh密钥,不用担心:P)--谢谢!!! - NiCk Newman
1
@NiCkNewman 很高兴你对此感到开心!这是程序员/系统管理员身上的好品质。我也曾经犯过同样的错误,但并没有像你这样开心。很高兴能帮到你! :) - Joshua Pinter
补充:您还可以在此目录中找到配置文件:/etc/security/limits.d/ - Waldemar Wosiński
3
我第一次打开了 /etc/security/limits.conf 文件并发现所有内容都被注释掉了。那么 "hard nofile" 的默认值是多少? - ka3ak
我正在使用Ubuntu-18.04,我发现在更改了/etc/security/limits.conf后,我必须重新启动系统才能使其生效。 - MSharq

41

1) 将以下行添加到/etc/security/limits.conf

webuser hard nofile 64000

然后以webuser身份登录

su - webuser

2)编辑以下两个文件,以针对webuser进行操作:

通过运行以下命令,向.bashrc和.bash_profile文件追加内容:

echo "ulimit -n 64000" >> .bashrc ; echo "ulimit -n 64000" >> .bash_profile

3) 登出,重新登录并验证更改是否已正确执行:

$ ulimit -a | grep open
open files                      (-n) 64000

就是这样,然后轰,轰轰轰。


10
如果你将limits.conf文件中的行从“hard”改为“soft”,那么它应该成为新的默认设置,不需要更改bash配置文件。 - RishiD
似乎你在重复额外的步骤。仅设置限制就可以实现与配置文件相同的效果,但适用于所有会话。 - Eddie

8
如果您的一些服务受到了ulimits的限制,有时将适当的命令放入服务的init脚本中会更容易。例如,当Apache报告以下错误时:
[alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread
请尝试在/etc/init.d/httpd中添加ulimit -s unlimited命令。这不需要重启服务器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接