2

WiFi (802.11) 用のネットワーク アナライザーを設計する予定です。現在、tshark を使用して WiFi フレームをキャプチャして解析し、出力を perl スクリプトにパイプして、解析された情報を Mysql データベースに保存します。

このプロセスで多くのフレームを見逃していることがわかりました。確認したところ、パイプ中にフレームが失われているようです (出力が Perl に配信されて Mysql で処理されるとき)。

(Tshark) -------frames are lost----> (Perl) --------> (MySQL) これは、tshark の出力をスクリプトにパイプする方法です。

sudo tshark -i mon0 -t ad -T fields -e frame.time -e frame.len -e frame.cap_len -e radiotap.length | perl tshark-sql-capture.pl 

これは、私が使用する perl スクリプトの単純なテンプレートです (tshark-sql-capture.pl)

# preparing the MySQL
my $dns = "DBI:mysql:capture;localhost";
my $dbh = DBI->connect($dns,user,pass);
my $db = "captured";

while (<STDIN>) {
    chomp($data = <STDIN>);
    ($time, $frame_len, $cap_len, $radiotap_len) = split "  ", $data;
    my $sth = $dbh-> prepare("INSERT INTO $db VALUES (str_to_date('$time','%M %d, %Y %H:%i:%s.%f'), '$frame_len', '$cap_len', '$radiotap_len'\n)" );
    $sth->execute;
}

#Terminate MySQL
$dbh->disconnect;

パフォーマンスを向上させるのに役立つアイデアを歓迎します。または、パフォーマンスを向上させる代替メカニズムがあるかもしれません。現在、私のパフォーマンスは 50% で、キャプチャしたパケットの約半分を mysql に保存できることを意味します。

4

3 に答える 3

1

パイプに書き込まれたものは失われません。おそらく実際に起こっていることは、tsharkがパイプに書き込もうとしますが、perl + mysqlは入力を処理するには遅すぎるため、pipebがいっぱいになり、書き込みがブロックされるため、tsharkはパケット。

ボトルネックはMySQLまたはPerl自体のいずれかである可能性がありますが、おそらくDBです。CPU使用率を確認し、挿入率を測定します。次に、より高速なDBを選択するか、複数のDBに書き込みます。バッチ挿入を試して、パイプバッファのサイズを増やすこともできます。

アップデート

while (<STDIN>)

これは行をに読み込み、$_無視します。

于 2011-09-13T19:16:11.473 に答える
1

パイプの問題については、GULP http://staff.washington.edu/corey/gulp/でパケット キャプチャを改善できます。

マンページから:

1) reduce packet loss of a tcpdump packet capture:
      (gulp -c works in any pipeline as it does no data interpretation)

        tcpdump -i eth1 -w - ... | gulp -c > pcapfile
      or if you have more than 2, run tcpdump and gulp on different CPUs
        taskset -c 2 tcpdump -i eth1 -w - ... | gulp -c > pcapfile

      (gulp uses CPUs #0,1 so use #2 for tcpdump to reduce interference)
于 2013-03-22T16:35:37.133 に答える
0

FIFOファイルを使用してから、挿入遅延を使用してパケットを読み取り、mysqlに挿入することができます。

sudo tshark -i mon0 -t ad -T fields -e frame.time -e frame.len -e frame.cap_len -e radiotap.length > MYFIFO
于 2012-02-23T19:42:33.833 に答える