104,'接続をリセットピア'のソケットエラーは、ただし一部のサービスについては閉館のソケットにRSTではなくフィン?
質問
展開を行っていますPython webサービスおよびクライアントのウェブサイトを行なった。させていただく場合は、HTTPリクエストクライアントからサービス、電話を一貫して上昇しソケットが開かれます。エラー socket.pyは、読み:
(104, 'Connection reset by peer')
私が聴きとwiresharkには、"良い"、"悪い"と答え見た目はほとんど同じなので:
- サイズなので、OAuthによるヘッダの依頼に足を踏み入れるとパケット.サービスともに対応可能とACK
- に送付するサービスの対応として、パケット毎にヘッダー(HTTP/1.0 200OK、その後のDateヘッダます。のお客様に応じそれぞれACK.
- (請求)サーバに送信し、フィンACK.のお客様に対応し、フィンACK.サーバーに対応しACK.
- (Bad request)にサーバに送RST ACK、クライアントさんを送TCP対応ソケットをクローズします。エラーは、クライアント側で行われます。
のウェブサービス、クライアントラジェンツーペンギンLinux x86-64ボックス走行glibc-2.6.1.まPythonを使用した2.5.2のvirtual_env.
クライアントは、Django1.0.2アプリを呼び出している側のhttplib2 0.4.0る事を依頼するのである。ま署名要求のOAuthによる署名アルゴリズムのOAuthによるトークンを常に空文字列となります。
のサービスが実行Werkzeug0.3.1であるPythonを使用したのwsgiref.simple_server.を行ったのWSGIアプリを通じてwsgiref.バリデータのない課題です。
うことが容易デバッグしてしまっているんですけど微量より良い要請のサービス側では、一見何の変哲もないの悪い要求、ソケットをクローズします。_socketobject.close()関数は、委譲方法へのダミーです。の場合、送信または送することができ覚えている方法の電源を切り、フィンはRSTを送信するとクライアントの処理を開始.
"接続をリセットピア"という場所のせいか、サービスもしっかり身につけるた信頼httplib2ます。では、お客さい。
**さらにデバッグのようなサーバー Linux**
いMacBook proいた、ちょっと変わった形のサービスの一つで、クライアントサイトです。Linux用のお客様の電話のOS Xサーバのバグ(フィンACK).OS XのクライアントのLinuxサービスとのバグを修正(RST ACK、(54,'接続をリセットピア')).こなっているように見えますが、サービスラインプリメンテーションです。でx86_64?悪glibc?wsgiref?までお問い合わせくだ...
**さらに細かい検査-wsgirefうフレーク状**
また製品の生産にApacheとmod_wsgiの接続をリセットしています。自分の回答は、以下が私のアドバイスにログインの接続リセットします。このようにサーバー走OK開発中のモードが堅調である。
解決
私はこの問題を持っていました。 Pythonの「ピアによってリセット接続」問題を参照してください。
あなたは抵触Pythonのグローバルインタープリタロックに基づいて、小さなタイミングの問題の実行(最も可能性が高い)しています。
あなたは(時々)戦略的に配置されたtime.sleep(0.01)
でこれを修正することができます。
"どこで?"あなたが尋ねる。私を殴る。アイデアは、クライアントの要求にと周りにいくつかの優れたスレッドの同時実行を提供することです。 GILがリセットされ、Pythonインタプリタは、保留中のスレッドをクリアできるように、の直前にを、それを入れてみてください、あなたはリクエストを行います。
他のヒント
生産のためwsgiref使用しないでください。 Apacheとmod_wsgiを、または何か他のものを使用します。
私たちはwsgiref(WERKZEUGテストサーバーで使用されるバックエンド、そしておそらくDjangoのテストサーバのような他の人)で、時には頻繁に、これらの接続のリセットを見続けます。当社のソリューションは、エラーを記録ループ内で呼び出しを再試行し、10回の失敗の後に放棄しました。 httplib2は二度試みますが、我々はいくつかのより多くを必要としていました。彼らは同様に房に来ているように見える - 。問題をクリアする可能性がある1秒のスリープを追加
私たちは、Apacheとmod_wsgiを通過する際に、接続がリセット見たことがありません。私は、彼らが(多分彼らはちょうどそれらをマスク)、違った何をすべきか分からないが、彼らは表示されません。
私たちが助けを地元のdevのコミュニティを尋ねたところ、、誰かが、彼らは本番サーバー上で離れて行くwsgirefとの接続リセットの多くを見ることを確認しました。そこバグがありますが、それを見つけるのは難しいことになるだろうされます。
私はあなたのpythonを使用している実感が、私は有用であることが、このJavaの記事を見つけます。
ます。http://java.sun。 COM /のJava SE / 6 /ドキュメント/技術情報/ガイド/ネット/記事/ connection_release.htmlする
通常、あなたがあれば長居しないに近い(すなわち、それが送信され、ACK'dされていない場合、データがスタックによって破棄することができる)と、通常のFINを行う場合は、RSTを取得したいです閉じる残るすることを可能にする(転送中のデータのために近い待機すなわちACK'dする)。
おそらく、あなたがする必要があるすべてはあなたが非クローズ長引くソケットとACKの到着に行われていますか。
との競合状態を削除するようにぐずぐずして、あなたのソケットに設定されています私はnginxの+ uwsgiバックエンドにのpython-要求クライアントの投稿を使用して、非常に大きなファイルのアップロードを行うとしかし同じ問題を持っています。
バックエンドは、クライアントが送信しようとしていたものよりも低くアップロードの最大ファイルサイズのキャップを持っていたどのような原因になってしまった。
この制限は、実際のnginxによって課せられたものだったので、エラーは、私たちのuwsgiログに現れませんでした。
nginxのに限界が増額エラーを除去します。