Errno 24:打开的文件太多了。但我不是在打开文件?

时间:2016-09-16 18:13:05

标签: python asynchronous twisted

我正在使用treq(https://github.com/twisted/treq)从我的网络服务查询其他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错误。或者是由于创建过多的线程查询引起的?

2 个答案:

答案 0 :(得分:8)

"文件"包括网络套接字,它是基于Unix的系统上的一种文件。可以使用ulimit -n

配置最大打开文件数
# Check current limit
$ ulimit -n
256

# Raise limit to 2048
$ ulimit -n 2048

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

答案 1 :(得分:1)

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

vim /etc/security/limits.conf

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

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

这将在每个新的终端会话中将限制设置为500000。编辑后,先退出,然后再登录(或者,如果可以的话,请重新启动)。之后,您可以运行ulimit -n确认已正确设置。