Đo tổng độ trễ của phiên SSH


15

Có cách nào để đo lường / báo cáo độ trễ tổng thể trong phiên SSH được tạo đường hầm không?

Thiết lập cụ thể của tôi là:

  • Máy khách (bộ định tuyến OS X + wifi + modem ADSL)
  • Cổng máy chủ SSH tiếp xúc với Internet
  • Mục tiêu SSH nội bộ mà tôi đang tạo đường hầm

Tôi quan tâm đến việc xem độ trễ giữa bảng điều khiển trên máy cục bộ của tôi và máy cuối cùng mà tôi mở phiên.


Tại sao không SSH đường hầm đến máy chủ đầu tiên, và sau đó giao diện điều khiển SSH đến máy chủ thứ hai.
Bert

Câu trả lời:


6

Đã cố gắng để làm điều này bản thân mình và đưa ra điều này. Có lẽ có một cách đơn giản hơn, nhưng đây là những gì tôi nghĩ ra.

Đầu tiên, chuẩn bị các đường ống sẽ được sử dụng để làm cho chương trình đo điểm chuẩn giao tiếp thông qua kết nối SSH.

$ mkfifo /tmp/up /tmp/down

Sau đó thiết lập kết nối trong chế độ ControlMaster mà không thực hiện bất kỳ lệnh từ xa nào. Điều này cho phép chúng tôi xác thực với máy chủ tương tác. Sau khi kết nối được thiết lập, SSH sẽ chỉ "treo" ở đây trong nền trước.

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

Trong một thiết bị đầu cuối song song, thực hiện từ xa cattrong nền. Nó sẽ là máy chủ echo của chúng tôi có độ trễ mà chúng tôi sẽ đo. Đầu vào và đầu ra được kết nối với FIFO:

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

Và sau đó điểm chuẩn một chương trình nhỏ (gửi một byte đến upFIFO, nhận một byte từ 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

Các biện pháp rõ ràng cho thấy độ trễ chuyến đi khứ hồi. Nếu bạn cần lặp lại thử nghiệm, hãy chạy lại hai lệnh cuối ( sshpython).

Nếu có gì đó không ổn, hãy sử dụng -vcờ SSH để có thêm đầu ra gỡ lỗi.


4

Tôi đã bỏ qua một số bước được đề xuất bởi @ 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"'

Ở đâu

python -m timeitthực thi timeitmô-đun Python.

Các -s/--setuptùy chọn nói timeitmà statement (s) để thực hiện trước mỗi lặp lại.

subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)khởi chạy ssh- thực thi cattrên máy chủ của bạn - dưới dạng con / quy trình con, chuyển hướng các luồng IO của nó sang các đối tượng giống như tệp Python. bufsize=0đảm bảo không có IO được đệm, điều này có thể khiến IO chờ đợi.

Và đối với mỗi vòng lặp:
p.stdin.write(b"z")ghi một byte đơn cho con (lần lượt qua ssh đến cat).
p.stdout.read(1)đọc một byte đơn từ đứa trẻ. Khẳng định xung quanh nó kiểm tra xem byte đó có giống với byte mà bạn đã viết cho nó không.

Luộc xuống cùng một thứ, nhưng bỏ qua việc tạo ra các ống có tên ( mkfifo). Tôi nhận thấy rằng bạn càng chạy nhiều vòng, mỗi vòng lặp càng nhanh. Kiểm soát nó bằng cách sử dụng -n/--number:python -m timeit --number 50 ...


3

Xem sshpingtiện ích: https://github.com/spook/sshping

Thí dụ:

# 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

Ý tưởng của tôi là sử dụng các chuỗi truy vấn đầu cuối cho việc này; Ưu điểm là đơn giản là có thể chạy trên máy chủ, nhược điểm là đo độ trễ của thiết bị đầu cuối, không chỉ độ trễ của kết nối (mà tôi đoán, thông thường, thời gian phản hồi của thiết bị đầu cuối của bạn sẽ không đáng kể so với độ trễ của mạng) đây thậm chí là những gì bạn có ý nghĩa với độ trễ tổng thể

#!/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)

(Điều này sử dụng "Truy vấn mã thiết bị", tất cả các thiết bị đầu cuối mà tôi đã thử trả lời: xterm, alacritty, gnome-terminal. Tôi không thể tự mình thử điều này trên MacOS. thẩm vấn một số thông tin về thiết bị đầu cuối có thể hoạt động, xem http://www.termsys.demon.co.uk/vtansi.htm )


1
Câu trả lời này vẫn có thể sử dụng một số lời giải thích cho những người không quen thuộc với nội bộ tty (ví dụ: tại sao \x1b[csẽ thuận lợi)
lắng

không chắc là nó thuận lợi, tôi nghĩ đó là một cuộc thảo luận hợp lệ: bất kỳ từ "Trạng thái thiết bị" termsys.demon.co.uk/vtansi.htmlm sẽ hoạt động, do thiết bị đầu cuối hỗ trợ và tôi không biết những gì được hỗ trợ tốt, nhưng tôi không biết những gì được hỗ trợ tốt, nhưng Tôi đoán là truy vấn trạng thái cơ bản sẽ là (thậm chí hoạt động trong Alacritty xương trần)
wump
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.