SSHセッションの合計遅延を測定する


15

トンネル化されたSSHセッションの全体的な遅延を測定/報告する方法はありますか?

私の特定のセットアップは次のとおりです。

  • クライアント(OS X + wifiルーター+ ADSLモデム)
  • インターネットに公開されているゲートウェイSSHサーバー
  • トンネリング先の内部SSHターゲット

ローカルマシンのコンソールと、セッションを開いている最終マシンとの間の遅延を確認することに興味があります。


なぜ最初のサーバーにSSHトンネルし、次に2番目のサーバーに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に送信し、FIFOからバイトを受信しますdown)。

$ 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

この測定値は、往復遅延を明らかに示しています。実験を繰り返す必要がある場合は、最後の2つのコマンド(sshおよびpython)を再度実行します。

何かがうまくいかないように思われる場合は、SSH -vフラグを使用してより多くのデバッグ出力を取得します。


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 timeittimeitPythonモジュールを実行します。

この-s/--setupオプションは、timeit各繰り返しの前に実行するステートメントを指示します。

subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)起動ssh- catホスト上で実行-子/サブプロセスとして、IOストリームをPythonファイルのようなオブジェクトにリダイレクトします。bufsize=0IOがバッファリングされないようにします。これにより、IO待機が発生する可能性があります。

そして、ループごとに:
p.stdin.write(b"z")単一のバイトを子に書き込みます(順番にsshを介してcat)。
p.stdout.read(1)子から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-terminal。MacOSでこれを試すことはできません。したがって、YMMVが応答しない場合は、別の要求ターミナルに関するいくつかの情報が機能する可能性があります。http://www.termsys.demon.co.uk/vtansi.htmを参照してください


1
この答えは、ttyの内部構造にあまり慣れていない人(たとえば、なぜ\x1b[c好ましいのか)に何らかの説明を使用できます
anx

それが好ましいかどうかはわかりませんが、有効な議論だと思います:端末がサポートしていることを考えると、「デバイスステータス」termsys.demon.co.uk/vtansi.htmからのすべてが機能します。私の推測では、基本的なステータスクエリは(最低限のAlacrittyでも動作します)
wump
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.