web-dev-qa-db-ja.com

データがSend-Qに格納されるのはなぜですか? TCPセッションがフリーズする

問題

IRCサーバーを20〜50人のユーザーで実行しています。メッセージがタイムリーに届かない、またはまったく届かないという問題が時々発生します。いくつかのパケットキャプチャの後、メッセージがサーバーの「Send-Q」にあると判断しました。メッセージが届かない場合は、 "netstat -ct"の出力を見て、次のように表示します。

Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 1756 ubuntu:ircd 10.8.1.7:63602 ESTABLISHED

数分待つと、Send-Qが0になり、メッセージが配信されます。それ以外の場合は、クライアントがタイムアウトします。私の質問は、なぜメッセージを配信しないのですか?彼らがSend-Qにそれほど長く座る原因は何ですか?

sshdも同様の動作を示し、私のsshセッションがフリーズしたり、タイムアウトしたりすることがあります。

バックグラウンド

ここのインフラストラクチャが問題に関連している可能性があるかどうかわからないため、次のようになります。これらのクライアントは、OpenVPNに接続しているWindows 7にあります。 OpenVPNサーバーはPFSenseにあり、IRCサーバーはPFSenseに接続されたローカル(NAT化)LANにあります。クライアントがサーバー上の6667と通信できるようにするファイアウォールルールを設定しています。

調査しています...

待ち時間/損失-十分にまともです。これまでで最高のリンクではありませんが、IRCとSSHではこれで問題ないと思います。これが私のクライアントからサーバーへのpingです。これは私のIRCとSSHが断続的にハングしている間です。

Ping statistics for 10.8.5.2:
    Packets: Sent = 4478, Received = 4460, Lost = 18 (0% loss)

ミリ秒単位のおおよその往復時間:最小= 17.2 ms、最大= 273.4 ms、平均= 32.3 ms

MSS/MTUの問題-MTUは問題ないようです。私のクライアントのOpenVPN mtu-testは言う:

Thu Dec 03 12:41:21 2015 NOTE: Empirical MTU test completed [Tried,Actual] local->remote=[1589,1589] remote->local=[1589,1589]

...そしてこれが私の手動テストです:

> ping -f -l 1472 10.8.5.2

Pinging 10.8.5.2 with 1472 bytes of data:
Reply from 10.8.5.2: bytes=1472 time=23ms TTL=63

> ping -f -l 1473 10.8.5.2

Pinging 10.8.5.2 with 1473 bytes of data:
Packet needs to be fragmented but DF set.

帯域幅/スループット-スループットの問題がないことを確認するためにいくつかのiperfテストを行いました。繰り返しますが、十分にまともです:

iperf -c 10.8.5.2
------------------------------------------------------------
Client connecting to 10.8.5.2, TCP port 5001
TCP window size: 63.0 KByte (default)
------------------------------------------------------------
[  3] local 10.8.0.23 port 18587 connected with 10.8.5.2 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  26.0 MBytes  21.8 Mbits/sec

ありがとう、 "Send-Q"やこの問題に関するより具体的なアイデアを理解していただけると助かります。ここにさらに情報を提供できるかどうかをお知らせください。

更新

実際に大量のパケット損失があったことがわかりました。 client-> VPNからのpingではこれは表示されませんでしたが、VPN-> clientからのfpingを使用した場合は非常に明白でした。私はそれがWindowsクライアントだけであることに気付き、最新のOpenVPNクライアントを再インストールすることで損失が修正されたようです。ディスクイメージングを介してインストールされているOpenVPN TAPアダプターに関連している可能性があります。マシンごとに手動でインストールすると、問題が解決するようです。

4
Cory J

アプリケーションがローカルカーネルにデータを書き込むと、データは送信キューに入りますTCPスタック。反対側のTCPスタックが確認すると、データは送信キューから削除されますデータの受信。それらが送信キューにある場合、IRCサーバーコードはそれらをカーネルに送信したが、接続の反対側はまだそれらを確認していません。 。これは、まだ送信されていないことが原因である可能性があります。これは、サーバーの帯域幅の制限またはサーバーのパフォーマンスの制限が原因で発生する可能性がありますが、最も一般的には、サーバーがデータを送信しているのと同じ速さで相手側がデータを受信して​​いないことが原因です。

6
David Schwartz