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

JLT*_*hiu 3 python asynchronous twisted

我正在使用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错误.或者是由创建太多线程查询引起的?

Die*_*Epp 9

"文件"包括网络套接字,它是基于Unix的系统上的一种文件.可以配置最大打开文件数ulimit -n

# Check current limit
$ ulimit -n
256

# Raise limit to 2048
$ ulimit -n 2048
Run Code Online (Sandbox Code Playgroud)

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

  • @phanny:资源限制是从父进程继承的。 (2认同)

dav*_*4jr 6

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

vim /etc/security/limits.conf

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

*         hard    nofile      500000
*         soft    nofile      500000
root      hard    nofile      500000
root      soft    nofile      500000
Run Code Online (Sandbox Code Playgroud)

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