Измерение общей задержки сеанса SSH


15

Есть ли способ измерить / сообщить об общей задержке в туннельном сеансе SSH?

Моя конкретная настройка:

  • Клиент (OS X + Wi-Fi роутер + ADSL модем)
  • SSH-сервер шлюза, подключенный к Интернету
  • Внутренняя цель SSH, к которой я туннелирую

Мне интересно увидеть задержку между консолью на моей локальной машине и конечной машиной, на которой у меня открыт сеанс.


Почему бы не SSH туннелировать на первый сервер, а затем SSH консоль на второй сервер.
Берт

Ответы:


6

Пытался сделать это сам и придумал это. Возможно, есть более простой способ, но это то, что я придумал.

Во-первых, подготовьте каналы, которые будут использоваться для обеспечения связи программы бенчмаркинга через соединение SSH.

$ mkfifo /tmp/up /tmp/down

Затем установите соединение в режиме ControlMaster, не выполняя никаких удаленных команд. Это позволяет нам проходить аутентификацию на хосте в интерактивном режиме. После того, как соединение установлено, SSH просто «зависнет» здесь на переднем плане.

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

В параллельном терминале выполните удаленное управление catв фоновом режиме. Это будет наш эхо-сервер, задержку которого мы будем измерять. Входы и выходы подключены к FIFO:

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

Затем выполните тестирование небольшой программы (отправьте байт в upFIFO, получите байт из downFIFO):

$ 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

Мера явно показывает задержку туда и обратно. Если вам нужно повторить эксперимент, запустите последние две команды ( sshи python) еще раз.

Если что-то идет не так, используйте -vфлаг SSH, чтобы получить больше результатов отладки.


4

Я пропустил несколько шагов, предложенных @ nicht-verstehen:

python -m timeit --setup '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"'

где

python -m timeitвыполняет timeitмодуль Python.

-s/--setupОпция указывает , timeitкакой оператор (ы) для выполнения перед каждым повтором.

subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)запускает ssh- исполняется catна вашем хосте - как дочерний / подпроцесс, перенаправляя свои потоки ввода-вывода в объекты, похожие на файлы Python. bufsize=0обеспечивает отсутствие буферизации ввода-вывода, что может привести к ожиданию ввода-вывода.

И для каждого цикла:
p.stdin.write(b"z")записывает отдельный байт для потомка (по очереди через ssh в cat).
p.stdout.read(1)читает один байт от ребенка. Утверждение вокруг него проверяет, совпадает ли этот байт с тем, который вы ему написали.

Сводится к тому же, но пропускает создание именованных каналов ( mkfifo). Я заметил, что чем больше циклов вы выполняете, тем быстрее работает каждый цикл. Управляйте им, используя -n/--number:python -m timeit --number 50 ...


3

Смотрите sshpingутилиту: https://github.com/spook/sshping

Пример:

# 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

0

Моя идея состояла в том, чтобы использовать терминальные последовательности запросов для этого; Преимущество состоит в том, что это можно просто запустить на сервере, недостатком является то, что он измеряет задержку терминала, а не только задержку соединения (но я думаю, обычно время отклика вашего терминала будет незначительным по сравнению с задержками в сети) - возможно, это даже то, что вы имеете в виду с общей задержкой

#!/usr/bin/env python3
# Measure terminal latency (round-trip time) using "Query device code" command
from sys import stdin, stdout
import tty, termios, time

oldtty = termios.tcgetattr(stdin)
try:
    tty.setcbreak(stdout)

    runs = 10
    results = []
    for _ in range(runs):
        stdout.write("\x1b[c")
        stdout.flush()
        t1 = time.time()
        ch = stdin.read(1)
        assert(ch == '\x1b')
        t2 = time.time()
        while stdin.read(1) != 'c': # swallow rest of report
            continue
        latency = (t2 - t1) * 1000
        print('%.1fms' % (latency))
        results.append(latency)

    print()
    print('avg: %.1fms min: %.1fms max: %.1fms' % (
        sum(results) / runs,
        min(results),
        max(results)))
finally:
    termios.tcsetattr(stdin, termios.TCSADRAIN, oldtty)

(При этом используется «Запрос кода устройства», все терминалы, которые я пытался ответить, отвечают на это: xterm, alacritty, gnome-терминал. Я не могу сам попробовать это на MacOS. Так что YMMV, если это не так, другой запрос) которые запрашивают некоторую информацию о терминале может работать, см. http://www.termsys.demon.co.uk/vtansi.htm )


1
Ответ на этот вопрос все еще может использовать какое - то объяснение для тех , кто не знаком с TTY внутренностей (например, почему \x1b[cбы выгодно)
апх

не уверен, что это выгодно, я думаю, что это правильное обсуждение: любой из "Состояние устройства" будет работать под управлениемysys.demon.co.uk/ vtansi.htm , учитывая, что терминал поддерживает его, и я не знаю, что хорошо поддерживается, но Я предполагаю, что основной запрос статуса будет (даже работает в Alacritty голыми костями)
Wump
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.