Gewusst wie: Erfassen von Netzwerk-Pakete zu MySQL
Ich werde das design ein network Analyzer für WLAN (802.11)
Derzeit nutze ich tshark zu erfassen und zu analysieren, die WiFi-frames und leiten Sie die Ausgabe an ein perl-Skript zum speichern der analysierten Daten auf die Mysql-Datenbank.
Ich habe gerade erfahren, dass ich vermisse eine Menge von frames in diesem Prozess. Ich überprüft, und die Rahmen scheinen verloren zu gehen, während das Rohr (wenn der Ausgang geliefert wird, um perl zu bekommen srored in Mysql)
Hier steht wie es geht
(Tshark) ------- frames verloren gegangen sind----> (Perl) --------> (MySQL)
dies ist, wie ich, leiten Sie die Ausgabe von tshark Skript:
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
dies ist einfache template-perl-Skript, das ich benutze (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;
Jede Idee, die helfen können, um die Leistung besser gewürdigt wird.Oder vielleicht gibt es einen Alternativen Mechanismus, der es besser kann.
Jetzt meine Leistung ist 50% bedeutet, ich kann speichern in mysql etwa die Hälfte der Pakete, die ich ' V erfasst.
InformationsquelleAutor hra | 2011-09-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dinge geschrieben, die in einem Rohr nicht verloren gehen, was wahrscheinlich wirklich passiert ist, dass tshark versucht zum schreiben in die pipe, aber perl+mysql ist zu langsam bei der Eingabe, so die pipeb voll ist, schreiben Sie blockieren würden, so tshark einfach verwirft die Pakete.
Engpass könnte sein, entweder MySQL oder Perl selbst, sondern vermutlich die DB. Überprüfen Sie die CPU-Auslastung Messen insert-rate. Dann wählen Sie eine schnellere DB oder schreiben auf mehrere DBs. Sie können auch versuchen, batch-Einsätze und die Erhöhung der Größe des pipe-Puffers.
Update
dieser liest eine Zeile in
$_
, dann ignorieren Sie es.ahhh. siehe update.
yey. Danke!! Das löste mein erstes problem jetzt in heavy-frame-rate habe ich fast 100% Leistung!!!! Aber wenn ich langsamer die frame-rate, um z.B. 10 frames pro minute, die ich nicht erfassen kann-frames. Wissen Sie, was passiert, wenn das perl-Skript beenden der while-Schleife und nach, während (e.g 10 Minuten) ein weiteres Paket ist gefangen von den tshark. Ich denke, ich sollte gehen, um zu studieren, mehr darüber, wie Leitung funktioniert in linux!!
auch
man stdbuf
InformationsquelleAutor Karoly Horvath
können Sie verwenden eine FIFO-Datei, dann Lesen Sie die Pakete und fügt Sie in die mysql-insert-delay.
InformationsquelleAutor carloscardo00
Rohr-Probleme, verbessern Sie die Paketerfassung mit GULP http://staff.washington.edu/corey/gulp/
Aus der Man-pages:
InformationsquelleAutor nergeia