2015-02-09 50 views
2

我有一個Python腳本2.7在Linux上運行,與IOError: [Errno 24] Too many open files崩潰。當我運行lsof -p <script_pid>以查看腳本已打開的文件時,我看到的文件數量不斷增加anon_inode。使用eventlet併發從S3Python中打開的文件太多,eventlet和multiprocessing.dummy

此腳本首先下載文件。然後使用multiprocessing.dummy處理下載的文件進行多線程。我已經運行在隔離的多線程代碼,發現它只是泄漏文件描述符,當我包括以下猴子打補丁eventlet:

patcher.monkey_patch(thread=False) 

對我怎麼能解決這個任何想法,將不勝感激!

+1

我註冊了您的問題在這裏https://github.com/eventlet/eventlet/issues/197 將您共享隔離代碼測試? 你是否遇到過只有'monkey_patch()'的問題? – temoto 2015-02-09 22:02:32

+0

謝謝,@temoto!只是monkey_patch()引起了多線程的嚴重問題。我剛剛發現我可以有選擇地使用import_patched修補 - 你知道eventlet.import_patched('boto.s3.connection')是否足夠嗎?我想我不完全明白需要修補的東西。如果這不是一個合適的修復,我會發布隔離代碼。 – 2015-02-09 22:25:44

+0

選擇性補丁一般效果很好。除了目標模塊在一段時間後在功能中導入時 - 它將導入未修補的版本。請繼續發佈您的代碼。 – temoto 2015-02-11 14:23:40

回答

0

我也是在Ubuntu上運行到這個問題,至少對普通用戶默認打開的文件限制爲4096。所以,如果你將有超過〜4000個,你需要將這個了同時連接。

解決方案擡起打開文件描述符限制

這裏是如何做到這一點在Ubuntu

添加一行結束的在/etc/security/limits.conf

* soft nofile 16384  
* hard nofile 16384 

第一欄描述世界衛生組織的限制是應用fo河*是通配符,表示所有用戶。爲了提高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/

+0

你能從鏈接發佈一些內容嗎? – Robert 2015-05-01 14:48:26