2016-04-29 11 views
3

Ich habe eine Multi-Threaded C++ - Netzwerkanwendung, die UDP-Pakete als Eingabe überwacht - diese Daten hüpft dann durch die Anwendung/verarbeitet über verschiedene Warteschlangen und Threads und schließlich auf einen TCP-Socket geschoben.Antwortzeit einer Anwendung unintuitiv korreliert mit der Anzahl der Eingabe-Trigger in einem geben Zeitraum

Was ich sehe, ist, dass, wenn Eingänge kommen in langsam lässt sagen 5/sec, die gesamte Reaktionszeit (in-to-out) ist langsam (sagen wir 100ms) und wenn die Eingänge kommen schnell, z. 20/sec, die Reaktionszeit ist auch schnell (~ 50ms). Diese Beobachtung ist wirklich seltsam. Und macht auch die Reaktionszeit im schnellen Fall durcheinander, weil die erste Antwort immer langsam ist. Nur um sicher zu gehen - die Anwendung macht genau die gleiche Menge an Arbeit in langsamen und schnellen Fällen.

Dinge, die versucht haben, dies zu untersuchen -

  • Es ist ein Dual-Xeon-Box Linux 2.6-Kernel läuft - disabled Turbo-Boost, sorgte dafür, dass Prozessoren sind in C0 Staaten.

  • beseitigt Netzwerk Ursachen. Die Ursache liegt in der Box. (in Software oder Hardware)

  • Ich habe einen falschen Eingang durch das System von Eingang zu Ausgang auf einem Timer, um die Anwendung "warm" zu halten - keine Wirkung. (Die Worker-Threads der Anwendung sind damit beschäftigt, auf Kerne zu warten und zu merken).

  • Perf Punkte zeigen an, dass alles langsamer wird - was im Grunde bedeutet, dass die Prozessoren langsamer werden, wenn sie nicht unter Dauerlast sind - aber nichts deutet darauf hin (17z/Turbostat) oder ich lese sie falsch.

Hat jemand Farbe, was passieren könnte?

+0

Könnte es irgendwo in der Netzwerkschleife gepuffert werden? Die schnellere Antwort führt dazu, dass der Puffer früher ausgegeben wird. Die langsameren Nachrichten benötigen länger, um die Puffer zu füllen. – rts1

+0

Können Sie TCP/UDP/IP vollständig eliminieren und nur "falsche" Pakete in die vorderen Warteschlangen Ihres Programms einspeisen und die Latenz bis zum Ende messen? –

+0

Sind Busy-Waits wirklich beschäftigt? Keine Wartezeiten, Sperren, Mutexe, nur Spinlocks? – Basilevs

Antwort

-1

Meiner Erfahrung nach wären das die üblen Machenschaften von Nagles teuflischem Gerät. Klingt extrem plausibel für mich, dass mehr Daten im Puffer das TCP-Paket füllen, als gesendet werden. Ohne viele Daten wartet das TCP-Paket auf die Bestätigung von der anderen Seite, die, wie wir alle wissen, verzögert ist.

Lösung - lernen Sie, um sicherzustellen, Nagles Programm Killer deaktiviert ist die erste Sache, nachdem Sie eine sendfähige TCP-Socket erstellen.

Verwandte Themen