Gibt es eine Möglichkeit, die Gesamtlatenz in einer getunnelten SSH-Sitzung zu messen / zu melden ?
Mein spezielles Setup ist:
- Client (OS X + WLAN-Router + ADSL-Modem)
- Gateway-SSH-Server, der dem Internet ausgesetzt ist
- Internes SSH-Ziel, zu dem ich tunnele
Ich möchte die Latenz zwischen der Konsole auf meinem lokalen Computer und dem letzten Computer sehen, auf dem die Sitzung geöffnet ist.
networking
ssh
performance-monitoring
latency
Kugelfisch
quelle
quelle
Antworten:
Ich habe versucht, dies selbst zu tun, und habe es mir ausgedacht. Wahrscheinlich gibt es einen einfacheren Weg, aber das habe ich mir ausgedacht.
Bereiten Sie zunächst Pipes vor, mit denen das Benchmarking-Programm über die SSH-Verbindung kommuniziert.
Stellen Sie dann im ControlMaster-Modus eine Verbindung her, ohne einen Remote-Befehl auszuführen. Auf diese Weise können wir uns interaktiv beim Host authentifizieren. Nachdem die Verbindung hergestellt wurde, "hängt" SSH hier im Vordergrund.
Führen Sie
cat
in einem parallelen Terminal remote im Hintergrund aus. Es wird unser Echoserver sein, dessen Latenz wir messen werden. Ein- und Ausgänge sind mit FIFOs verbunden:Und dann ein kleines Programm benchmarken (ein Byte an
up
FIFO senden , ein Byte vomdown
FIFO empfangen ):Das Maß zeigt offensichtlich die Round-Trip-Latenz. Wenn Sie den Test wiederholen müssen, führen Sie die letzten beiden Befehle (
ssh
undpython
) erneut aus.Wenn etwas schief zu gehen scheint, verwenden Sie das SSH-
-v
Flag, um mehr Debugging-Ausgaben zu erhalten.quelle
Ich habe einige von @ nicht-verstehen vorgeschlagene Schritte übersprungen:
Wo
python -m timeit
Führt dastimeit
Python-Modul aus.Die
-s/--setup
Option gibt an,timeit
welche Anweisung (en) vor jeder Wiederholung ausgeführt werden sollen.subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)
Kutterssh
- Ausführungcat
dateiähnliche Objekte als Kind / subprocess, seine IO - Streams zu Python Umleitung - auf dem Host.bufsize=0
Stellt sicher, dass keine E / A gepuffert ist, was zu E / A-Wartezeiten führen kann.Und für jede Schleife:
p.stdin.write(b"z")
Schreibt ein einzelnes Byte an das Kind (wiederum durch ssh biscat
).p.stdout.read(1)
Liest ein einzelnes Byte vom Kind. Die Behauptung dahinter prüft, ob dieses Byte mit dem Byte übereinstimmt, das Sie geschrieben haben.Läuft auf dasselbe hinaus, überspringt jedoch das Erstellen der Named Pipes (
mkfifo
). Mir ist aufgefallen, dass jede Schleife umso schneller ist, je mehr Schleifen Sie ausführen. Steuern Sie es mit-n/--number
:python -m timeit --number 50 ...
quelle
Siehe das
sshping
Dienstprogramm: https://github.com/spook/sshpingBeispiel:
quelle
Meine Idee war, dafür Terminal-Abfragesequenzen zu verwenden. Der Vorteil ist, dass dies einfach auf dem Server ausgeführt werden kann. Der Nachteil ist, dass die Terminal-Latenz gemessen wird, nicht nur die Latenz der Verbindung (aber die Antwortzeit Ihres Terminals ist im Vergleich zu Netzwerkverzögerungen in der Regel vernachlässigbar) das ist auch das, was Sie mit meiner Gesamtlatenz
(Hierfür wird "Gerätecode-Abfrage" verwendet. Alle Terminals, die ich versucht habe, antworten darauf: xterm, alacritty, gnome-terminal. Ich kann dies unter MacOS nicht selbst ausprobieren. Wenn dies nicht der Fall ist, ist dies eine weitere Anforderung von YMMV Diese Abfrage einiger Informationen über das Terminal funktioniert möglicherweise (siehe http://www.termsys.demon.co.uk/vtansi.htm ).
quelle
\x1b[c
wäre günstig)