我们如何将文件描述符限制为始终小于 1024?

Posted

技术标签:

【中文标题】我们如何将文件描述符限制为始终小于 1024?【英文标题】:How can we limit file descriptor to always be less than 1024? 【发布时间】:2021-12-27 16:15:36 【问题描述】:

select 系统调用存在限制,超过 1024 后将无法工作。这是文档所说的

WARNING: select() can monitor only file descriptors numbers that
       are less than FD_SETSIZE (1024)—an unreasonably low limit for
       many modern applications—and this limitation will not change.
       All modern applications should instead use poll(2) or epoll(7),
       which do not suffer this limitation.

我们仅在 AWS EC2 实例中遇到过这种行为。 AWS fd 之外总是

Linux系统(Suse Linux 15 SP2)中是否有设置总是会创建fds

【问题讨论】:

我不这么认为,您是否考虑过使用poll 作为警告提示?另外,为什么要使用 AWS 标签? 谢谢,我知道民意调查是另一种选择。是的,我们仅在 AWS EC2 实例中遇到过这种行为。 AWS fd 之外总是 是的,我们只在 AWS EC2 实例中遇到过这种行为。在 AWS fd 之外总是您可以将其添加到问题中。 注意问题Are there any platforms where using structure copy on an fd_set (for select() or pselect()) causes problems? 你怎么能强迫它?如果低 ID 已经被占用了怎么办?你能做的最好的就是在你的程序中比较它,如果它更高就失败。 【参考方案1】:

你不想这样做。 Linux 总是使用尽可能低的文件描述符。因此,如果您得到文件描述符 1024,则意味着文件描述符 0 到 1023 都已被使用。

如果你让 Linux 只使用文件描述符 0-1023,那么你的程序仍然无法工作,因为你会得到一个错误,说它没有更多的文件描述符可以使用,而不是获取文件描述符 1024 .

你应该:

    确保您的程序在处理完文件描述符后关闭它们。 也许描述符 0-1023 都被使用的原因是因为你忘了关闭它们。很多人确定您的程序会关闭它们。 如果它们是您的程序实际使用的真实文件描述符,而不仅仅是您忘记关闭的文件描述符,那么继续执行第 2 步... 使用poll 而不是select,如文档所述。这不是一个困难的改变。 考虑使用epoll,当您同时轮询大量文件描述符时,它比select 更有效。但是,它要复杂得多。

【讨论】:

以上是关于我们如何将文件描述符限制为始终小于 1024?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Winston 限制为每个日志文件只有 1 个文件描述符

linux fopen个数限制的问题(文件描述符限制)

Rabbitmq 文件描述符限制

如果我有一个表中始终为空的 mssql varchar[1024],那么将浪费多少实际字节?

Firebase DB:应用程序打开了太多文件。一个进程中可用文件描述符的最大值默认为 1024

多路复用epoll