Python过多打开文件,eventlet和multiprocessing.dummy

4
我有一个在Linux上运行的Python 2.7脚本,出现了IOError: [Errno 24] Too many open files的崩溃。当我运行lsof -p <script_pid>查看脚本打开了哪些文件时,我发现anon_inode文件数量在不断增加。
该脚本首先使用eventlet进行并发下载S3中的文件。然后,它使用multiprocessing.dummy进行多线程处理已下载的文件。我将多线程代码独立运行,发现只有在包含以下用于eventlet的monkey patching时才会泄漏文件描述符。
patcher.monkey_patch(thread=False)

任何关于如何解决这个问题的想法都将不胜感激!

1
我在这里注册了您的问题 https://github.com/eventlet/eventlet/issues/197 您能分享一下测试隔离代码吗? 并且,您使用 monkey_patch() 时有遇到任何问题吗? - temoto
谢谢,@temoto!只是monkey_patch()在多线程中引起了严重的问题。我刚刚发现我可以通过import_patched进行有选择地修补 - 你知道eventlet.import_patched('boto.s3.connection')是否足够吗?我想我还没有完全理解需要修补什么。如果这不是一个适当的解决方案,我会发布隔离代码。 - Hélène Martin
选择性补丁通常效果良好。除非目标模块在稍后的某个时间点在函数中进行导入 - 那时它将导入未打补丁的版本。请务必发布您的代码。 - temoto
或许与这个有关:https://dev59.com/6mkw5IYBdhLWcg3wV5ID。 - asmaier
1个回答

1
我也遇到了这个问题,在Ubuntu上,普通用户的打开文件限制默认为4096。因此,如果您要有超过4000个同时连接,您需要增加这个限制。
解决方案:提高打开文件描述符限制。
以下是在Ubuntu上如何实现:
/etc/security/limits.conf的末尾添加一行,例如:
* soft nofile 16384    
* hard nofile 16384

第一列描述了适用限制的用户。*是通配符,表示所有用户。要为root提高限制,必须明确输入'root'而不是'*'。
您还需要编辑/etc/pam.d/common-session*并在末尾添加以下行:
session required pam_limits.so

注销并重新登录后才能使用新的最大限制,使用以下测试。
ulimit -n

https://askubuntu.com/questions/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user

这里还有一篇关于使用eventlets的注意事项的好文章 https://code.mixpanel.com/2010/10/29/gevent-the-good-the-bad-the-ugly/


1
你能发布一些链接中的内容吗? - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接