SSH 세션의 총 대기 시간 측정


15

터널링 된 SSH 세션에서 전체 대기 시간 을 측정 /보고하는 방법이 있습니까?

내 특정 설정은 다음과 같습니다

  • 클라이언트 (OS X + wifi 라우터 + ADSL 모뎀)
  • 인터넷에 노출 된 게이트웨이 SSH 서버
  • 터널링중인 내부 SSH 대상

로컬 컴퓨터의 콘솔과 세션을 연 최종 컴퓨터 간의 대기 시간을보고 싶습니다.


SSH를 첫 번째 서버로 터널링 한 다음 SSH 콘솔을 두 번째 서버로 터널링하지 마십시오.
Bert

답변:


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

이 측정은 왕복 대기 시간을 분명히 보여줍니다. 실험을 반복해야하는 경우 마지막 두 명령 ( sshpython)을 다시 실행 하십시오.

문제가 발생하면 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 timeittimeit파이썬 모듈을 실행합니다 .

-s/--setup옵션은 timeit각 반복 전에 실행할 명령문을 알려줍니다 .

subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)출시 ssh- 실행 cat호스트에 - 아이 / 하위 프로세스로, 자사의 IO를 리디렉션 스트림 파이썬 객체 파일처럼. bufsize=0IO가 버퍼링되지 않도록하여 IO 대기를 유발할 수 있습니다.

그리고 각 루프에 대해 :
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-terminal. MacOS에서는 직접 시도 할 수 없습니다. 따라서 YMMV는 그렇지 않으면 다른 요청입니다. 터미널에 대한 정보를 조사하는 것이 작동 할 수 있습니다 ( http://www.termsys.demon.co.uk/vtansi.htm 참조 )


1
이 답변은 여전히 ​​tty internals에 익숙하지 않은 사람들을 위해 약간의 설명을 사용할 수 있습니다 (예 : \x1b[c유리한 이유 )
anx

그것이 유리한지 확실하지 않다, 나는 그것이 유효한 토론이라고 생각한다 : "장치 상태" termsys.demon.co.uk/vtansi.htm 은 터미널이 그것을 지원한다는 것을 감안할 때 작동 할 것이고, 잘 지원되는 것이 무엇인지 전혀 모른다. 내 생각은 기본 상태 쿼리 (심지어 마른 Alacritty에서 작동) 될 것입니다
wump
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.