Есть ли способ измерить / сообщить об общей задержке в туннельном сеансе SSH?
Моя конкретная настройка:
- Клиент (OS X + Wi-Fi роутер + ADSL модем)
- SSH-сервер шлюза, подключенный к Интернету
- Внутренняя цель SSH, к которой я туннелирую
Мне интересно увидеть задержку между консолью на моей локальной машине и конечной машиной, на которой у меня открыт сеанс.
networking
ssh
performance-monitoring
latency
рыба фугу
источник
источник
Ответы:
Пытался сделать это сам и придумал это. Возможно, есть более простой способ, но это то, что я придумал.
Во-первых, подготовьте каналы, которые будут использоваться для обеспечения связи программы бенчмаркинга через соединение SSH.
Затем установите соединение в режиме ControlMaster, не выполняя никаких удаленных команд. Это позволяет нам проходить аутентификацию на хосте в интерактивном режиме. После того, как соединение установлено, SSH просто «зависнет» здесь на переднем плане.
В параллельном терминале выполните удаленное управление
cat
в фоновом режиме. Это будет наш эхо-сервер, задержку которого мы будем измерять. Входы и выходы подключены к FIFO:Затем выполните тестирование небольшой программы (отправьте байт в
up
FIFO, получите байт изdown
FIFO):Мера явно показывает задержку туда и обратно. Если вам нужно повторить эксперимент, запустите последние две команды (
ssh
иpython
) еще раз.Если что-то идет не так, используйте
-v
флаг SSH, чтобы получить больше результатов отладки.источник
Я пропустил несколько шагов, предложенных @ nicht-verstehen:
где
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 ...
источник
Смотрите
sshping
утилиту: https://github.com/spook/sshpingПример:
источник
Моя идея состояла в том, чтобы использовать терминальные последовательности запросов для этого; Преимущество состоит в том, что это можно просто запустить на сервере, недостатком является то, что он измеряет задержку терминала, а не только задержку соединения (но я думаю, обычно время отклика вашего терминала будет незначительным по сравнению с задержками в сети) - возможно, это даже то, что вы имеете в виду с общей задержкой
(При этом используется «Запрос кода устройства», все терминалы, которые я пытался ответить, отвечают на это: xterm, alacritty, gnome-терминал. Я не могу сам попробовать это на MacOS. Так что YMMV, если это не так, другой запрос) которые запрашивают некоторую информацию о терминале может работать, см. http://www.termsys.demon.co.uk/vtansi.htm )
источник
\x1b[c
бы выгодно)