Ich führe eine Reihe von Auslastungstests durch, um die Leistung des folgenden Setups zu bestimmen:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
Kurz gesagt, die Testsuite node.js sendet alle x Sekunden eine festgelegte Anzahl von Metriken an eine StatsD-Instanz, die sich auf einem anderen Server befindet. StatsD spült dann die Metriken im Sekundentakt zu einer Graphite-Instanz, die sich auf demselben Server befindet. Ich schaue dann nach, wie viele Metriken tatsächlich von der Testsuite gesendet und wie viele von Graphite empfangen wurden, um den Paketverlust zwischen der Testsuite und Graphite zu bestimmen.
Ich bemerkte jedoch, dass ich manchmal sehr hohe Paket-Drop-Raten bekam (beachten Sie, dass es mit dem UDP-Protokoll gesendet wird), die zwischen 20 und 50% lagen. Zu diesem Zeitpunkt begann ich zu untersuchen, wo diese Pakete abgelegt wurden, da es sich um ein Leistungsproblem bei StatsD handeln könnte. Also begann ich, die Metriken in jedem Teil des Systems zu protokollieren, um herauszufinden, wo dieser Abfall auftrat. Und hier wird es komisch.
Ich verwende tcpdump , um eine Erfassungsdatei zu erstellen, die ich nach Abschluss des Tests überprüfe. Aber wenn ich die Tests mit laufendem tcpdump durchführe, ist der Paketverlust fast nicht vorhanden! Es sieht so aus, als würde tcpdump die Leistung meiner Tests irgendwie steigern, und ich kann nicht herausfinden, warum und wie dies geschieht. Ich führe den folgenden Befehl aus, um die tcpdump-Nachrichten sowohl auf dem Server als auch auf dem Client zu protokollieren:
tcpdump -i any -n port 8125 -w test.cap
In einem bestimmten Testfall sende ich 40000 Metriken / s. Der Test unter tcpdump hat einen Paketverlust von ca. 4%, während der Test ohne tcpdump einen Paketverlust von ca. 20% hat.
Beide Systeme werden als Xen-VMs mit folgendem Setup ausgeführt:
- Intel Xeon E5-2630 v2 bei 2,60 GHz
- 2 GB RAM
- Ubuntu 14.04 x86_64
Dinge, die ich bereits auf mögliche Ursachen überprüft habe:
- Erhöhen der Empfangs- / Sendegröße des UDP-Puffers.
- CPU-Auslastung wirkt sich auf den Test aus. (maximale Auslastung von 40-50%, sowohl Client- als auch Serverseite)
- Ausführen von tcpdump auf bestimmten Schnittstellen anstelle von "any".
- Ausführen von tcpdump mit '-p', um den Promiscuous-Modus zu deaktivieren.
- Ausführen von tcpdump nur auf dem Server. Dies führte zu einem Paketverlust von 20% und schien die Tests nicht zu beeinträchtigen.
- Ausführen von tcpdump nur auf dem Client. Dies führte zu einer Leistungssteigerung.
- Erhöhen von netdev_max_backlog und netdev_budget auf 2 ^ 32-1. Das machte keinen Unterschied.
- Versuchte jede mögliche Einstellung des Promiscuous-Modus auf jedem NIC (Server an und Client aus, Server aus und Client an, beide an, beide aus). Das machte keinen Unterschied.
ifconfig eth0 promisc
und ifconfig eth0 -promisc
deaktiviert den Promiscuous-Modus auf eth0. Wenn es einen Unterschied macht, vergleichen Sie die 4 möglichen Kombinationen von Promisc-Ein / Aus auf beiden Computern. Dies könnte helfen, die Ursache der Probleme zu lokalisieren.
-p
Option überspringen, um festzustellen, ob dies einen Unterschied macht.