1

同じホスト上の 2 つの Docker コンテナー間で UDP パケットを交換する必要があるプロジェクトを開発しています。ホストは、ubuntu サーバー 14.04LTS (Dell PowerEdge R410、32 GB RAM、Intel Xeon CPU E5640 @ 2.67GHz) を実行する新しい専用サーバーです。

プロジェクトを開発しているときに、2 つの Docker コンテナ間でパケットが失われていることに気付きました。そのため、次のシナリオを作成して問題を示しました。

同じホストで実行されている ubuntu:14.04 から 3 つの Docker コンテナを作成しました。これらをコンテナ #1、コンテナ #2、およびコンテナ #3 と呼びましょう。Docker のバージョンは 1.11.1 (ビルド 5604cbe) です。

  • コンテナ #1 が実行中iperfです: iperf -c 225.2.2.2 -u -T 32 -t 60 -i 1 -b 700M(UDP パケットを生成し、700Mbit/秒の帯域幅で 60 秒間マルチキャストします)。

  • コンテナ #2 が実行中iperfです: iperf -s -u -B 225.2.2.2 -i 1(同じマルチキャスト アドレスをリッスンしています)。

  • コンテナ #3 が実行されていtcpdumpますtcpdump -i eth0 port 5001(コンテナ #1 がパケットをマルチキャストするポートでリッスンしています)。

60 秒後、コンテナ #1 は 2786350 データグラムを送信したことを報告します。

コンテナ #2 は次のことを報告します。

Interval      Transfer      Bandwidth       Jitter   Lost/Total Datagrams
0.0-60.0 sec  3.81 GBytes   546 Mbits/sec   0.001 ms 2250/2786349 (0.081%) 

コンテナ #3 は次のことを報告します。

2770477 packets captured
2786351 packets received by filter
15874   packets dropped by kernel

それで、いくつかの質問があります:

  1. コンテナ #2 と #3 が同じ数の受信パケットを報告しないのはなぜですか (コンテナ #2 はデータグラムが 1 つ少なく、コンテナ #3 はデータグラムが 1 つ多い)。

  2. これが制御された仮想ネットワークである場合、失われたパケットの数が大きく異なるのはなぜですか? また、「カーネルによってドロップされたパケット」とはどういう意味ですか?

  3. そもそもパケットが失われるのはなぜですか? 繰り返しますが、これは制御された仮想環境であり、ネットワーク機器は使用されていません。

前もって感謝します。

4

1 に答える 1

3

「カーネルによってドロップされた」パケット数 (これは、OS がその情報をアプリケーションに報告する場合、tcpdump が実行されている OS のパケット キャプチャ メカニズムによって、バッファー スペースの不足が原因でドロップされたパケットの数です。そうでない場合は、0 として報告されます)。

カーネルはキャプチャしたデータを特別なバッファに書き込み、tcpdump はそのバッファからデータを読み取ります。バッファがいっぱいの場合、パケットはドロップされます。

多くの場合、ネットワークはディスクよりも高速です。つまり、すべてのパケットをキャプチャできない場合があります。ただし、パックされたドロップの数が少ないため、これはあなたのケースではないため、次のことができます。

  1. tcpdump、-Bまたは--buffer-sizeオプションのバッファーを増やします。サイズは KB 単位です。デフォルトは 2048KB です。
  2. sudo nice -10 tcpdump - tcpdump に追加の優先順位を付けます (または -20)
  3. Linux の場合 sudo nice -10 ionice -c 1 tcpdump 追加のディスク書き込み優先度
于 2016-05-12T15:27:59.453 に答える