【问题标题】:Errno 24: Too many open files. But I am not opening files?Errno 24:打开的文件太多。但我没有打开文件?
【发布时间】:2017-01-25 01:13:56
【问题描述】:

我正在使用 treq (https://github.com/twisted/treq) 从我的 Web 服务中查询其他一些 API。今天在对自己的服务做压力测试的时候,报错了

twisted.internet.error.DNSLookupError: DNS lookup failed: address 'api.abc.com' not found: [Errno 24] Too many open files.

但问题是,我的整个代码都没有打开任何文件。我怀疑这可能是由我查询的 api 出现故障或阻止我(api.abc.com)引起的,因为我的压力测试可能就像对那个端点的 ddos​​。不过,在那种情况下,那不应该是拒绝连接之类的东西吗?我不知道为什么会有Too many open files 错误。还是创建过多的线程查询造成的?

【问题讨论】:

  • "files" 真正的意思是文件描述符,包括套接字之类的东西,所以如果你打开很多连接,你仍然可能遇到这个问题

标签: python asynchronous twisted


【解决方案1】:

“文件”包括网络套接字,它是基于 Unix 的系统上的一种文件。最大打开文件数可通过ulimit -n进行配置

# Check current limit
$ ulimit -n
256

# Raise limit to 2048
$ ulimit -n 2048

文件句柄用完而不得不提高限制并不奇怪。但是如果限制已经很高,您可能会泄漏文件句柄(没有足够快地关闭它们)。在像 Python 这样的垃圾收集语言中,终结器并不总是足够快地关闭文件,这就是为什么你应该小心使用 with 块或其他系统在完成文件后立即关闭它们。

【讨论】:

  • 看起来ulimit 是特定于特定终端的。是吗?我的ulimit 是 1024。我在终端中将其设置为 5000,但在所有其他终端中仍显示 1024,但我将其设置为 5000 的终端除外。
  • @phanny:资源限制继承自父进程。
【解决方案2】:

我想以@Dietrich Epp 的回答为基础。设置 ulimit -n 将仅更改该终端的电流限制。如果您想更改此限制,使其存在于所有终端会话中(例如在 EC2 上),您需要编辑:

vim /etc/security/limits.conf

并为每个用户的打开描述符数量添加软限制和硬限制。例如,您可以将此 sn-p 粘贴到上面的文件中:

*         hard    nofile      500000
*         soft    nofile      500000
root      hard    nofile      500000
root      soft    nofile      500000

这会将每个新终端会话的限制设置为 500000。编辑后,注销然后重新登录,(或者如果可以,最好重新启动)。之后,您可以运行ulimit -n 以确认它已正确设置。

【讨论】:

  • 为什么默认值这么低?给ulimit设置一个高值有什么缺点吗?
  • @ddzzbbwwmm 老实说,这真的取决于您的应用程序是什么。一些应用程序依赖大量打开的连接来完成它们的任务,而大多数任务在默认情况下都很好。为 ulimit 设置一个高值的缺点是它掩盖了本来可以捕获的问题,例如使用大量资源的流氓进程。它充当一种保护措施。只要您了解您的应用程序并且可以监控事物,它就会是一个有用的设置。
猜你喜欢
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多