TL; DR 버전
이 ASCII 캐스트 또는 이 비디오를 시청 한 다음 이러한 상황이 발생하는 이유를 생각해보십시오. 다음의 텍스트 설명은 더 많은 컨텍스트를 제공합니다.
설정 세부 사항
- Machine 1은 Arch Linux 랩톱으로,
ssh
Armbian 실행 SBC (오렌지 PI Zero)에 연결됩니다. - SBC 자체는 이더넷을 통해 DSL 라우터에 연결되며 IP는 192.168.1.150입니다.
- 랩탑은 공식 Raspberry PI WiFi 동글을 사용하여 WiFi를 통해 라우터에 연결됩니다.
- 이더넷을 통해 DSL 라우터에 연결된 다른 랩탑 (기계 2)도 있습니다.
iperf3와의 링크 벤치마킹
로 벤치마킹 할 때 iperf3
랩탑과 SBC 간의 링크는 이론적으로 56MBits / sec 미만입니다. 이는 매우 "붐비는 2.4GHz" (아파트 빌딩) 내의 WiFi 연결이기 때문 입니다.
보다 구체적으로 : iperf3 -s
SBC에서 실행 한 후 다음 명령이 랩톱에서 실행됩니다.
# 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
따라서 기본적으로 SBC에 업로드하면 약 24MBits / sec에 도달하고 다운로드 ( -R
)는 32MBits / sec에 도달합니다.
SSH로 벤치마킹
그렇다면 SSH가 어떻게 작동하는지 봅시다. 내가 처음 사용하는 경우이 게시물을 주도하는 문제를 경험 한 rsync
과 borgbackup
: 그럼 같은 링크에 어떻게 SSH가 수행을 보자 ... 둘 전송 계층으로 ssh를 사용하여 -
# cat /dev/urandom | \
pv -ptebar | \
ssh root@192.168.1.150 'cat >/dev/null'
20.3MiB 0:00:52 [ 315KiB/s] [ 394KiB/s]
글쎄요, 그건 끔찍한 속도입니다! 많은 느린 예상 연결 속도보다 ...
(혹시 인식하지 pv -ptevar
:. 그것을 통과하는 데이터의 현재 및 평균 속도를 표시이 경우, 우리가 보는 그에서 읽기 /dev/urandom
와 SBC에 SSH를 통해 데이터를 전송 평균 400KB / s에 도달합니다 (예 : 3.2MBits / sec, 예상 24MBits / sec보다 훨씬 낮음).
링크의 용량이 13 % 인 이유는 무엇입니까?
아마도 우리 /dev/urandom
의 잘못일까요?
# cat /dev/urandom | pv -ptebar > /dev/null
834MiB 0:00:04 [ 216MiB/s] [ 208MiB/s]
아뇨.
아마도 SBC 자체일까요? 처리하기에는 너무 느릴까요? 동일한 SSH 명령 (예 : SBC로 데이터 전송)을 실행 해 보겠습니다. 이번에는 이더넷을 통해 연결된 다른 시스템 (기계 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]
SBC의 SSH 데몬은 이더넷 링크가 제공하는 11MBytes / sec (즉, 100MBits / sec)를 (쉽게) 처리 할 수 있습니다.
그리고이 작업을 수행하는 동안 SBC의 CPU 가로 드됩니까?
아니.
그래서...
- 네트워크 단위로 (당
iperf3
) 우리는 속도의 10 배를 할 수 있어야합니다 - 우리의 CPU는 쉽게 부하를 수용 할 수 있습니다
- ... 우리는 다른 종류의 I / O (예 : 드라이브)를 포함하지 않습니다.
도대체 무슨 일이야?
구조에 대한 Netcat 및 ProxyCommand
평범한 오래된 netcat
연결을 시도해 봅시다. 예상대로 빨리 연결됩니까?
SBC에서 :
# nc -l -p 9988 | pv -ptebar > /dev/null
노트북에서 :
# cat /dev/urandom | pv -ptebar | nc 192.168.1.150 9988
117MiB 0:00:33 [3.82MiB/s] [3.57MiB/s]
효과가있다! 그리고 예상보다 훨씬 빠르며 10 배 더 빠릅니다.
nc를 사용하기 위해 ProxyCommand를 사용하여 SSH를 실행하면 어떻게됩니까?
# 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]
공장! 10 배속.
이제는 약간 혼란스러워합니다. "naked"를 nc
로 Proxycommand
사용할 때 기본적으로 SSH와 동일한 작업을 수행하지 않습니까? 즉, 소켓을 만들고 SBC의 포트 22에 연결 한 다음 SSH 프로토콜을 삽니까?
결과 속도에 왜 이렇게 큰 차이가 있습니까?
PS 이것은 아니었다 학술 운동 - 내 borg
백업이 10 배 빠른 이것 때문에 실행됩니다. 난 그냥 왜 :-) 몰라
편집 : 여기 에 프로세스의 "비디오"를 추가했습니다 . ifconfig의 출력에서 전송 된 패킷을 계산할 때 두 테스트에서 40MB의 데이터를 전송하여 약 30K 패킷으로 전송한다는 것은 분명합니다 ProxyCommand
.
nc
라인 버퍼링을 사용하는 반면 버퍼링 은 사용 하지 않는다고 생각 합니다ssh
. 따라서 ssh 트래픽에는 더 많은 패킷이 포함됩니다.