webdevqa.jp.net

データベースにデータをアップロードするときに「ドロップされた接続のリセット」が常に表示されるのはなぜですか?

HerokuのクラウドサーバーからAWS EC2のデータベースに、REST APIを介して何億ものアイテムをデータベースにアップロードしています。 Pythonを使用していますが、ログに次のINFOログメッセージが常に表示されています。

[requests.packages.urllib3.connectionpool] [INFO] Resetting dropped connection: <hostname>

この「ドロップされた接続のリセット」には、コードが再び実行され続けるまでに数秒(場合によっては30秒以上)かかります。

  • まず、ここで何が起こっているのか、そしてその理由は何ですか?
  • 第二に、データをより速くアップロードできるように、接続の切断を停止する方法はありますか?

ご協力いただきありがとうございます。アンドリュー。

33
Andrew Thompson

リクエストは Keep-Aliveデフォルトで を使用します。 Resetting dropped connectionは、私の理解では、生きているはずの接続が何らかの形でドロップされたことを意味します。考えられる理由は次のとおりです。

  1. サーバーはKeep-Aliveをサポートしていません。
  2. 確立された接続ではしばらくの間データ転送が行われないため、サーバーは接続を切断します。

詳細については、 https://stackoverflow.com/a/25239947/2142577 を参照してください。

13
laike9m

問題は、クライアントが接続の維持を要求したにもかかわらず、サーバーが接続を閉じたことです。

これは、サーバーがキープアライブをサポートしていないためとは限りませんが、サーバーが接続で特定の数の要求のみを許可するように構成されている可能性があります。これは、異なるサーバーにリクエストを分散するのに役立つ可能性がありますが、このプラクティスは、サーバー(たとえばPHP)で動作する記述の不十分なコードに対する実用的な防御として一般的であると思います。リクエスト(おそらくエラー状態などによる)

これがあなたに当てはまると思い、これらのログ(INFOレベルでログに記録される)を表示したくない場合は、以下を追加して、ログのその部分を静めることができます。

# Really don't need to hear about connections being brought up again after server has closed it
logging.getLogger("requests.packages.urllib3.connectionpool").setLevel(logging.WARNING)
11
Cameron Kerr

これは、RESTful APIを公開して悪用(またはDoS)を回避するサービスの一般的な方法です。
APIを強調している場合、接続が切断されます。
ドロップを避けるために、スクリプトをときどき少しスリープさせるようにしてください。

5
alonre