私のサーバープログラムが実行中で、RedisクライアントでいくつかのTCP接続を確立しようとしています。
-
1150個のクライアント接続を試みていますが、サーバー側でnetstatを確認すると「ESTABLISHED -」ステータスが表示され、プログラム名を省略したダッシュ()の理由がわかりません。
クライアント側から:
[root@smarak-2storage-testvnf-vm0 src]# ulimit -n
4096
[root@smarak-2storage-testvnf-vm0 src]# ./redis-benchmark -h 10.111.89.230 -p 6379 -c 1150 -t set -n 20000 -d 10000 -r 100000000000000 -I
サーバー側から:
[root@sdl-blr-vm-1-14 src]# ulimit -n
1024
[root@sdl-blr-vm-1-14 src]# netstat -anp | grep -i 6379
tcp 129 0 0.0.0.0:6379 0.0.0.0:* LISTEN 31535/respAccess
tcp 0 0 10.111.89.230:6379 10.111.89.112:34276 ESTABLISHED 31535/respAccess
tcp 0 0 10.111.89.230:6379 10.111.89.112:35048 ESTABLISHED -
tcp 0 0 10.111.89.230:6379 10.111.89.112:34614 ESTABLISHED 31535/respAccess
tcp 0 0 10.111.89.230:6379 10.111.89.112:34234 ESTABLISHED 31535/respAccess
tcp 0 0 10.111.89.230:6379 10.111.89.112:34984 ESTABLISHED 31535/respAccess
tcp 0 0 10.111.89.230:6379 10.111.89.112:34441 ESTABLISHED -
tcp 0 0 10.111.89.230:6379 10.111.89.112:34441 ESTABLISHED -
tcp 0 0 10.111.89.230:6379 10.111.89.112:34441 ESTABLISHED
-
この出力が表示されるのはなぜですかESTABLISHED -
?サーバー側には1024個のファイル記述子があると思うため、クライアントが1150個の接続を開始した場合は、1024個の接続のみを設定する必要があります。つまり、「ESTABLISHED 31535/respAccess」状態(プログラム名を含む)に設定され、他の接続は削除されなければなりません。 「ESTABLISHED」状態の接続がある場合、プログラム名が追加されていないのはなぜですか?
答え1
ルートアカウントを使用しているので、すべてのユーザーのすべてのプロセスを見ることができます - 接続はカーネルによって処理されることを意味します。
接続を処理するには、listen()
ソケット記述子とバックログパラメータを使用して関数を呼び出す必要があります。によるとman listen
:
backlogパラメーターは、sockfdの保留中の接続キューが大きくなる可能性がある最大長を定義します。キューがいっぱいになったときに接続要求が到着すると、クライアントはECONNREFUSEDマークでエラーを受信できます。あるいは、基本プロトコルが再送信をサポートしている場合は、後で接続を正常に再試行できるように要求が無視されることがあります。
Linux 2.2では、TCPソケットのbacklogパラメータの動作が変更されました。キューの長さを指定します。完全 承認待機中のソケットが設定されました。、不完全な接続要求の数ではありません。
編集する:
着信TCP接続はカーネル(TCPハンドシェイク)によって処理されるため、接続が確立されていることがわかります。カーネルがTCP接続を確立すると、待機中のプログラムが承認されている間に接続がキューに追加されます。バックログは、最大接続数ではなくキューのサイズを示します。
したがって、netstatの「-」記号は、クライアントがサーバーへの接続を要求し、カーネルがTCPハンドシェイクを処理した後にキューに接続を追加しましたが、サーバーがまだ接続を受け入れていないことを意味します。
編集2:
確認するこれウェブサイト。全体のプロセスを説明する素晴らしいフローチャートがあります。