有没有办法测量/报告全面的隧道 SSH 会话中的延迟?
我的具体设置是:
- 客户端(OS X + wifi路由器 + ADSL调制解调器)
- 网关 SSH 服务器暴露于互联网
- 我正在通过隧道连接到的内部 SSH 目标
我有兴趣查看本地计算机上的控制台与打开会话的最终计算机之间的延迟。
答案1
查看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
答案2
我跳过了@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
在您的主机上执行 - 作为子进程/子进程,将其 IO 流重定向到 Python 类文件对象。bufsize=0
确保没有 IO 被缓冲,这可能会导致 IO 等待。
对于每个循环:
p.stdin.write(b"z")
向子进程写入一个字节(依次通过 ssh 到cat
)。
p.stdout.read(1)
从子进程读取一个字节。它周围的断言测试该字节是否与您写入的字节相同。
归结为同一件事,但跳过了创建命名管道(mkfifo
)。我注意到,运行的循环越多,每个循环的速度就越快。使用以下方法控制它-n/--number
:python -m timeit --number 50 ...
答案3
我自己也尝试过,然后想到了这个。可能还有更简单的方法,但这就是我想到的。
首先,准备用于使基准测试程序通过 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 &
然后对一个小程序进行基准测试(向up
FIFO 发送一个字节,从 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
该测量结果明显显示了往返延迟。如果您需要重复实验,请再次运行最后两个命令(ssh
和python
)。
如果出现问题,请使用 SSH-v
标志来获取更多调试输出。
答案4
ssh_ping
如果你已经安装了 Go,那么这是一个小型的 Go 程序,它比另一个答案中的 C ++ 程序更容易构建(如果你没有安装,它和brew install go
在 macOS 上一样简单):
> go install github.com/jacobsa/ssh_ping
> ssh_ping --host some.host.com
100 samples so far...
200 samples so far...
Collected 294 samples.
Min: 13.0 ms
p05: 13.6 ms
p50: 13.0 ms
p95: 21.1 ms
Max: 26.0 ms
Mean: 17.0 ms
Std. dev: 2.6 ms