Errno 24:打开的文件太多。但是我没有打开文件?
Errno 24: Too many open files. But I am not opening files?
我正在使用 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" 包括网络套接字,它是基于 Unix 的系统上的一种文件类型。可使用 ulimit -n
配置最大打开文件数
# Check current limit
$ ulimit -n
256
# Raise limit to 2048
$ ulimit -n 2048
运行 超出文件句柄并不得不提高限制也就不足为奇了。但如果限制已经很高,您可能会泄漏文件句柄(关闭它们的速度不够快)。在像 Python 这样的垃圾收集语言中,终结器并不总是足够快地关闭文件,这就是为什么你应该小心使用 with
块或其他系统在你完成后立即关闭文件和他们在一起。
我想以@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
确认设置是否正确。
我正在使用 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" 包括网络套接字,它是基于 Unix 的系统上的一种文件类型。可使用 ulimit -n
# Check current limit
$ ulimit -n
256
# Raise limit to 2048
$ ulimit -n 2048
运行 超出文件句柄并不得不提高限制也就不足为奇了。但如果限制已经很高,您可能会泄漏文件句柄(关闭它们的速度不够快)。在像 Python 这样的垃圾收集语言中,终结器并不总是足够快地关闭文件,这就是为什么你应该小心使用 with
块或其他系统在你完成后立即关闭文件和他们在一起。
我想以@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
确认设置是否正确。