Linuxのsocket.errorが:[ERRNO 99]は、要求を割り当てることができません。

pymongoインポートMongoClient MongoDBの接続からPythonの使用、全く接続が、その結果、閉じられていないので

netstatの-alnt |トイレ-l
何千ものリーチ数十

 

socket.errorが:[ERRNO 99]が要求されたアドレスを割り当てることができません。

あなたは、検索するためにオンラインに基本的にアドレスが使用されていることバインドは、ナンセンスされていると述べました。アドレスはあるべき新聞が間違っています:

すでに使用中のアドレス才对

それから私は、細心のように、外国人が想像されていないことを示す、英語で表示されます参照してください。

自宅に近いです。ポートがランダムにあなたに割り当てられますとき、ソケット接続要求を開始しました。ポートは、レコードの範囲を割り当てられます。

/ proc / sys / net / IPv4の/ ip_local_port_range

このファイルには、内部(フェドーラ17)である。あなたが複数のプロセスを使用する場合は、あまりにも多くのリクエストを開始し、ポートはこのエラーレポートを実行します。例えば、私は、4つのプロセスをオープンしました40,000リクエストについて発表しました。

あなたは、rootユーザーに切り替えて、このコマンドをノックしようとする実験を行うことができます。

エコー32768 32769>は、/ proc / sys / net / IPv4の/ ip_local_port_range

あなたは誰をオンにこの時間は、マイクロブログは、負荷へのたくさんの写真が出てこないでしょう。画像をブラウザ内にロードされているので、あなたがポートの十分な数を持っていないので、並列にロードされているので、イメージがロードに失敗しています。気をつけてください、この変更は一時的なものである(他の人の言うことに耳を傾け、私は知らない、一時的ではありません)

変更は、次のコマンドが付属しています:

エコー32768 61000>は、/ proc / sys / net / IPv4の/ ip_local_port_range

32768から61000は、システムのデフォルトランダムに割り当てられたポート範囲である(やはり、Fedoraの17版)

 

99(1)はerrno =せます。

接続システムコールが失敗を返す理由としては、唯一のシステムコールの実装を見ることができます。

a)の接続システムコール

コールスタックSys_connectシステムコールで実装ネット/のsocket.cで接続システムコール:

Sys_connect --->
    sock-> ops->接続/ / inet_stream_connect
        SK-> sk_prot->接続/ / tcp_v4_connect

tcp_v4_connect TCP接続の主な役割は、第1の3ウェイハンドシェイクハンドシェイクで終了する、すなわちサーバは、SYNC = 1を送信し、32ビットのシリアルナンバー要求パケットに接続されています。SYNC要求パケットを送信するには、TCP / IPプロトコルに従って、それは元のIPアドレスとポート、送信元のIPアドレスを持っている必要がありますし、ルーティング選択がip_route_connectに実装され、必要のルーティングテーブルに関連して、__inet_hash_connectに実装され、選択したソースポート、利用可能なポートを見つけることができない場合や、この機能は-EADDRNOTAVAILは、その基本的機能は失敗の接続につながったエラーを返すかどうかを判断することができます返されます。

B)__inet_hash_connect

この機能の主な役割は、利用可能なポートを選択することで、主な手順は次の通りです:

。私はinet_get_local_port_range(ロー&&高い)を呼び出して、利用可能なポートのリスト。

  1. コールread_seqbegin(&sysctl_local_ports.lock);ロックを与えるため。
  2. ローとハイの利用可能なポートを取得します。

*ロー= sysctl_local_ports.range [0]。

*高= sysctl_local_ports.range [1]。

。各ポートは、次の手順についてはⅡ:

  1. ポートで使用されている店舗情報に使用inet_hashinfoこのポートHINFO * inet_hashinfoで検索し、各ポートは、このハッシュテーブルの使用にエントリを持っています。
  2. ポートは、(競合を解決するために、ハッシュリストを使用して)リストのハッシュ頭を入手できますか
  3. 各エントリのリスト内の移動:

A)次のエントリを、同じポートを使用して同じ場合、ステップBに進み、そうでない場合は同じ横断するかどうかを決定します

B)ポート、コールはinet_check_established __(check_established見つける。))ポートはポートで再利用することができるか否かを判断する(及びポート場合TIME_WAIT状態がnet.ipv4.tcp_tw_recycle = 1であります

  1. リストに、このポートが見つからない場合は、ポートが使用されていない、ハッシュテーブル内のコールinet_bind_bucket_createエントリを挿入します。

III。利用できる最後のポートが見つからない場合は、戻りEADDRNOTAVAIL。

この機能の実装から充填されており、その使用可能なポートを見つけることができない使用可能なポートのために主に、見ることができ、接続は失敗します。存在ソケットTIME_WAIT状態の多くを見つけることができます実行してnetstatコマンドは、ソケットが満たされた使用可能なポートになります。

[ルート@Test miuistorage-devの] #は、netstat -n | awkの/ ^ TCP / {++状態[$ NF]} END {(キーの状態で)のための 
 印刷キー、"\トン"、状態[キー]} "TIME_WAIT 26837 30を設立

(2)溶液:

ポートが占有されている問題を解決するために、ソケットTIME_WAIT状態は、次のソリューションを持つことができます。

a)に利用可能なポートの範囲を変更します

現在のポート範囲を表示します。

ルートguojun8- @ デスクトップ:linux- / 2.6。34 #sysctlののnet.ipv4.ip_local_port_range net.ipv4.ip_local_port_range = 32768 61000

ポート範囲を変更します。

ルートguojun8- @ デスクトップ:linux- 2.6。34 #sysctlののnet.ipv4.ip_local_port_range = "32768 62000" net.ipv4.ip_local_port_range = 32768 62000

あなたが短い接続を使用する場合は、利用可能なポートの増加がまだ入力されますので、そのようなアプローチは、根本的な問題を解決しないことがあります。 

B)を提供net.ipv4.tcp_tw_recycle = 1(私はこのソリューションを使用)

このパラメータは、システムのTIME-WAITソケット素早く回復するかどうかを示します

ルートguojun8- @ デスクトップ:linux- 2.6。34 #のsysctl net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_recycle = 1

C)を提供net.ipv4.tcp_tw_reuse = 1

このパラメータは、ポートがTIME_WAIT状態を再利用できるかどうかを示します。

ルートguojun8- @ デスクトップ:linux- 2.6。34 #[ルート@Testサムネイル]#sysctlをnet.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_reuse = 1

(3)より詳細な議論:sysctlをやりました

straceのは、システムがsysctlを呼ぶものを追跡することができます:

ルートguojun8-デスクトップ@:linux- 2.6。34#straceのsysctlをnet.ipv4.tcp_tw_recycle = 1 はexecve("/ sbinに/のsysctl"、[ "のsysctl"、"net.ipv4.tcp_tw_recycle = 1"]、[/ * 20 VARS * /])= 0 BRK(0 )= 0x952f000 ... .. オープン("/ PROC / SYS / /のIPv4 / tcp_tw_recycleネット"、O_WRONLY | O_CREAT | O_TRUNC、0666)= 3 fstat64(3、{st_modeの= S_IFREG | 0644、st_size = 0、...} )= 0 mmap2(NULL、4096、PROT_READ | PROT_WRITE、MAP_PRIVATE | MAP_ANONYMOUS、 - 1、0)= 0xb788e000 ライト(3、"1 \ n"は、クローズ(3)= 0 と、munmap(0xb788e000、4096)= 0 fstat64(1、{st_modeの= S_IFCHR | 0620、st_rdevに= MAKEDEV(136 8)、...})= 0 mmap2(NULL、4096、PROT_READ | PROT_WRITE 、MAP_PRIVATE | MAP_ANONYMOUS、 - 1、0)= 0xb788e000 書き込み(1、"net.ipv4.tcp_tw_recycle = 1 \ n"は、28net.ipv4.tcp_tw_recycle = 1)= 28 exit_group(0)=?

私たちは、このプログラムはは、/ proc / sys / net / IPv4の/ tcp_tw_recycleを開き、ファイルを書き込むために見ますが、ときに、この設定は何の役割もすることができますか?カーネルにi_fopの/ proc /ディレクトリのファイルは特別な処理を行い、SYS、proc_sys_make_inodeで提供されていますinode-> i_fop =&次のように定義さproc_sys_file_operationsproc_sys_file_operations:

静的constの構造体file_operations proc_sys_file_operations = {
.read = proc_sys_read、
.WRITE = proc_sys_write、
}。

proc_sys_writeは、対応するファイルを変更し、メモリの内容を変更、異なるファイルは、この関数は次の変数をtcp_tw_recycle proc_dointvec変更しますされる機能に対応する処理として、異なるproc_handlerを持っています:

tcp_death_row.sysctl_tw_recycle

この変数は、ソケットTIME_WIAT状態がすぐにカーネルで回収することができるかどうかを示します。

 

仕上げ自己ます。https://www.cnblogs.com/djiankuo/p/5956606.html 

おすすめ

転載: www.cnblogs.com/xibuhaohao/p/12165777.html