Phiên bản TL; DR
Xem diễn viên ASCII này hoặc video này - sau đó đưa ra bất kỳ lý do tại sao điều này xảy ra. Mô tả văn bản sau đây cung cấp nhiều bối cảnh hơn.
Chi tiết thiết lập
- Máy 1 là máy tính xách tay Arch Linux, trên đó
ssh
được sinh ra, kết nối với SBC chạy bằng tiếng Armenia (Orange PI Zero). - Bản thân SBC được kết nối qua Ethernet với bộ định tuyến DSL và có IP là 192.168.1.150
- Máy tính xách tay được kết nối với bộ định tuyến qua WiFi - sử dụng khóa Raspberry PI WiFi chính thức.
- Ngoài ra còn có một máy tính xách tay khác (Máy 2) được kết nối qua Ethernet với bộ định tuyến DSL.
Điểm chuẩn liên kết với iperf3
Khi được điểm chuẩn iperf3
, liên kết giữa máy tính xách tay và SBC nhỏ hơn 56 MBits / giây trên lý thuyết - như mong đợi, vì đây là kết nối WiFi trong một " tòa nhà chung cư " rất đông đúc .
Cụ thể hơn: sau khi chạy iperf3 -s
trên SBC, các lệnh sau được thực thi trên máy tính xách tay:
# 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
Vì vậy, về cơ bản, tải lên SBC đạt khoảng 24MBits / giây và tải xuống từ nó ( -R
) đạt 32MBits / giây.
Điểm chuẩn với SSH
Do đó, chúng ta hãy xem giá vé SSH. Lần đầu tiên tôi gặp phải sự cố dẫn đến bài đăng này khi sử dụng rsync
và borgbackup
- cả hai đều sử dụng SSH làm lớp vận chuyển ... Vì vậy, hãy xem cách SSH thực hiện trên cùng một liên kết:
# cat /dev/urandom | \
pv -ptebar | \
ssh root@192.168.1.150 'cat >/dev/null'
20.3MiB 0:00:52 [ 315KiB/s] [ 394KiB/s]
Chà, đó là một tốc độ kinh khủng! Chậm hơn nhiều so với tốc độ liên kết dự kiến ...
(Trong trường hợp bạn không biết pv -ptevar
: nó hiển thị tốc độ dữ liệu trung bình và hiện tại đi qua nó. Trong trường hợp này, chúng tôi thấy rằng đọc /dev/urandom
và gửi dữ liệu qua SSH đến SBC trung bình đạt 400KB / giây - tức là 3,2 MB / giây, một con số thấp hơn nhiều so với 24 MB / giây dự kiến.)
Tại sao liên kết của chúng tôi chạy ở mức 13% công suất?
Có lẽ đó /dev/urandom
là lỗi của chúng tôi ?
# cat /dev/urandom | pv -ptebar > /dev/null
834MiB 0:00:04 [ 216MiB/s] [ 208MiB/s]
Không, chắc chắn là không.
Có lẽ chính SBC? Có lẽ nó quá chậm để xử lý? Hãy thử chạy cùng một lệnh SSH (nghĩa là gửi dữ liệu tới SBC) nhưng lần này là từ một máy khác (Máy 2) được kết nối qua Ethernet:
# cat /dev/urandom | \
pv -ptebar | \
ssh root@192.168.1.150 'cat >/dev/null'
240MiB 0:00:31 [10.7MiB/s] [7.69MiB/s]
Không, điều này hoạt động tốt - trình nền SSH trên SBC có thể (dễ dàng) xử lý 11 MB / giây (tức là 100 MB / giây) mà liên kết Ethernet cung cấp.
Và CPU của SBC có được tải trong khi làm việc này không?
Không.
Vì thế...
- mạng khôn ngoan (theo
iperf3
) chúng ta sẽ có thể tăng tốc độ gấp 10 lần - CPU của chúng tôi có thể dễ dàng đáp ứng tải
- ... và chúng tôi không liên quan đến bất kỳ loại I / O nào khác (ví dụ: ổ đĩa).
Cái quái gì đang xảy ra vậy?
Netcat và ProxyCommand để giải cứu
Hãy thử các netcat
kết nối cũ đơn giản - chúng có chạy nhanh như chúng ta mong đợi không?
Trong SBC:
# nc -l -p 9988 | pv -ptebar > /dev/null
Trong máy tính xách tay:
# cat /dev/urandom | pv -ptebar | nc 192.168.1.150 9988
117MiB 0:00:33 [3.82MiB/s] [3.57MiB/s]
Nó hoạt động! Và chạy ở tốc độ mong đợi - tốt hơn nhiều, tốt hơn gấp 10 lần - tốc độ.
Vậy chuyện gì xảy ra nếu tôi chạy SSH bằng ProxyCommand để sử dụng nc?
# 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]
Làm! Tốc độ gấp 10 lần.
Bây giờ tôi có một chút bối rối - khi sử dụng "trần trụi" nc
như một Proxycommand
, về cơ bản, bạn không làm chính xác những gì mà SSH làm? tức là tạo một ổ cắm, kết nối với cổng 22 của SBC và sau đó di chuyển giao thức SSH qua nó?
Tại sao có sự khác biệt lớn về tốc độ này?
Tái bút: Đây không phải là một bài tập học thuật - borg
bản sao lưu của tôi chạy nhanh hơn 10 lần vì điều này. Tôi chỉ không biết tại sao :-)
EDIT : Đã thêm một "video" của quá trình ở đây . Đếm các gói được gửi từ đầu ra của ifconfig, rõ ràng trong cả hai thử nghiệm, chúng tôi đang gửi 40 MB dữ liệu, truyền chúng trong khoảng 30K gói - chỉ chậm hơn nhiều khi không sử dụng ProxyCommand
.
nc
sử dụng bộ đệm dòng, trong khissh
không có bộ đệm. Vì vậy, (hoặc nếu vậy) lưu lượng ssh liên quan đến nhiều gói hơn.