web-dev-qa-db-ja.com

ビジーなインターフェイスでtcpdumpを実行すると、多くのパッケージが削除される

私の挑戦

大量のデータのtcpdumpを実行する必要があります。実際には、混合モードのままになっている2つのインターフェースから、大量のトラフィックを確認できます。

まとめると

  • 2つのインターフェースからのすべてのトラフィックを無差別モードでログに記録します
  • これらのインターフェースにはIPアドレスが割り当てられていない
  • pcapファイルは〜1Gごとにローテーションする必要があります
  • 10 TBファイルが保存されている場合、最も古いものを切り捨てます

私が現在していること

現在、私はこのようにtcpdumpを使用しています:

ifconfig ethX promisc
ifconfig ethX promisc
tcpdump -n -C 1000 -z /data/compress.sh -i any -w /data/livedump/capture.pcap $FILTER

$FILTERにはsrc/dstフィルターが含まれているため、-i anyを使用できます。これは、2つのインターフェイスがあり、2つではなく1つのスレッドでダンプを実行したいためです。

compress.shは、tarを別のCPUコアに割り当て、データを圧縮し、適切なファイル名を付けて、アーカイブの場所に移動します。

2つのインターフェースを指定できないため、フィルターを使用してanyインターフェースからダンプすることを選択しました。

現在、私はハウスキーピングをしていませんが、ディスクの監視を計画しており、100Gになったら、最も古いファイルのワイプを開始します。これで問題ありません。

そして今;私の問題

ドロップされたパケットが表示されます。これは、数時間実行され、約250ギガのpcapファイルを収集したダンプからのものです。

430083369 packets captured
430115470 packets received by filter
32057 packets dropped by kernel  <-- This is my concern

非常に多くのパケットがドロップされるのをどのように回避できますか?

私がすでに試したり見たりしたこれらのこと

実際に役立つ/proc/sys/net/core/rmem_max/proc/sys/net/core/rmem_defaultの値を変更しました-実際には、破棄されたパケットの約半分だけが処理されました。

gulp も確認しました-gulpの問題は、1つのプロセスで複数のインターフェースをサポートしておらず、インターフェースにIPアドレスがないと怒るということです。残念ながら、それは私の場合、取引ブレーカーです。

次の問題は、交通がパイプを通って流れるときに、自動回転を実行できないことです。 1つの巨大な10 TBファイルを取得することはあまり効率的ではなく、10TB +のマシンがありませんRAMそれでWiresharkを実行できるので、それはありません。

何か提案はありますか?たぶん、私のトラフィックダンプを完全に行うより良い方法かもしれません。

12
Frands Hansen

一緒に暮らすことになっている解決策を見つけてしまいました。ドロップされたパッケージは.0047%から.00013%に減少しました-最初はそれほど多くはないように見えますが、数百万のパケットについて話していると、かなり多くなります。

解決策はいくつかのもので構成されていました。 1つは、マイケルハンプトンによって提案されたようにリングバッファーサイズを変更することでした。

また、ramfsを作成してライブダンプを行い、ramfsからディスクにダンプを移動するように圧縮スクリプトを書き直しました。これはほんの少しの量を減少させましたが、注目に値するほど十分です-ディスクのすべてのテストとベンチマークはディスクがボトルネックであってはならないことを示していますが。ここではアクセス時間が非常に重要だと思います。

ハイパースレッディングを無効にすると、思ったよりも多くのことができます。

7
Frands Hansen

tcpdumpは着信データをリングバッファーに格納します。 tcpdumpがその内容を処理する前にバッファーがオーバーフローすると、パケットが失われます。

デフォルトのリングバッファサイズはおそらく2048です (2MiB)。

バッファサイズを増やすには、-Bオプション:

tcpdump -B 4096 ...

より高速なディスクストレージを使用してみてください。

11
Michael Hampton