限制文件描述符的数量


34

我正在尝试安装389-ds,它给了我这个警告:

WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.

我了解文件描述符,但不了解软限制和硬限制。

当我跑步时cat /proc/sys/fs/file-max,我回来了590432。这意味着我最多可以打开590432文件(即,最多可以打开590432文件描述符)。

但是当我跑步时ulimit,它给我不同的结果:

$ ulimit
unlimited

$ ulimit -Hn    # Hard limit
4096

$ ulimit -Sn    # Soft limit
1024

但是,硬/软限制来自ulimit什么?它们与存储在其上的数字/proc/sys/fs/file-max有何关系?

Answers:


39

根据内核文档/proc/sys/file-max是在阻塞之前内核将分配的文件描述符的最大总数。这是内核的限制,而不是当前用户的限制。因此,如果您一个人在空闲系统上(单用户模式,没有守护程序在运行),则可以打开590432。

请注意,文档已过期:文件已存在proc/sys/fs/file-max很长时间了。感谢Martin Jambon指出这一点。

此处在SE上回答了软限制和硬限制之间的差异。您可以提高或降低普通用户的软限制,前提是您不超出硬限制。您还可以降低硬性限制(但是您无法在该过程中再次提高硬性限制)。作为超级用户,您可以提高和降低硬限制和软限制。双重限制方案用于实施系统策略,但也允许普通用户为自己设置临时限制,然后再更改它们。

请注意,如果您尝试将硬限制降低到软限制以下(并且您不是超级用户),您将获得EINVAL(无效参数)。

因此,在您的特定情况下ulimit(与相同ulimit -Sf),您对shell及其子进程写入的文件大小没有软限制。(在大多数情况下,这可能是个好主意)

您的其他调用,ulimit -Hn在报告-n限值(打开的文件描述符的最大数量),没有-f限制,这就是为什么软限制似乎比硬限制高。如果您输入ulimit -Hf,还将得到“无限”。


14
在Linux 4.4.0上,最大文件路径为/proc/sys/fs/file-max
Martin Jambon

硬限制ulimit -Hn 是否将系统的最大限制限制为分配的文件描述符功能?
Webwoman

2
@Webman:不,不是。ulimit仅影响当前过程的限制。当前进程的限制也被继承给子进程,但是每个进程都有一个单独的计数。例如,使用ulimit -Hn 10,您一次只能打开10个文件描述符。您创建的每个子进程也最多只能有10个文件描述符。设置后,只有超级用户可以增加限制。如果将其设置得太低,则唯一的选择可能是终止外壳程序进程并开始一个新的进程。
Alexios

0

“选择”系统调用是unix的许多糟糕的设计决策之一,它甚至使windows95看起来仍然很棒。

它应该在20年前被禁止,然后到现在我们可能可以无限制地限制文件处理程序。

您可以使用内核配置轻松地增加文件描述符的数量,而ulimit则要记住,请记住,如果任何库使用“选择”系统调用,您的程序将变得不稳定(内存损坏)并失败。

Select只能处理0到1023之间的文件描述符,如果您提供一个更大的值,它将随机在您的内存中戳入,并且select永远不会重复该描述符。不幸的是,许多库都使用select。


您的评论是一个有用的警告,但是引用fd_set(3)手册页并且限制来自,而不是大声疾呼FD_SETSIZE。而最好的将是一个替代电话等的建议poll(3),在此答案
达沃尔Cubranic
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.