Existe uma maneira de medir / relatar a latência geral em uma sessão SSH encapsulada?
Minha configuração particular é:
- Cliente (OS X + roteador wifi + modem ADSL)
- Servidor SSH do gateway exposto à Internet
- Alvo SSH interno para o qual estou encapsulando
Estou interessado em ver a latência entre o console na minha máquina local e a máquina final na qual tenho a sessão aberta.
Respostas:
Estava tentando fazer isso sozinho e veio com isso. Provavelmente, existe uma maneira mais simples, mas é isso que eu criei.
Primeiro, prepare os tubos que serão usados para fazer o programa de benchmarking se comunicar através da conexão SSH.
Em seguida, estabeleça uma conexão no modo ControlMaster sem executar nenhum comando remoto. Isso nos permite autenticar interativamente o host. Depois que a conexão for estabelecida, o SSH simplesmente "travará" aqui em primeiro plano.
Em um terminal paralelo, execute o controle remoto
cat
em segundo plano. Será o nosso servidor de eco cuja latência mediremos. As entradas e saídas estão conectadas aos FIFOs:E, em seguida, avalie um programa pequeno (envie um byte para o
up
FIFO, receba um byte dodown
FIFO):A medida obviamente mostra a latência de ida e volta. Se você precisar repetir o experimento, execute os dois últimos comandos (
ssh
epython
) novamente.Se algo parece dar errado, use o
-v
sinalizador SSH para obter mais resultados de depuração.fonte
Eu pulei alguns passos sugeridos por @ nicht-verstehen:
Onde
python -m timeit
executa otimeit
módulo Python.A
-s/--setup
opção informatimeit
quais instruções executar antes de cada repetição.subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)
lançassh
- executandocat
em seu host - como filho / subprocesso, redirecionando seus fluxos de E / S para objetos semelhantes a arquivos Python.bufsize=0
garante que nenhum IO seja armazenado em buffer, o que pode causar esperas de IO.E para cada loop:
p.stdin.write(b"z")
escreve um único byte para o filho (por sua vez, através de ssh paracat
).p.stdout.read(1)
lê um único byte da criança. A afirmação em torno dele testa se esse byte é igual ao que você escreveu para ele.Tudo se resume à mesma coisa, mas pula a criação dos pipes nomeados (
mkfifo
). Percebi que quanto mais loops você executa, mais rápido é o loop. Controle usando-n/--number
:python -m timeit --number 50 ...
fonte
Veja o
sshping
utilitário: https://github.com/spook/sshpingExemplo:
fonte
Minha idéia era usar seqüências de consulta de terminal para isso; a vantagem é que isso pode ser simplesmente executado no servidor, a desvantagem é que ele mede a latência do terminal, não apenas a latência da conexão (mas acho que, geralmente, o tempo de resposta do seu terminal será insignificante em comparação com os atrasos da rede) - talvez é isso que você quer dizer com latência geral
(Ele usa "Device Code Query", todos os terminais que eu tentei responder a isso: xterm, alacritty, gnome-terminal. Eu não posso tentar isso no MacOS. Então YMMV, se esse não for, outro dos pedidos para interrogar algumas informações sobre o terminal, consulte http://www.termsys.demon.co.uk/vtansi.htm )
fonte
\x1b[c
seria favorável)