Medir a latência total da sessão SSH

9

Existe uma maneira de medir / relatar a latência geral em uma sessão SSH encapsulada?

Minha configuração específica é:

  • Cliente (roteador wifi do OS X + + modem ADSL)
  • Servidor SSH de gateway exposto à Internet
  • Destino de SSH interno para o qual estou tunelando

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.

    
por pufferfish 08.10.2016 / 21:43

3 respostas

5

Estava tentando fazer isso sozinho e veio com isso. Provavelmente há uma maneira mais simples, mas é isso que eu criei.

Primeiro, prepare os pipes que serão usados para fazer o programa de benchmarking se comunicar através da conexão SSH.

$ mkfifo /tmp/up /tmp/down

Em seguida, estabeleça uma conexão no modo ControlMaster sem executar nenhum comando remoto. Isso nos permite autenticar com o host de forma interativa. Depois que a conexão for estabelecida, o SSH irá apenas "travar" aqui em primeiro plano.

$ ssh $HOST -N -M -S /tmp/control

Em um terminal paralelo, execute o controle remoto cat em segundo plano. Será o nosso servidor de eco cuja latência nós mediremos. Entradas e saídas são conectadas a FIFOs:

$ ssh $HOST -S /tmp/control cat </tmp/up >/tmp/down &

E, em seguida, compare um pequeno programa (envie um byte para up FIFO, receba um byte de down FIFO):

$ python -m timeit -s 'import os' \
    'os.write(3, "z"); z=os.read(4, 1); assert z=="z", "got %s" % z' \
    3>/tmp/up 4</tmp/down
10 loops, best of 3: 24.6 msec per loop

A medida obviamente mostra a latência de ida e volta. Se você precisar repetir a experiência, execute os dois últimos comandos ( ssh e python ) novamente.

Se algo parecer errado, use o sinalizador SSH -v para obter mais resultados de depuração.

    
por 01.05.2017 / 14:41
2

Veja o utilitário sshping : link

Exemplo:

# sshping 172.16.47.143
--- Login: 1725 msec
--- Minimum Latency: 4046 nsec
---  Median Latency: 11026 nsec  +/- 0 std dev
--- Average Latency: 178105 nsec
--- Maximum Latency: 8584886 nsec
---      Echo count: 1000 Bytes
---  Transfer Speed: 11694919 Bytes/second

# sshping --help
Usage: sshping [options] [user@]addr[:port]

  SSH-based ping that measures interactive character echo latency
  and file transfer throughput.  Pronounced "shipping".

Options:
  -c  --count NCHARS   Number of characters to echo, default 1000
  -e  --echocmd CMD    Use CMD for echo command; default: cat > /dev/null
  -h  --help           Print usage and exit
  -i  --identity FILE  Identity file, ie ssh private keyfile
  -p  --password PWD   Use password PWD (can be seen, use with care)
  -r  --runtime SECS   Run for SECS seconds, instead of count limit
  -t  --tests e|s      Run tests e=echo s=speed; default es=both
  -v  --verbose        Show more output, use twice for more: -vv
    
por 25.07.2017 / 17:53
1

Ignorei alguns passos sugeridos por @ nicht-verstehen:

python -m timeit -s 'import subprocess; p = subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)' 'p.stdin.write(b"z"); assert p.stdout.read(1) == b"z"'

Onde

python -m timeit executa o módulo timeit do Python.

A opção -s informa timeit qual declaração (s) executar antes de cada repetição.

subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0) lança ssh - executando cat em seu host - como filho / subprocesso, redirecionando seus fluxos de I / O para objetos semelhantes a arquivos do 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 para cat ). p.stdout.read(1) lê um único byte do filho. A afirmação em torno disso testa se o byte é o mesmo que você escreveu para ele.

Reduz a mesma coisa, mas ignora a criação dos pipes nomeados ( mkfifo ). Notei que quanto mais loops você executa, mais rápido é cada loop. Controlá-lo usando -n : python -m timeit -n 50 ...

    
por 15.03.2018 / 09:16