Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C库中的文件句柄泄漏(可能)会给NFS带来麻烦(+;python,但这是偶然的)_Python_File_Nfs_Resource Leak - Fatal编程技术网

C库中的文件句柄泄漏(可能)会给NFS带来麻烦(+;python,但这是偶然的)

C库中的文件句柄泄漏(可能)会给NFS带来麻烦(+;python,但这是偶然的),python,file,nfs,resource-leak,Python,File,Nfs,Resource Leak,这是一个很酷的问题 我有一个python脚本(main),它调用一个python模块(foo.py),该模块反过来调用另一个python模块(barwrapper.py),使用LoadLibrary动态打开和访问libbar.so库 libbar和整个链的其余部分打开并创建文件以执行其任务。当我们在python主脚本中发出rmtree以摆脱导入模块创建的临时目录时,问题就出现了。rmtree在脚本结束时,即退出之前被调用。调用失败,因为该目录包含.nfs任何隐藏文件,我猜这些文件是已删除的文件。

这是一个很酷的问题

我有一个python脚本(main),它调用一个python模块(foo.py),该模块反过来调用另一个python模块(barwrapper.py),使用LoadLibrary动态打开和访问libbar.so库

libbar和整个链的其余部分打开并创建文件以执行其任务。当我们在python主脚本中发出rmtree以摆脱导入模块创建的临时目录时,问题就出现了。rmtree在脚本结束时,即退出之前被调用。调用失败,因为该目录包含
.nfs任何
隐藏文件,我猜这些文件是已删除的文件。这些文件显然在代码中保持打开状态,迫使nfs将它们移动到这些
.nfs文件中,直到释放文件描述符。这种情况在其他文件系统中不会出现,因为与保留的描述符相关联的文件会被有效地删除,但在关闭描述符之前,内核会一直保持对这些文件的访问

我们强烈怀疑.so库正在泄漏文件描述符,这些未关闭的文件在清理时破坏了rmtree。我曾考虑过在barwrapper中卸载.so文件,但显然没有办法,而且我不确定dynloader是否真的会从进程空间中删除lib并关闭描述符,或者只是将其标记为已卸载,就这样,等待被其他东西替换,但描述符泄漏了


我真的想不出解决这个问题的其他方法(除了修复漏洞,这是我们不想做的事情,因为它是第三方库)。显然,这只发生在nfs上。你知道我们可以尝试修复它吗?

好的解决方案是修复句柄泄漏,但如果你不确定谁在泄漏,也许打个电话可以帮助你定位泄漏并将错误提交给第三方库的维护人员(如果是开源库,最好提交补丁;)


另一方面,nfs分区上的umount/mount可能有助于强制关闭句柄。

内核跟踪文件描述符,因此即使让python卸载.so并释放内存,它也不知道如何关闭泄漏的文件描述符。我想到的唯一一件事是导入.so,在分叉之后,并且只有在分叉的子进程退出(并且文件句柄在内核退出时隐式关闭)之后才进行清理。

我无法卸载集群的主分区。在任何情况下,.nfs文件都不是永久的。当我的应用程序结束时,当文件描述符被释放,内核可以释放文件(我猜,同步nfs状态)时,它们就会消失。