¿Hay alguna manera de medir / informar la latencia general en una sesión de SSH tunelizada?
Mi configuración particular es:
- Cliente (OS X + enrutador wifi + módem ADSL)
- Servidor Gateway SSH expuesto a Internet
- Objetivo SSH interno al que estoy haciendo un túnel
Estoy interesado en ver la latencia entre la consola en mi máquina local y la máquina final en la que tengo abierta la sesión.
networking
ssh
performance-monitoring
latency
pez globo
fuente
fuente
Respuestas:
Estaba tratando de hacer esto yo mismo y se me ocurrió esto. Probablemente hay una manera más simple, pero esto es lo que se me ocurrió.
Primero, prepare las tuberías que se utilizarán para que el programa de evaluación comparativa se comunique a través de la conexión SSH.
Luego establezca una conexión en modo ControlMaster sin ejecutar ningún comando remoto. Esto nos permite autenticarnos con el host de forma interactiva. Una vez establecida la conexión, SSH simplemente se "colgará" aquí en primer plano.
En una terminal paralela, ejecute remoto
cat
en segundo plano. Será nuestro servidor de eco cuya latencia mediremos. Las entradas y salidas están conectadas a FIFOs:Y luego compara un pequeño programa (envía un byte a
up
FIFO, recibe un byte dedown
FIFO):La medida obviamente muestra la latencia de ida y vuelta. Si necesita repetir el experimento, ejecute los dos últimos comandos (
ssh
ypython
) nuevamente.Si algo parece salir mal, use el
-v
indicador SSH para obtener más resultados de depuración.fuente
Me salté algunos pasos sugeridos por @ nicht-verstehen:
Dónde
python -m timeit
Ejecuta eltimeit
módulo Python.La
-s/--setup
opción le dicetimeit
qué declaración (s) ejecutar antes de cada repetición.subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)
se iniciassh
, ejecutándosecat
en su host, como un hijo / subproceso, redirigiendo sus secuencias de E / S a objetos similares a archivos de Python.bufsize=0
se asegura de que no se almacenen IO, lo que puede provocar que IO espere.Y para cada ciclo:
p.stdin.write(b"z")
escribe un solo byte en el hijo (a su vez a través de sshcat
).p.stdout.read(1)
lee un solo byte del niño. La afirmación a su alrededor prueba si ese byte es el mismo que le escribió.Se reduce a lo mismo, pero omite la creación de las canalizaciones con nombre (
mkfifo
). Noté que cuantos más bucles ejecutes, más rápido será cada bucle. Controlarlo usando-n/--number
:python -m timeit --number 50 ...
fuente
Vea la
sshping
utilidad: https://github.com/spook/sshpingEjemplo:
fuente
Mi idea era usar secuencias de consulta de terminal para esto; la ventaja es que esto simplemente se puede ejecutar en el servidor, la desventaja es que mide la latencia del terminal, no solo la latencia de la conexión (sino que supongo que, por lo general, el tiempo de respuesta de su terminal será insignificante en comparación con los retrasos de la red), tal vez esto es incluso lo que quieres decir con latencia general
(Esto usa "Device Code Query", todos los terminales que he intentado responden a esto: xterm, alacritty, gnome-terminal. No puedo probar esto en MacOS. Entonces YMMV, si este no lo hace, otra de las solicitudes para consultar información sobre el terminal que podría funcionar, consulte http://www.termsys.demon.co.uk/vtansi.htm )
fuente
\x1b[c
sería favorable)