【问题标题】:Linux Posix Queues Too many files openLinux Posix 队列打开的文件太多
【发布时间】:2014-03-18 04:27:08
【问题描述】:

在我的应用程序中,我有不同的模块通过 posix 队列进行通信,问题是当限制满足时我得到上述错误,我在两个中都设置了限制

sysctl fs.file-max = new_value 

ulimit -n 

但这是一些硬编码的值,是否有任何最佳实践来克服这个问题?我尝试通过mq_close 关闭描述符,但应用程序中的所有模块都可以随时使用任何消息。所以我无法关闭所有描述符。

【问题讨论】:

  • 您可能没有达到总文件描述符限制,而是达到了消息队列数量的限制,这种情况也将返回 ENFILE。前几天你问了一个关于这个的问题。您是否增加了允许的 MQ 数量?
  • 是的,我按照建议做了,但仍然出现错误,我正在寻找解决方法。
  • 目前我正在制作和处理程序,它将保留所有队列描述符并且仅在需要时打开。但这不是一个好方法,对吧?
  • (1) 您采取了哪些步骤? (2) 目前的限制是什么? (3) 您的应用程序/系统使用了多少个队列?如果在此期间没有人帮忙,明天会尝试接机。
  • 您是否打开或打开大量文件?打开有一个限制,比如 254,但打开的限制要高得多。如果队列实现使用 open,它可能会碰到这个。

标签: c++ linux posix


【解决方案1】:

linux/UNIX软限制和硬限制有两种资源限制。您可以设置的最大描述符达到硬限制。有一些方法可以增加硬限制,但坦率地说,我从未尝试过,我也不推荐这样做,原因有两个:

  1. 同时打开过多的描述符会降低程序的性能。
  2. 甚至不需要增加硬限制,因为如果您在程序中正确关闭未使用的描述符,您会发现甚至不需要增加硬限制。想象一下,为每个新请求打开一个新描述符的 Web 服务器也不需要增加硬限制。

最后,我建议您甚至增加软限制,请在您的程序中使用 setrlimit 函数,因为增加对 shell 的限制是暂时的,如果您在配置文件中设置它,它将增加所有程序的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-14
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多