TL; DR versiyonu
Bu ASCII kadrosunu veya bu videoyu izleyin - ardından bunun gerçekleşmesinin herhangi bir nedenini bulun. Aşağıdaki metin açıklaması daha fazla bağlam sağlar.
Kurulum ayrıntıları
- Makine 1,
ssh
Armbian çalışan bir SBC'ye (Turuncu PI Sıfır) bağlanan bir Arch Linux dizüstü bilgisayardır . - SBC'nin kendisi Ethernet üzerinden bir DSL yönlendiriciye bağlıdır ve 192.168.1.150'lik bir IP'ye sahiptir.
- Dizüstü bilgisayar, resmi bir Ahududu PI WiFi dongle'ı kullanarak WiFi üzerinden yönlendiriciye bağlanır.
- Ethernet üzerinden DSL yönlendiriciye bağlı başka bir dizüstü bilgisayar (Makine 2) var.
Bağlantıyı iperf3 ile karşılaştırma
İle benchmarked zaman iperf3
laptop arasındaki bağlantıyı ve SBC az teorik 56 Mbit / sn daha - beklendiği gibi, bu çok "kalabalık 2.4GHz" içinde WiFi bağlantısı olduğundan (apartmanın) .
Daha spesifik olarak: iperf3 -s
SBC üzerinde çalıştıktan sonra , dizüstü bilgisayarda aşağıdaki komutlar yürütülür:
# iperf3 -c 192.168.1.150
Connecting to host 192.168.1.150, port 5201
[ 5] local 192.168.1.89 port 57954 connected to 192.168.1.150 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 2.99 MBytes 25.1 Mbits/sec 0 112 KBytes
...
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 28.0 MBytes 23.5 Mbits/sec 5 sender
[ 5] 0.00-10.00 sec 27.8 MBytes 23.4 Mbits/sec receiver
iperf Done.
# iperf3 -c 192.168.1.150 -R
Connecting to host 192.168.1.150, port 5201
Reverse mode, remote host 192.168.1.150 is sending
[ 5] local 192.168.1.89 port 57960 connected to 192.168.1.150 port 5201
[ ID] Interval Transfer Bitrate
[ 5] 0.00-1.00 sec 3.43 MBytes 28.7 Mbits/sec
...
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 39.2 MBytes 32.9 Mbits/sec 375 sender
[ 5] 0.00-10.00 sec 37.7 MBytes 31.6 Mbits/sec receiver
Temel olarak, SBC'ye yükleme yaklaşık 24MBits / sn'ye ve ondan indirme ( -R
) 32MBits / sn'ye ulaşır.
SSH ile karşılaştırma
Bu göz önüne alındığında, SSH'nin nasıl yürüdüğüne bakalım. İlk önce bu gönderiye yol açan sorunları yaşadım rsync
ve borgbackup
her ikisi de SSH'yi bir taşıma katmanı olarak kullanıyor ... Öyleyse SSH'nin aynı bağlantıda nasıl performans gösterdiğini görelim:
# cat /dev/urandom | \
pv -ptebar | \
ssh root@192.168.1.150 'cat >/dev/null'
20.3MiB 0:00:52 [ 315KiB/s] [ 394KiB/s]
Bu berbat bir hız! Beklenen bağlantı hızından çok daha yavaş ...
(Farkında değilseniz pv -ptevar
: geçerli ve ortalama veri hızını gösterir. Bu durumda /dev/urandom
SSH üzerinden veri okumayı ve SBC'ye veri göndermeyi görüyoruz. ortalama 400 KB / sn'ye ulaşıyor - yani 3,2 MB / sn, beklenen 24 MB / sn'den çok daha az bir rakam.)
Bağlantımız neden kapasitesinin% 13'ünde çalışıyor?
Belki de bizim /dev/urandom
hatamız mı?
# cat /dev/urandom | pv -ptebar > /dev/null
834MiB 0:00:04 [ 216MiB/s] [ 208MiB/s]
Hayır, kesinlikle hayır.
Belki SBC'nin kendisi midir? Belki de işlemek için çok yavaş? Aynı SSH komutunu (yani SBC'ye veri gönderme) çalıştırmayı deneyelim, ancak bu sefer Ethernet üzerinden bağlı başka bir makineden (Makine 2):
# cat /dev/urandom | \
pv -ptebar | \
ssh root@192.168.1.150 'cat >/dev/null'
240MiB 0:00:31 [10.7MiB/s] [7.69MiB/s]
Hayır, bu iyi çalışıyor - SBC'deki SSH arka plan programı Ethernet bağlantısının sağladığı 11MBytes / sn (yani 100MBits / sn) işleyebilir (kolayca).
Ve bunu yaparken SBC'nin CPU'su yüklü mü?
Hayır!
Yani...
- ağ üzerinden (başına
iperf3
) hızı 10 kat yapabilmeliyiz - CPU'muz yükü kolayca kaldırabilir
- ... ve başka herhangi bir I / O (örneğin sürücüler) içermiyoruz.
Ne halt oluyor?
Netcat ve Proxy
Basit eski netcat
bağlantıları deneyelim - beklediğimiz kadar hızlı çalışıyorlar mı?
SBC'de:
# nc -l -p 9988 | pv -ptebar > /dev/null
Dizüstü bilgisayarda:
# cat /dev/urandom | pv -ptebar | nc 192.168.1.150 9988
117MiB 0:00:33 [3.82MiB/s] [3.57MiB/s]
İşe yarıyor! Ve beklenen hızda - çok daha iyi, 10 kat daha iyi - çalışır.
Peki SSC'yi nc kullanmak için bir ProxyCommand kullanarak çalıştırırsam ne olur?
# cat /dev/urandom | \
pv -ptebar | \
ssh -o "Proxycommand nc %h %p" root@192.168.1.150 'cat >/dev/null'
101MiB 0:00:30 [3.38MiB/s] [3.33MiB/s]
İşler! 10x hız.
Şimdi biraz kafam karıştı - bir "çıplak" nc
olarak kullanırken Proxycommand
, temelde SSH'nin yaptığı ile aynı şeyi yapmıyor musunuz? yani bir soket oluşturmak, SBC'nin portuna 22 bağlanmak ve sonra SSH protokolünü bunun üzerine küreklemek mi?
Ortaya çıkan hızda neden bu kadar büyük bir fark var?
Not: Bu akademik bir çalışma değildi - borg
yedeklemem bundan dolayı 10 kat daha hızlı çalışıyor. Neden bilmiyorum :-)
EDIT : Buraya sürecin bir "video" eklendi . İfconfig çıktısından gönderilen paketleri sayarsak, her iki testte de 40MB veri gönderiyoruz, bunları yaklaşık 30K pakette gönderiyoruz - kullanmadığınızda çok daha yavaş ProxyCommand
.
nc
tamponlama kullanır ikenssh
, tamponlama kullanır düşünürdüm . Yani (ya da öyleyse) ssh trafiği daha fazla paket içerir.