24

我编写了一种文件密集型测试套件。一段时间后(2 小时),我得到一个IOError: [Errno 24] Too many open files: '/tmp/tmpxsqYPm'. 我仔细检查了所有文件句柄是否再次关闭它们。但是错误仍然存​​在。

我试图找出允许使用的文件描述符resource.RLIMIT_NOFILE的数量以及当前打开的文件描述符的数量:

def get_open_fds():

    fds = []
    for fd in range(3,resource.RLIMIT_NOFILE):
            try:
                    flags = fcntl.fcntl(fd, fcntl.F_GETFD)
            except IOError:
                    continue

            fds.append(fd)

    return fds

因此,如果我运行以下测试:

print get_open_fds()
for i in range(0,100):
    f = open("/tmp/test_%i" % i, "w")
    f.write("test")
    print get_open_fds()

我得到这个输出:

[]
/tmp/test_0
[3]
/tmp/test_1
[4]
/tmp/test_2
[3]
/tmp/test_3
[4]
/tmp/test_4
[3]
/tmp/test_5
[4] ...

这很奇怪,我预计打开的文件描述符数量会增加。我的脚本正确吗?

我正在使用 python 的记录器和子进程。这可能是我的 fd 泄漏的原因吗?

谢谢,丹尼尔

4

3 回答 3

14

更正后的代码是:

import resource
import fcntl
import os

def get_open_fds():
    fds = []
    soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
    for fd in range(0, soft):
        try:
            flags = fcntl.fcntl(fd, fcntl.F_GETFD)
        except IOError:
            continue
        fds.append(fd)
    return fds

def get_file_names_from_file_number(fds):
    names = []
    for fd in fds:
        names.append(os.readlink('/proc/self/fd/%d' % fd))
    return names

fds = get_open_fds()
print get_file_names_from_file_number(fds)
于 2012-11-29T11:08:22.357 回答
13

您的测试脚本会覆盖f每次迭代,这意味着文件每次都会关闭。记录到文件和subprocess使用管道都会用完描述符,这可能会导致耗尽。

于 2010-12-08T10:36:55.650 回答
10

resource.RLIMIT_NOFILE 确实是 7,但这是对 resource.getrlimit() 的索引,而不是限制本身... resource.getrlimit(resource.RLIMIT_NOFILE) 是您想要的 top range()

于 2010-12-20T20:47:14.587 回答