1

urllib2プロキシを使用して何千ものリクエストを送信しています。実行時に次のエラーの多くを受け取りました。

urlopen error [Errno 99] Cannot assign requested address

ここで、ソケットが既に結合されていることが原因である可能性があることを読みました。そうですか?これを修正する方法について何か提案はありますか?

4

3 に答える 3

4

これは、私が以前に準備した同様の質問への回答です....ずっと前に... ソケットを再利用するときのソケット使用中エラー

エラーは異なりますが、根本的な問題はおそらく同じです。使用可能なすべてのポートを消費し、TIME_WAIT 状態が終了する前にそれらを再利用しようとしています。

[編集: コメントに応じて]

アプリケーションの機能/仕様の範囲内である場合、明らかな戦略の 1 つは、この状況を回避するために接続速度を制御することです。

httplibまたは、モジュールを使用することもできます。httplib.HTTPConnection()接続を行うポートを指定できるタプルを指定できますsource_address。たとえば、これは localhost:9999 か​​ら localhost:1234 に接続します。

import httplib
conn = httplib.HTTPConnection('localhost:1234', source_address=('localhost',9999))
conn.request('GET', '/index.html')

次に、以前の回答で説明したように、送信元ポートの割り当てを管理する必要があります。Windows を使用している場合は、この方法を使用してポート 1024 ~ 5000 のデフォルト範囲を回避できます。

(もちろん) 確立できる接続数には上限があり、何千もの接続を立て続けに行う必要があるアプリケーションがどのようなものかは疑問です。

于 2012-08-16T07:32:32.857 に答える
2

mhawke示唆したように、この問題がTIME_WAIT最も可能性が高いようです。状況に対するシステム全体の修正は、カーネルパラメーターを調整して、そのような接続がより頻繁にクリーンアップされるようにすることです。2 つのオプション:

$ sysctl net.ipv4.tcp_tw_recycle=1

TIME_WAITこれにより、カーネルは状態で接続を再利用できます。これにより、NAT セットアップで問題が発生する可能性があります。もう1つは次のとおりです。

$ sysctl net.ipv4.tcp_max_orphans=8192
$ sysctl net.ipv4.tcp_orphan_retries=1

8192これは、どのユーザー プロセスにもアタッチされていない接続を最大で保持し、TCP 接続を強制終了する前に 1 回だけ再試行するようにカーネルに指示します。

これらは永続的な変更ではないことに注意してください。/etc/sysctl.confそれらを永続的にするには、設定を追加します。

http://code.google.com/p/lusca-cache/issues/detail?id=89#c4
http://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.kernel.obscure.html

于 2014-02-20T14:45:39.323 に答える