เวอร์ชัน TL; DR
รับชม ASCII นักแสดงหรือวิดีโอนี้ - จากนั้นมาด้วยเหตุผลใด ๆ ว่าทำไมสิ่งนี้จึงเกิดขึ้น คำอธิบายข้อความที่ตามมาให้บริบทเพิ่มเติม
รายละเอียดของการตั้งค่า
- Machine 1 เป็นแล็ปท็อป Arch Linux ที่
ssh
วางไข่เชื่อมต่อกับ SBC ที่ทำงานโดย Armbian (Orange PI Zero) - SBC นั้นเชื่อมต่อผ่านอีเธอร์เน็ตไปยังเราเตอร์ DSL และมี IP 192.168.1.150
- แล็ปท็อปเชื่อมต่อกับเราเตอร์ผ่าน WiFi - ใช้ดองเกิล Raspberry PI WiFi อย่างเป็นทางการ
- นอกจากนี้ยังมีแล็ปท็อปอีกเครื่อง (Machine 2) เชื่อมต่อผ่านอีเธอร์เน็ตไปยังเราเตอร์ DSL
การเปรียบเทียบการเชื่อมโยงกับ iperf3
เมื่อเทียบกับการiperf3
เชื่อมโยงระหว่างแล็ปท็อปและ SBC น้อยกว่าทฤษฎีที่ 56 Mbits / วินาที - ตามที่คาดไว้ตั้งแต่นี้คือการเชื่อมต่ออินเตอร์เน็ตไร้สายภายใน "2.4GHz แออัด" มาก(อาคารพาร์ทเมนท์)
โดยเฉพาะอย่างยิ่ง: หลังจากทำงาน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 / วินาทีและการดาวน์โหลดจากมัน ( -R
) ถึง 32MBits / วินาที
การเปรียบเทียบกับ 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
และส่งข้อมูลผ่าน SSH ไปยัง SBC โดยเฉลี่ยอยู่ที่ 400KB / s - เช่น 3.2MBits / วินาทีซึ่งน้อยกว่าที่คาดไว้ 24MBits / วินาที)
ทำไมลิงค์ของเราถึงมีความจุถึง 13%
อาจ/dev/urandom
เป็นความผิดของเราหรือ
# cat /dev/urandom | pv -ptebar > /dev/null
834MiB 0:00:04 [ 216MiB/s] [ 208MiB/s]
ไม่แน่นอน
มันอาจ SBC ของตัวเอง? บางทีการประมวลผลช้าเกินไปหรือไม่ ลองใช้คำสั่ง SSH เดียวกัน (เช่นส่งข้อมูลไปยัง SBC) แต่คราวนี้จากเครื่องอื่น (Machine 2) ที่เชื่อมต่อผ่าน 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]
ไม่, มันใช้งานได้ดี - SSH daemon บน SBC สามารถ (ได้อย่างง่ายดาย) จัดการ 11MBytes / วินาที (เช่น 100MBits / วินาที) ที่มีการเชื่อมโยงอีเธอร์เน็ต
และซีพียูของ SBC ถูกโหลดระหว่างที่ทำสิ่งนี้
Nope
ดังนั้น...
- เครือข่ายฉลาด (ตาม
iperf3
) เราควรจะสามารถทำความเร็ว 10 เท่า - ซีพียูของเราสามารถรองรับโหลดได้อย่างง่ายดาย
- ... และเราไม่เกี่ยวข้องกับ 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 เท่า
ดังนั้นจะเกิดอะไรขึ้นถ้าฉันรัน SSH โดยใช้ ProxyCommand เพื่อใช้ 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]
Works! ความเร็ว 10 เท่า
ตอนนี้ผมสับสนเล็กน้อย - เมื่อใช้ "เปล่า" nc
เป็นProxycommand
ไม่ได้คุณพื้นทำสิ่งเดียวที่แน่นอนว่า SSH ไม่? คือการสร้างซ็อกเก็ตเชื่อมต่อกับพอร์ต 22 ของ SBC จากนั้นจึงตักโพรโทคอล SSH ทับหรือไม่
เหตุใดจึงมีความแตกต่างอย่างมากในความเร็วที่เกิดขึ้น
ป.ล. นี่ไม่ใช่แบบฝึกหัดทางวิชาการ - การborg
สำรองข้อมูลของฉันทำงานเร็วขึ้น 10 เท่าด้วยเหตุนี้ ฉันไม่รู้ว่าทำไม :-)
แก้ไข : เพิ่ม "วิดีโอ" ของกระบวนการที่นี่ นับแพ็คเก็ตที่ส่งมาจากการส่งออกของ ifconfig ก็เป็นที่ชัดเจนว่าในการทดสอบทั้งเราจะส่ง 40MB ของข้อมูลการส่งพวกเขาในเวลาประมาณ 30K แพ็คเก็ต - ProxyCommand
เพียงแค่ช้ามากเมื่อไม่ได้ใช้
nc
ใช้การบัฟเฟอร์บรรทัดในขณะที่ssh
ไม่มีบัฟเฟอร์ ดังนั้น (หรือถ้ามี) ทราฟฟิก ssh เกี่ยวข้องกับแพ็กเก็ตเพิ่มเติม