Czy istnieje sposób pomiaru / zgłaszania całkowitego opóźnienia w tunelowanej sesji SSH?
Moja szczególna konfiguracja to:
- Klient (OS X + router Wi-Fi + modem ADSL)
- Serwer SSH bramy narażony na działanie Internetu
- Wewnętrzny cel SSH, do którego tuneluję
Chcę zobaczyć opóźnienie między konsolą na moim komputerze lokalnym a komputerem końcowym, na którym mam otwartą sesję.
networking
ssh
performance-monitoring
latency
rozdymka tygrysia
źródło
źródło
Odpowiedzi:
Próbowałem to zrobić sam i wymyśliłem to. Prawdopodobnie istnieje prostszy sposób, ale to właśnie wymyśliłem.
Najpierw przygotuj potoki, które będą używane do komunikacji programu porównawczego za pośrednictwem połączenia SSH.
Następnie nawiąż połączenie w trybie ControlMaster bez wykonywania polecenia zdalnego. Pozwala nam to na interaktywną identyfikację z hostem. Po ustanowieniu połączenia SSH po prostu „zawiesi się” na pierwszym planie.
W terminalu równoległym uruchom zdalnie
cat
w tle. Będzie to nasz serwer echa, którego opóźnienie będziemy mierzyć. Wejścia i wyjścia są podłączone do FIFO:A następnie przetestuj mały program (wyślij bajt do
up
FIFO, odbierz bajt oddown
FIFO):Miara oczywiście pokazuje opóźnienie w obie strony. Jeśli chcesz powtórzyć eksperyment, ponownie uruchom ostatnie dwa polecenia (
ssh
ipython
).Jeśli coś pójdzie nie tak, użyj
-v
flagi SSH, aby uzyskać więcej wyników debugowania.źródło
Pominąłem kilka kroków sugerowanych przez @ nicht-verstehen:
Gdzie
python -m timeit
wykonujetimeit
moduł Python.Ta
-s/--setup
opcja informuje,timeit
które instrukcje należy wykonać przed każdym powtórzeniem.subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)
uruchamia sięssh
- uruchamiająccat
na twoim hoście - jako podrzędny / podproces, przekierowując swoje strumienie IO do obiektów podobnych do plików Pythona.bufsize=0
upewnia się, że żadne IO nie jest buforowane, co może powodować, że IO czeka.I dla każdej pętli:
p.stdin.write(b"z")
zapisuje jeden bajt do dziecka (z kolei przez ssh docat
).p.stdout.read(1)
czyta pojedynczy bajt od dziecka. Twierdzenie wokół niego sprawdza, czy ten bajt jest taki sam, jak napisany do niego.Sprowadza się do tego samego, ale pomija tworzenie nazwanych potoków (
mkfifo
). Zauważyłem, że im więcej uruchomisz pętli, tym szybciej będzie każda pętla. Kontroluj za pomocą-n/--number
:python -m timeit --number 50 ...
źródło
Zobacz
sshping
narzędzie: https://github.com/spook/sshpingPrzykład:
źródło
Moim pomysłem było użycie do tego terminalnych zapytań; zaletą jest to, że można to po prostu uruchomić na serwerze, wadą jest to, że mierzy opóźnienie terminala, nie tylko opóźnienie połączenia (ale myślę, że zwykle czas odpowiedzi twojego terminalu będzie nieznaczny w porównaniu do opóźnień sieciowych) - może to nawet masz na myśli ogólne opóźnienie
(Używa "Zapytania o kod urządzenia", wszystkie terminale, na które próbowałem odpowiedzieć: xterm, alacritty, gnome-terminal. Nie mogę sam tego wypróbować na MacOS. Więc YMMV, jeśli nie, kolejna prośba które sprawdzają niektóre informacje o terminalu mogą działać, patrz http://www.termsys.demon.co.uk/vtansi.htm )
źródło
\x1b[c
zawierać wyjaśnienie dla osób, które nie są tak zaznajomione z wewnętrznymi elementami tty (np. Dlaczego miałby być korzystny)