SSH oturumunun toplam gecikmesini ölçme


15

Tünelli SSH oturumundaki toplam gecikmeyi ölçmenin / raporlamanın bir yolu var mı ?

Benim özel kurulum:

  • İstemci (OS X + wifi yönlendirici + ADSL modem)
  • Internet'e maruz kalan ağ geçidi SSH sunucusu
  • Tünel oluşturduğum dahili SSH hedefi

Yerel makinemdeki konsol ile oturumu açtığım son makine arasındaki gecikmeyi görmek istiyorum.


Neden ilk sunucuya SSH tüneli, sonra ikinci sunucuya SSH konsolu.
Bert

Yanıtlar:


6

Bunu kendim yapmaya çalışıyordum ve bunu buldum. Muhtemelen daha basit bir yol var, ama bulduğum şey bu.

İlk olarak, kıyaslama programının SSH bağlantısı üzerinden iletişim kurmasını sağlamak için kullanılacak boruları hazırlayın.

$ mkfifo /tmp/up /tmp/down

Ardından, herhangi bir uzak komut yürütmeden ControlMaster modunda bir bağlantı oluşturun. Bu, ana bilgisayarla etkileşimli olarak kimlik doğrulamamıza izin verir. Bağlantı kurulduktan sonra, SSH burada ön planda "asılır".

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

Paralel bir terminalde, uzaktan kumandayı catarka planda çalıştırın . Gecikmesini ölçeceğimiz yankı sunucumuz olacak. Girişler ve çıkışlar FIFO'lara bağlanır:

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

Ve sonra küçük bir programı kıyaslayın ( upFIFO'ya bir bayt gönderin , FIFO'dan bir bayt alın 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

Ölçüm, gidiş-dönüş gecikmesini açıkça göstermektedir. Denemeyi tekrarlamanız gerekiyorsa, son iki komutu ( sshve python) tekrar çalıştırın.

Bir şeyler ters giderse, -vdaha fazla hata ayıklama çıktısı almak için SSH bayrağını kullanın.


4

@ Nicht-verstehen tarafından önerilen bazı adımları atladım:

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"'

Nerede

python -m timeittimeitPython modülünü yürütür .

-s/--setupSeçenek söyler timeither tekrarlanan önce yürütmek için hangi ifadeyi (ler).

subprocess.Popen(["ssh", "user@host", "cat"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=0)IO akışlarını Python dosya benzeri nesnelere yönlendirerek bir alt / alt işlem olarak ana makinenizde sshyürütme işlemini başlatır cat. bufsize=0GÇ arabelleklenmediğinden emin olur, bu da GÇ beklemesine neden olabilir.

Ve her döngü için:
p.stdin.write(b"z")çocuğa tek bir bayt yazar (sırayla ssh ile cat).
p.stdout.read(1)çocuktan tek bir bayt okur. Etrafındaki iddia, bu baytın ona yazdığınızla aynı olup olmadığını test eder.

Aynı şeyle kaynar, ancak adlandırılmış yöneltmeler ( mkfifo) oluşturmayı atlar . Ne kadar çok döngü çalıştırırsanız, her döngü o kadar hızlı olur. Şunları kullanarak kontrol edin -n/--number:python -m timeit --number 50 ...


3

sshpingYardımcı programa bakın : https://github.com/spook/sshping

Misal:

# 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

Benim fikrim bunun için terminal sorgu dizileri kullanmak oldu; avantajı, bu sadece sunucuda çalıştırılabilir olması, dezavantajı, sadece bağlantının gecikmesini değil, aynı zamanda terminal gecikme süresini de ölçmektir (ancak, genellikle, terminalinizin yanıt süresinin ağ gecikmelerine kıyasla önemsiz olacağını) - belki Genel gecikme ile ne demek istediğin budur

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

(Bu, "Aygıt Kodu Sorgusu" kullanır, denediğim tüm terminaller şu yanıtı verir: xterm, alacritty, gnome-terminal. Bunu MacOS'ta kendim deneyemiyorum. terminal hakkında bazı bilgileri sorgulayanlar işe yarayabilir, bkz. http://www.termsys.demon.co.uk/vtansi.htm )


1
Bu cevap hala tty içlerine aşina olmayanlar için bazı açıklamaları kullanabilir (örneğin, neden \x1b[columlu olur)
anx

uygun olmadığından emin değilim, geçerli bir tartışma olduğunu düşünüyorum: herhangi bir "Aygıt Durumu" termsys.demon.co.uk/vtansi.htm işe yarar , terminal desteklediği göz önüne alındığında, ve neyin iyi desteklendiğine dair hiçbir fikrim yok, ancak benim tahminim temel durum sorgusu olurdu (hatta çıplak kemiklerde çalışır Alacritty)
wump
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.