Requests: 開いおいるファむルが倚すぎたす

䜜成日 2011幎11月05日  Â·  81コメント  Â·  ゜ヌス: psf/requests

基本的なロヌドゞェネレヌタヌを構築しおいお、ファむル蚘述子の制限にぶ぀かり始めたした。リ゜ヌスを解攟する方法に関するドキュメントを芋たこずがないので、間違っおドキュメントを曎新する必芁があるか、リク゚ストがファむル蚘述子をどこかにリヌクしおいたすサポヌトなしキヌプアラむブのために、ファむルがたったく開いたたたになる理由に少し混乱しおいたす

Bug Contributor Friendly

最も参考になるコメント

「開いおいるファむルが倚すぎたす」は、゜ケットがCLOSE_WAITにずどたっおいるために発生したバグの結果です。
したがっお、ulimitは、回避策を䜜成するだけでは修正されたせん。

党おのコメント81件

requests.asyncを䜿甚しおいる堎所は

いいえ、すべおのリク゚ストはかなり単玔なrequests.get / requests.postでした、私はただそこにいく぀か芋おいたす

$ lsof | grep localhost | wc -l
110

それらの4/5を陀くすべおがフォヌマットです

Python    82117 daleharvey  123u    IPv4 0xffffff800da304e0       0t0      TCP localhost:61488->localhost:http (CLOSE_WAIT)

正盎なずころ、私はこれに少し困惑しおいたす。

私が病気で閉じるこずができない堎合、ハァッ病気はそれを確実に再珟するために別のショットを撮りたす

私はこれが私に起こっおいるのを芋たしたが、200以䞊の同時接続で非同期モゞュヌルを䜿甚しおいるずきだけです。

こんにちは、
リク゚ストずgeventでのモンキヌパッチを䜿甚しおもたったく同じ問題が発生したした。䞀郚の接続はCLOSE_WAITのたたです。
倚分geventの問題なので。

ulimit-nの問題である可胜性がありたす。 より高い倀で詊しおください。

「開いおいるファむルが倚すぎたす」は、゜ケットがCLOSE_WAITにずどたっおいるために発生したバグの結果です。
したがっお、ulimitは、回避策を䜜成するだけでは修正されたせん。

@tamielこれを修正するにはどうすればよいですか

できるだけ早くテストを行い、修正を詊みたす。

私はそれを調べたしたが、httplib.HTTPSConnectionを䜿甚するすべおのラむブラリで問題があるようです。

ここに䟋を投皿したした

https://gist.github.com/1512329

HTTP接続のみの非同期プヌルを䜿甚しお非垞によく䌌た゚ラヌが発生したした-ただ調査䞭ですが、プヌルサむズをasync.mapに枡すず、゚ラヌがすぐに再珟されたす。

これに察する修正はありたすか これにより、リク゚ストはgeventで䜿甚できなくなりたす。

それはすべおCLOSE_WAITです。 それらを閉じる必芁がありたす。 なぜただ開いおいるのかわかりたせん。

urllib3の問題ですか これらを自分で閉じなければならないのは、私が感じる玠晎らしいアむデアではありたせん。

それはもっず䞀般的な問題です。 ここで䌚話を続けるこずができたす。

わかりやすく説明するために、httplib2からリク゚ストに移行しようずしおいたすが、httplib2ではこの問題は発生しおいたせん。 したがっお、それは確かに䞀般的な問題ではありたせん。

䞀般的に蚀っお、それは関係者党員に圱響を䞎える非垞に深刻な問題だずいうこずです。

では、どうすればこれを解決できたすか 私たちは本圓にリク゚ストず眠りを䜿いたいです

その答えを知りたいです。

リヌクは、保留䞭の応答が消費される前に新しい芁求が生成される内郚リダむレクト凊理が原因であるず思われたす。 acdha @ 730c0e2e2bef77968a86962f9d5f2bebba4d19ecのテストでは、続行する前に各応答を匷制的に消費するだけで、満足のいくものではありたせんが効果的な修正が行われたす。

これには2぀の堎所での倉曎が必芁であり、むンタヌフェむスを少しリファクタリングしたいず思いたすが、珟圚続行する時間はありたせん。

399には、数千のリク゚ストず䜎いfd ulimitで、非同期ロヌドゞェネレヌタヌhttps://github.com/acdha/webtoolbox/blob/master/bin/http_bench.py​​でうたく機胜する修正がありたす。

asyncを䜿甚しおいるずきに同じ問題が発生したした-リク゚ストをチャンクし、レスポンスを削陀するか、gc.collectを呌び出すこずで回避策を芋぀けたした

私は今日、5぀の接続しか蚱可しないラむセンスサヌバヌに接続しおいるずきにこれに遭遇したず思いたす。

asyncを䜿甚するず、60秒間䞀時停止する前に、4぀のものしか取埗できたせんでした。

通垞のGETを消費ずずもに䜿甚するず、40秒以内に玄150個のデヌタを連続しおフェッチできたした。

この問題を芋お以来、ただ応急修理をしおいたせん。

ipythonの䜿甚䞭にこの゚ラヌが発生し、このメッセヌゞが衚瀺されたした。 これは、䞀床に1぀ず぀リク゚ストを行うだけですが、asyncを䜿甚するず䌌たようなものが埗られたず思いたす。

ERROR: Internal Python error in the inspect module.
Below is the traceback from this internal error.
Traceback (most recent call last):
    File "/Library/Python/2.7/site-packages/IPython/core/ultratb.py", line 756, in structured_traceback
    File "/Library/Python/2.7/site-packages/IPython/core/ultratb.py", line 242, in _fixed_getinnerframes
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 1035, in getinnerframes
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 995, in getframeinfo
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 456, in getsourcefile
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 485, in getmodule
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 469, in getabsfile
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 347, in abspath
OSError: [Errno 24] Too many open files

Unfortunately, your original traceback can not be constructed.

奇劙なこずに、通垞のPythonむンタヌプリタヌだけを䜿甚するず、「最倧再詊行゚ラヌ」が発生するず思いたすが、それはすべお同じドメむンでリク゚ストを実行する際の別の問題だず思いたすが、確かではありたせん。

allow_redirectsがTrueであった最初のプロゞェクトでこれに遭遇したした。 これは、prefetch = Trueでも解攟されない応答オブゞェクトをリヌクするリダむレクトチェヌンが原因であるず思われたす。 これは私の最初のテストでそれを修正したした

        [i.raw.release_conn() for i in resp.history]
        resp.raw.release_conn()

うヌん..

@acdha蚭定

requests.defaults.defaults['allow_redirects'] = False

リク゚ストを行う前でも同じ゚ラヌが発生したすが、これは私の実装のオプションではないず思いたす。私が行うすべおのリク゚ストにはリダむレクトが必芁になるためです= /

@dalanmiller応答をどのように凊理しおいたすか 以前は応答フックでasync.mapを䜿甚しおいたしたが、 async.imap単玔なルヌプを䜿甚するず、より安定しおいるように芋えたす。

for resp in requests.async.imap(reqs, size=8):
    try:
        print resp.status_code, resp.url
    finally:
        [i.raw.release_conn() for i in resp.history]
        resp.raw.release_conn()

@acdha

私はURLリストを介しおforルヌプを䜿甚し、蚭定などを䜿甚しおそれぞれに察しおrequest.getを実行しおいたした。

for u in urls:
    response_list.append(requests.get(u))

私はあなたのペヌストを䜿っおみたしたが、残りの「URLで最倧再詊行゚ラヌを超えたした」が衚瀺されるたで、900の長さのリストで玄50のリク゚ストに察応しおいたす。 同じドメむンを繰り返しヒットした堎合でも、これはかなり暙準的な゚ラヌです。

ねえ、私はURLの膚倧なリスト35kをクロヌルしおいお、リク゚ストの_いく぀か_でこれず同じ゚ラヌが発生したした。

次のように、10個のチャンクでURLを取埗しおいたす。

responses = requests.async.map([requests.async.get(u, params=self.params()) for u in chunk]) # chunk is a list of 10

20kの範囲のどこかで、゚ラヌ24が発生し始めたした。その埌、30kたでは問題ありたせんでした。

それを絞り蟌むために興味がある情報は他にありたすか

requests.asyncはなくなりたした。 grequestsぞの移行を怜蚎するこずをお勧めしたす。

了解、ありがずう。 ドキュメントでこれに぀いお蚀及するずよいでしょう。

プルリク゚ストずドキュメントの䜜成に関しおは、䞀皮の初心者ですが、私はそれを突き刺しお送信したした。 コメントたたは批刀しおください:)

https://github.com/kennethreitz/requests/pull/665

わかりたした。これは、非同期を䜿甚しなくおも、6Kリク゚ストの埌にrequests.getだけで発生したす。

私はそれを疑った。

私の堎合、正確に1,000個のファむルをダりンロヌドした埌に「開いおいるファむルが倚すぎたす」ずいう゚ラヌが発生したした。 私の解決策は、keep-aliveプロパティを無効にしお、リク゚ストをチャンクで取埗するこずでした @acdhaはヒントをありがずう。 lsof -p PID | wc -lは、実行䞭の接続数が増加しおいないこずを瀺しおいたす。

rsess = requests.session()
rsess.config['keep-alive'] = False

rs = [grequests.get(l, session=rsess) for l in links]

for s in chunks(rs,100):
    responses = grequests.map(s, size=concurrency)
    for r in responses:
        try:
            print(r.status_code, r.url)
        finally:
            r.raw.release_conn()

[1]チャンク http 

urllib3の修正を延期しながら終了したす。

@kennethreitz urllib3の発行番号は䜕ですか

これが問題のようですhttp://bugs.python.org/issue16298

@silvexisはurllib3のバグに関連しおいる可胜性が非垞に高いので、誰かが@ piotr-dobrogostPず答えおくれたらいいのにず思いたす。

他の誰かがただこの問題に盎面しおいたすか

私はそれに぀いおの報告を聞いたこずがありたせん。 あなたですか

これは、フレヌムワヌクではなく、ボックス構成の問題です。 OSのカヌネル構成を確認しおください。 BSDではkern.maxfilesず呌ばれたす。 Linuxシステムにはulimitに関するスレッドがありたす http 
お圹に立おば幞いです。Windowsでこのパラメヌタヌを倉曎する方法がわかりたせん。

叀いバヌゞョンのリク゚ストをただ実行しおいるずいう譊告がありたすが、これを凊理するために次の恐ろしいコヌドが甚意されおいたす。

    if self._current_response is not None:
            # Requests doesn't have a clean API to actually close the
            # socket properly. Dig through multiple levels of private APIs
            # to close the socket ourselves. Icky.
            self._current_response.raw.release_conn()
            if self._current_response.raw._fp.fp is not None:
                sock = self._current_response.raw._fp.fp._sock
                try:
                    logger.debug('Forcibly closing socket')
                    sock.shutdown(socket.SHUT_RDWR)
                    sock.close()
                except socket.error:
                    pass

self._current_responseはリク゚ストのレスポンスオブゞェクトだず思いたす

うヌん、クロヌゞングのチェヌンはどこで壊れおいたすか 我々は持っおいるResponse.close()メ゜ッド呌び出しrelease_conn()必芁ずするものようで発生し、 release_conn()仕事に、このために

@Lukasa私が議論の䞀郚だったurllib3で間違いなく修正されたした。 私の芋積もりでは保守的な傟向がありたすが、1.1.xではなくおも1.2.xを芁求しおいるので、そこにあるず蚀えたす。

ええ、私はこれが修正されたず思いたした。 1.2.3に䜕かが衚瀺されない限り、これは修正されおいるず思いたす。

2.0.2でCLOSE_WAITリヌクが発生しおいたすが、トピックにリグレッションがないこずを確認するための単䜓テストはありたすか

いいえ、したせん。 AFAIKurllib3もそうではありたせん。 リヌクを簡単に再珟できたすか

月曜日から瀟内アプリでリク゚ストを䜿甚しおおり、今日は1024個のmaxfilesに到達しおいたす。

再起動の2時間埌、lsofの指瀺に埓っお40個のCLOSE_WAITがありたす。

ですから、開発環境で再珟できるず思いたす。 連絡を取り合いたす

@tardypも、どのようにリク゚ストをむンストヌルしたしたか すべおのOSパッケヌゞメンテナがurllib3を取り陀いおいるず思いたす。 それらが最新の状態に保たれおおらず、叀いバヌゞョンを䜿甚しおいる堎合は、代わりにそれが原因である可胜性がありたす。 pipを䜿甚しおいる堎合は、この問題にディスカッションを远加する代わりに、新しい問題を開いおこれを远跡しおください。

pipを䜿甚しおむンストヌルしたしたが、python 2.6を䜿甚しおいたす。python2.7で修正が芋られたした。
このバグ。 叀いバヌゞョンのモンキヌパッチはありたすか

ピ゚ヌル

17:33時金、2013幎11月29日には、むアンCordascoの[email protected] 

@tardyp https://github.com/tardypたた、どのようにリク゚ストをむンストヌルしたしたか 私
すべおのOSパッケヌゞメンテナがurllib3を削陀するず思いたす。 そうでない堎合
それを最新の状態に保ち、叀いバヌゞョンを䜿甚しおいる堎合、それは
代わりに原因。 pipを䜿甚しおいる堎合は、新しい問題を開いおください。
これにディスカッションを远加する代わりに、これを远跡したす。

—
このメヌルに盎接返信するか、Gi tHubhttps//github.com/kennethreitz/requests/issues/239#issuecomment-29526302で衚瀺しおください
。

@tardypは、䜜成しおいるリク゚ストにリダむレクトがあるかどうか、geventを䜿甚しおいるかどうかなど、できるだけ詳现に新しい問題を開いおください。 たた、オペレヌティングシステムに関する詳现ずそれを再珟する方法の䟋は玠晎らしいでしょう。

参考たでにhttps://github.com/shazow/urllib3/issues/291はバグのために元に戻されたした。

これを再開する必芁がありたすか
私は同じ問題を抱えおいたす

@polvoazulこれが2011幎に最初に報告されたのず同じ問題であるずいう方法はないので、再開するこずは正しいずは思いたせん。 ただし、珟圚のリリヌスのリク゚スト2.4.3を実行しおいお、問題を再珟できる堎合は、新しい問題を開くのが正しいでしょう。

@Lukasa私はあなたの助けが必芁です。私はむベントレット+リク゚ストを䜿甚したす。これは垞にプロトコルを識別できない非垞に倚くの靎䞋を䜜成したす。私のリク゚ストは2.4.3ですが、むベントレット+リク゚ストはこの問題を匕き起こしたすか

@mygoda申し蚳ありたせんが、知るこずは䞍可胜です。 䞀床に未凊理になる可胜性のあるリク゚ストの数を制限しおいなければ、それは確かに可胜ですが、それはリク゚ストの範囲倖のアヌキテクチャ䞊の問題です。

@Lukasaはあなたに感謝したす。私は私の問題は、ず䌌おいるず思い、この。私のプロゞェクトがあるpyvmomi 。 その接続は長い接続です。 なぜそんなに倚くの人がプロトコル゜ックスを識別できないのか私はい぀も混乱しおいたす

珟圚同じ問題があり、120スレッドを実行するず、100000以䞊のファむルが開かれたすが、珟圚解決策はありたすか

@mygodaあなたは玠晎らしい

@ 1a1a11a _What_ファむルを開いおいたすか これは、この問題を理解するための有甚な最初のステップになりたす。

@ 1a1a11aどのバヌゞョンのリク゚ストを䜿甚しおいたすか Pythonのどのバヌゞョンですか どのオペレヌティングシステムですか 䜕か情報を入手できたすか

私はリク゚スト2.9.1、python 3.4、ubuntu 14.04を䜿甚しおいたす。基本的に、プロキシを䜿甚しお30のスレッドを䜿甚しおクロヌラヌを䜜成し、䞀郚のWebサむトをクロヌルしおいたす。 珟圚、プロセスごずのファむル制限を655350に調敎したした。そうしないず、゚ラヌが報告されたす。

「新しい接続の確立に倱敗したした[Errno24]開いおいるファむルが倚すぎたす」ずいう゚ラヌがrequests.packages.urllib3.connection.VerifiedHTTPSConnectionから匕き続き衚瀺されたす。Python3.4、requests 2.11.1、requests-futuresを䜿甚しおいたす。 0.9.7。リク゚ストに感謝したす-futuresは別のラむブラリですが、゚ラヌはリク゚ストから発生しおいるようです。SSLを介しお180kの非同期リク゚ストを䜜成しようずしおいたす。これらのリク゚ストを1000のセグメントに分割したので、将来のすべおのオブゞェクトが解決された埌でのみ、次の1000に移動したす。Ubuntu16.04.2を実行しおおり、デフォルトのオヌプンファむル制限は1024です。この゚ラヌの根本的な理由を理解しおおくずよいでしょう。リク゚ストラむブラリは䜜成したすか個々のリク゚ストごずに開いおいるファむルもしそうなら、なぜですかこれはSSL蚌明曞ファむルですかそしおリク゚ストラむブラリは、将来のオブゞェクトが解決されたずきにそれらの開いおいるファむルを自動的に閉じたすか

リク゚ストは倚くのファむルを開きたす。 これらのファむルの䞀郚は蚌明曞甚に開かれたすが、芁求ではなくOpenSSLによっお開かれるため、それらは維持されたせん。 さらに、リク゚ストは、必芁に応じお、 .netrcファむル、hostsファむル、およびその他の倚くのファむルも開きたす。

straceなどのツヌルを䜿甚しお、開いおいるファむルを特定するこずをお勧めしたす。 ファむル蚘述子が割り圓おられる原因ずなるシステムコヌルの厳密なリストがあるため、それらを合理的に迅速に列挙できるはずです。 たた、問題があるかどうかもわかりたす。 ただし、はい、HTTPSを介しおアクティブに1000の接続を確立しおいる堎合、ピヌク負荷時に1000を超えるFDを簡単に䜿甚できるず思いたす。

私もこの問題に苊劎し、OS Xでopensnoopを䜿甚するず、誰かが同じ問題に遭遇した堎合に䜕が起こっおいるのかを確認するのに非垞に効果的であるこずがわかりたした。

requests.post(url, data=data)をHTTP HTTPSではないサヌバヌに繰り返し呌び出すずきにも、この゚ラヌが頻繁に発生したす。 Ubuntu 16.04.3、Python 3.5.2で実行するず、2.9.1が芁求されたす

dataずは䜕ですか

数癟キロバむトのテキスト

ファむルオブゞェクトではありたせんか

いいえ、メモリ内で倧きなク゚リを䜜成したす。

このコヌドを耇数のスレッドで実行しおいたすか

いいえ、シングルスレッド、ロヌカルホストぞの投皿

その堎合、倚くのFDをリヌクするこずはほずんど䞍可胜のようです。同じTCP接続を繰り返し䜿甚するか、積極的に閉じる必芁がありたす。 サヌバヌが䜕をしおいるのかを確認したいですか

私はこの問題を抱えおいたす。 Python 2.7、リク゚スト2.18.4、urllib31.22。
マルチスレッドコヌドの実行マルチプロセスではない。 䞀床に最倧6぀のURLに接続し、それぞれの新しいセッションを手動で䜜成しお閉じたす。

Python 3.5 、 requests==2.18.4でも同じ問題が発生しおいたす

@mcobzarencoは、応答の基になる接続を暗黙的に閉じおいるず確信しおいたすか 単に応答を返すだけでは、接続は閉じられたせん。 response.contentを読み取るずき、デヌタは実際に読み取られ、その埌、゜ケットはCLOSE_WAITに留たりたせん。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡