टीएल; डीआर संस्करण
इस ASCII कलाकारों या इस वीडियो को देखें - फिर किसी भी कारण से आएँ कि ऐसा क्यों हो रहा है। पाठ विवरण जो अधिक संदर्भ प्रदान करता है।
सेटअप का विवरण
- मशीन 1 एक आर्क लिनक्स लैपटॉप है, जिस पर
ssh
स्पैन किया जाता है, जो एक आर्मबियन-रनिंग एसबीसी (ऑरेंज पीआई ज़ीरो) से जुड़ता है। - SBC स्वयं ईथरनेट के माध्यम से DSL राउटर से जुड़ा है, और इसमें 192.168.1.150 का IP है
- लैपटॉप एक आधिकारिक रास्पबेरी पीआई वाईफाई डोंगल का उपयोग करके वाईफाई पर राउटर से जुड़ा हुआ है।
- ईथरनेट के माध्यम से DSL राउटर से जुड़ा एक और लैपटॉप (मशीन 2) भी है।
Iperf3 के साथ लिंक को बेंचमार्क करना
जब बेंचमार्क किया जाता है iperf3
, तो लैपटॉप और एसबीसी के बीच का लिंक सैद्धांतिक 56 एमबीटी / सेकंड से कम है - जैसा कि अपेक्षित है, क्योंकि यह बहुत "भीड़ 2.4GHz" (अपार्टमेंट बिल्डिंग) के भीतर एक वाईफाई कनेक्शन है ।
विशेष रूप से: iperf3 -s
एसबीसी पर चलने के बाद , लैपटॉप पर निम्नलिखित कमांड निष्पादित होते हैं:
# 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 तक पहुँच जाता है।
एसएसएच के साथ बेंचमार्किंग
यह देखते हुए, आइए देखें कि एसएसएच किराया कैसे है। मैंने पहली बार उन समस्याओं का अनुभव किया है जिनका उपयोग करते हुए इस पद का नेतृत्व किया 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
एसएसएच से अधिक डेटा को एसबीसी में भेजना और भेजना है। औसतन 400KB / s - यानी 3.2MBits / सेकंड तक पहुँचने की उम्मीद 24MBits / sec की तुलना में बहुत कम आंकड़ा है।)
हमारी लिंक अपनी क्षमता के 13% पर क्यों चल रही है?
क्या यह शायद हमारी /dev/urandom
गलती है?
# cat /dev/urandom | pv -ptebar > /dev/null
834MiB 0:00:04 [ 216MiB/s] [ 208MiB/s]
नहीं, निश्चित रूप से नहीं।
क्या यह शायद एसबीसी ही है? शायद यह प्रक्रिया के लिए बहुत धीमा है? आइए उसी 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]
नहींं, यह ठीक काम करता है - एसबीसी पर SSH डेमन (आसानी से) 11MBytes / sec (यानी 100MBits / sec) को संभाल सकता है जो यह ईथरनेट लिंक प्रदान करता है।
और क्या ऐसा करते समय SBC का CPU लोड होता है?
नहीं।
इसलिए...
- नेटवर्क-वार (प्रति के अनुसार
iperf3
) हमें 10x गति करने में सक्षम होना चाहिए - हमारे सीपीयू आसानी से लोड को समायोजित कर सकते हैं
- ... और हम किसी अन्य प्रकार के 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]
यह काम करता हैं! और उम्मीद पर चलता है - बहुत बेहतर, 10x बेहतर - गति।
तो क्या होता है अगर मैं SSH का उपयोग करते हुए SSH को 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]
काम करता है! 10x की गति।
अब मैं थोड़ा उलझन में हूँ - जब एक "नग्न" का उपयोग कर nc
एक के रूप में Proxycommand
, आप मूल रूप से ठीक उसी बात यह है कि SSH करता है नहीं कर रहे हैं? यानी एक सॉकेट बनाना, SBC के पोर्ट 22 से कनेक्ट करना, और फिर उस पर SSH प्रोटोकॉल को शेव करना?
परिणामी गति में इतना बड़ा अंतर क्यों है?
PS यह एक अकादमिक अभ्यास नहीं था - borg
इस वजह से मेरा बैकअप 10 गुना तेज है। मैं अभी पता नहीं क्यों :-)
संपादित करें : यहां प्रक्रिया का एक "वीडियो" जोड़ा गया । Ifconfig के आउटपुट से भेजे गए पैकेटों की गिनती करते हुए, यह स्पष्ट है कि दोनों परीक्षणों में हम 40MB डेटा भेज रहे हैं, उन्हें लगभग 30K पैकेटों में प्रेषित कर रहे हैं - उपयोग नहीं करते समय बस धीमा ProxyCommand
।
nc
लाइन बफरिंग का उपयोग करता है, जबकिssh
कोई बफरिंग नहीं है। तो (या यदि ऐसा है) ssh यातायात में अधिक पैकेट शामिल हैं।