Viele verworfene Pakete beim tcpdumping auf einer ausgelasteten Schnittstelle

11

Meine Herausforderung

Ich muss eine Menge Daten tcpdumping - tatsächlich von 2 Schnittstellen, die im Promiscuous-Modus verbleiben und viel Verkehr sehen können.

Etwas zusammenfassen

  • Protokollieren Sie den gesamten Datenverkehr im Promiscuous-Modus von 2 Schnittstellen
  • Diesen Schnittstellen wird keine IP-Adresse zugewiesen
  • PCAP-Dateien müssen pro ~ 1G gedreht werden
  • Wenn 10 TB Dateien gespeichert sind, schneiden Sie die ältesten ab

Was ich gerade mache

Im Moment benutze ich tcpdump wie folgt:

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

Das $FILTERenthält src / dst Filter, damit ich verwenden kann -i any. Der Grund dafür ist, dass ich zwei Schnittstellen habe und den Speicherauszug in einem einzigen Thread anstatt in zwei ausführen möchte.

compress.sh kümmert sich darum, tar einem anderen CPU-Kern zuzuweisen, die Daten zu komprimieren, ihm einen angemessenen Dateinamen zu geben und ihn an einen Archivspeicherort zu verschieben.

Ich kann nicht zwei Schnittstellen angeben, daher habe ich mich für die Verwendung von Filtern und Dump von der anySchnittstelle entschieden.

Im Moment mache ich keine Hausarbeit, aber ich plane, die Festplatte zu überwachen, und wenn ich noch 100G habe, werde ich anfangen, die ältesten Dateien zu löschen - das sollte in Ordnung sein.

Und nun; mein Problem

Ich sehe verworfene Pakete. Dies ist von einem Dump, der seit einigen Stunden läuft und ungefähr 250 Gigs PCAP-Dateien gesammelt hat:

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

Wie kann ich verhindern, dass so viele Pakete verworfen werden?

Diese Dinge habe ich schon ausprobiert oder angeschaut

Der Wert von wurde geändert /proc/sys/net/core/rmem_maxund /proc/sys/net/core/rmem_defaultwas hat tatsächlich geholfen - tatsächlich hat es nur etwa die Hälfte der verworfenen Pakete erledigt.

Ich habe mir auch gulp angesehen - das Problem mit gulp ist, dass es nicht mehrere Schnittstellen in einem Prozess unterstützt und es wütend wird, wenn die Schnittstelle keine IP-Adresse hat. Leider ist das in meinem Fall ein Deal Breaker.

Das nächste Problem ist, dass ich die automatische Rotation nicht in Gang bringen kann, wenn der Verkehr durch eine Leitung fließt. Das Abrufen einer riesigen 10-TB-Datei ist nicht sehr effizient und ich habe keinen Computer mit 10 TB + RAM, auf dem wir Wireshark ausführen können.

Hast du irgendwelche Vorschläge? Vielleicht sogar eine bessere Möglichkeit, meinen Traffic Dump insgesamt zu erledigen.

Frands Hansen
quelle
In meinem Fall habe ich die Option -s0 verwendet und durch Ändern in -s1600 (direkt über MTU) für mich gelöst.
LatinSuD

Antworten:

11

tcpdump speichert eingehende Daten in einem Ringpuffer. Wenn der Puffer überläuft, bevor tcpdump seinen Inhalt verarbeitet, verlieren Sie Pakete.

Die Standardgröße des Ringpuffers beträgt wahrscheinlich 2048 (2 MB).

Fügen Sie die -BOption hinzu, um die Puffergröße zu erhöhen :

tcpdump -B 4096 ...

Sie sollten auch versuchen, einen schnelleren Festplattenspeicher zu verwenden.

Michael Hampton
quelle
Ich werde versuchen, die Puffergröße zu ändern. Ich bin fast sicher, dass die Geschwindigkeit des Festplattenspeichers nicht das Problem ist. Es schreibt Daten mit ungefähr 15 M / s beim Dumping und beim Dd'ing einer 17-Gig-Datei: 17179869184 Bytes (17 GB) kopiert, 23,5737 s, 729 MB / s (mit bs = 8k count = 2048k)
Frands Hansen
7

Am Ende habe ich eine Lösung gefunden, mit der ich leben kann. Die Anzahl der verworfenen Pakete wurde von 0,0047% auf 0,00013% verringert - was auf den ersten Blick nicht viel zu sein scheint, aber wenn wir über Millionen von Paketen sprechen, ist es ziemlich viel.

Die Lösung bestand aus mehreren Dingen. Eine bestand darin, die Ringpuffergröße zu ändern, wie von Michael Hampton vorgeschlagen.

Außerdem habe ich ein Ramfs erstellt und Live-Dumping durchgeführt. Ich habe mein Komprimierungsskript neu geschrieben, um sicherzustellen, dass die Dumps von Ramfs auf die Festplatte verschoben werden. Dies verringerte die Menge nur sehr wenig, aber genug, um bemerkenswert zu sein - obwohl alle Tests und das Benchmarking der Festplatte zeigen, dass die Festplatte nicht der Engpass sein sollte. Ich denke, der Zugang ist hier sehr wichtig.

Das Deaktivieren von Hyper-Threading hat auch mehr bewirkt, als Sie gedacht hatten.

Frands Hansen
quelle
Meinst du, "Deaktivieren von Hyper-Threading" hilft viel? Wie viel kann es helfen? Vielen Dank.
Poordeveloper
Ehrlich gesagt kann ich mich nicht mehr an die Einzelheiten erinnern. Ich habe seitdem den Arbeitsplatz gewechselt, aber nach dem, was ich geschrieben habe, scheint das Deaktivieren von Hyper-Threading das Problem zu lösen.
Frands Hansen