Scp इतना धीमा क्यों है और इसे और तेज़ कैसे बनाया जाए?


59

मैं फ़ाइलों के एक बैच को कॉपी करने की कोशिश कर रहा हूं, scpलेकिन यह बहुत धीमी है। यह 10 फ़ाइलों के साथ एक उदाहरण है:

$ time scp cap_* user@host:~/dir
cap_20151023T113018_704979707.png    100%  413KB 413.2KB/s   00:00    
cap_20151023T113019_999990226.png    100%  413KB 412.6KB/s   00:00    
cap_20151023T113020_649251955.png    100%  417KB 416.8KB/s   00:00    
cap_20151023T113021_284028464.png    100%  417KB 416.8KB/s   00:00    
cap_20151023T113021_927950468.png    100%  413KB 413.0KB/s   00:00    
cap_20151023T113022_567641507.png    100%  413KB 413.1KB/s   00:00    
cap_20151023T113023_203534753.png    100%  414KB 413.5KB/s   00:00    
cap_20151023T113023_855350640.png    100%  412KB 411.7KB/s   00:00    
cap_20151023T113024_496387641.png    100%  412KB 412.3KB/s   00:00    
cap_20151023T113025_138012848.png    100%  414KB 413.8KB/s   00:00    
cap_20151023T113025_778042791.png    100%  413KB 413.4KB/s   00:00    

real    0m43.932s
user    0m0.074s
sys 0m0.030s

अजीब बात यह है कि स्थानांतरण दर लगभग 413KB / s है और फ़ाइल का आकार लगभग 413KB है इसलिए वास्तव में इसे प्रति सेकंड एक फ़ाइल को स्थानांतरित करना चाहिए, हालांकि यह प्रति फ़ाइल लगभग 4.3 सेकंड ले रहा है।

किसी भी विचार जहां यह ओवरहेड आता है, और क्या इसे तेजी से बनाने का कोई तरीका है?


3
आप किस गति की उम्मीद करते हैं (यानी, क्या एक और प्रोटोकॉल है जो समान दो मशीनों के बीच उच्च स्थानांतरण गति दिखाता है)? क्या होता है जब आप एक बहुत बड़ी फ़ाइल (शायद आप सभी 413KB फ़ाइलों का संघटन) को स्कैन करते हैं?
डेग

6
ऐसा लगता है कि दूरस्थ सिस्टम क्लाइंट IP पते को एक नाम से हल करने की कोशिश कर रहा हो सकता है, और आपको सत्र से पहले टाइमआउट की प्रतीक्षा करनी होगी। आप यह तय करने की जांच कर सकते हैं कि (उदाहरण के लिए अपने आईपी पते को गंतव्य / / / होस्ट फ़ाइल में जोड़ें)।
वार्टल

4
यह ध्यान देने योग्य है कि -सी ध्वज हस्तांतरण के दौरान संपीड़न को सक्षम करता है। यद्यपि आपकी समस्या स्थानान्तरण शुरू करते समय ओवरहेड लगती है, लेकिन सम्पीडन मूल रूप से "मुक्त" है और लगभग हमेशा मदद करती है।
सैम

@wurtel: मैं नहीं देख रहा हूँ कि तुम क्या देख रहे हो, सब मैं बार देख रहे हैं। वैसे भी केवल एक रिवर्स डीएनएस कॉल की आवश्यकता होनी चाहिए।
जेम्स के पोल्क

क्या आप सुरक्षा के लिए या केवल दूरस्थ प्रतिलिपि के लिए SCP पर निर्भर हैं?
फ़्रीहिट

जवाबों:


17

@ wurtel की टिप्पणी शायद सही है: प्रत्येक कनेक्शन स्थापित करने में बहुत अधिक ओवरहेड है। यदि आप ठीक कर सकते हैं कि आपको तेज़ स्थानान्तरण मिलेगा (और यदि आप नहीं कर सकते हैं, तो बस @ रोइमा के rsyncवर्कअराउंड का उपयोग करें )। मैंने head -c 417K /dev/urandom > foo.1एक होस्ट के समान आकार की फ़ाइलों ( और उस फ़ाइल की कुछ प्रतियां) को स्थानांतरित करने के लिए एक प्रयोग किया था जो कनेक्ट करने के लिए थोड़ी देर लेता है (HOST4) और एक जो बहुत जल्दी प्रतिक्रिया करता है (HOST1):

$ time ssh $HOST1 echo


real    0m0.146s
user    0m0.016s
sys     0m0.008s
$ time scp * $HOST1:
foo.1                                         100%  417KB 417.0KB/s   00:00    
foo.2                                         100%  417KB 417.0KB/s   00:00    
foo.3                                         100%  417KB 417.0KB/s   00:00    
foo.4                                         100%  417KB 417.0KB/s   00:00    
foo.5                                         100%  417KB 417.0KB/s   00:00    

real    0m0.337s
user    0m0.032s
sys     0m0.016s
$ time ssh $HOST4 echo


real    0m1.369s
user    0m0.020s
sys     0m0.016s
$ time scp * $HOST4:
foo.1                                         100%  417KB 417.0KB/s   00:00    
foo.2                                         100%  417KB 417.0KB/s   00:00    
foo.3                                         100%  417KB 417.0KB/s   00:00    
foo.4                                         100%  417KB 417.0KB/s   00:00    
foo.5                                         100%  417KB 417.0KB/s   00:00    

real    0m6.489s
user    0m0.052s
sys     0m0.020s
$ 

1
धन्यवाद, यह बहुत दिलचस्प है। अगर यह एक ही समय में एक मेजबान से दूसरे में पूरी तरह से अलग है, तो यह एक ही समय दिखाता है, तो एससीपी आउटपुट टूट गया है। उन्हें संभवतः कुल समय में कनेक्शन समय शामिल करना चाहिए।
laurent

1
तो आपकी परिकल्पना यह है कि प्रत्येक फ़ाइल के लिए एक बार एक नया कनेक्शन बनाया जाए?
रोजरपैक

59

आप उपयोग कर सकते हैं rsync(ओवर ssh), जो सभी स्रोत फ़ाइलों को स्थानांतरित करने के लिए एकल कनेक्शन का उपयोग करता है।

rsync -avP cap_* user@host:dir

यदि आप की जरूरत नहीं है rsync(और क्यों !? नहीं) आप उपयोग कर सकते हैं tarके साथ sshइस तरह है, जो एक अस्थायी फ़ाइल बनाने टाल:

tar czf - cap_* | ssh user@host tar xvzfC - dir

rsyncपसंद किया जा करने के लिए, सभी अन्य बातों के समान हैं, क्योंकि यह एक रुकावट की घटना में restartable है।


6
क्या आप कह रहे हैं कि एक एकल scpआह्वान सभी फ़ाइलों को स्थानांतरित करने के लिए एक एकल कनेक्शन का उपयोग नहीं करेगा?
बजे एक CVn

1
टारपाइप मामले में, f -प्रत्येक पक्ष के लिए कोई आवश्यकता नहीं है , क्योंकि टार आउटपुट / स्टडआउट / स्टड से डिफ़ॉल्ट रूप से पढ़ता है। तो tar cz cap_* | ssh user@host tar xvzC dirकर लेती।
कंपकंपी

1
@ बहुत जरूरी नहीं है। tarविभिन्न डिफ़ॉल्ट मानों के साथ संकलित किया जा सकता है (देखें tar --show-defaultsकि क्या आप GNU टार का उपयोग कर रहे हैं, या /etc/default/tarअन्यथा, और दोनों ही मामलों में TAPEपर्यावरण चर नहीं भूल सकते हैं)
roaima

1
@ माइकलकॉर्जिंग ने शुरू में मुझे मान लिया था कि scpप्रत्येक फ़ाइल के लिए एक नया कनेक्शन बनाया जाएगा, लेकिन याद करने पर - और साथ डबल-चेकिंग के बाद tshark- मुझे एहसास हुआ कि मैं गलत था। इस बिंदु पर मुझे अब यकीन नहीं है कि ओपी scpको प्रति फ़ाइल इतना लंबा समय क्यों लेना चाहिए।
रोआमा

@ मर्यादा, रोचक, धन्यवाद। मैंने कभी गौर नहीं किया है कि स्टड / स्टडआउट अब तक डिफ़ॉल्ट नहीं हुआ है। काम पर मेरे मैक पर बीएसडी टार अपने मैन पेज में एक तापी एनव संस्करण का उल्लेख नहीं करता है, हालांकि मेरे लिनक्स मशीन पर जीएनयू टार करता है।
कंपित

15

यह स्थानांतरण की बातचीत है जिसमें समय लगता है। सामान्य तौर पर, b बाइट्स की n फ़ाइलों पर प्रत्येक ऑपरेशन में बहुत अधिक समय लगता है, जो कि n * b बाइट्स की सिंगल फाइल पर एक सिंगल ऑपरेशन की तुलना में अधिक लंबा होता है । यह डिस्क I / O के लिए भी सत्य है।

यदि आप ध्यान से देखें तो आप देखेंगे कि इस मामले में स्थानांतरण दर size_of_the_file / secs है।

फ़ाइलों को अधिक कुशलता से स्थानांतरित करने के लिए, उन्हें एक साथ बंडल करें tar, फिर टारबॉल को स्थानांतरित करें:

tar cvf myarchive.tar cap_20151023T*.png

या, यदि आप भी संग्रह को संपीड़ित करना चाहते हैं,

tar cvzf myarchive.tar.gz myfile*

संपीड़ित करना या नहीं करना फ़ाइल की सामग्री पर निर्भर करता है, जैसे। यदि वे JPEG या PNG हैं, तो संपीड़न का कोई प्रभाव नहीं होगा।


PNGs अपस्फीति का उपयोग करते हैं, और उन्हें जिप करना भी व्यर्थ है।
आर्थर 2 ई 5

मैं कहता हूं कि क्योंकि टार को कंप्रेस करने से नकारात्मक प्रभाव नहीं पड़ता है, जब फ़ाइलों को संपीड़ित नहीं किया जा सकता है तो यह सिर्फ डालने के लिए एक अच्छा अभ्यास है-z
Centimane

1
@ अगर वे संपीड़ित नहीं किया जा सकता है, या नेटवर्क तेज है, तो यह चीजों को धीमा कर देगा।
डेविडमह

@Davidmh हालांकि यह एक महत्वपूर्ण राशि होगी? मुझे लगता है कि एक पहले से ही संपीड़ित फ़ाइल को संपीड़ित करना काफी जल्दी होगा क्योंकि यह वास्तव में सिर्फ यह देखेगा कि यह क्या संपीड़ित कर सकता है और पा सकता है कि यह कुछ भी नहीं है। निर्भर करता है कि मुझे लगता है कि tarआम तौर पर संपीड़न के लिए एक दूसरा पास होता है या यदि यह एक ही समय में संपीड़ित और संग्रहित होता है
सेंटिमेन

3
@ मेरे मामले में (एक आधुनिक 7000 आरपीएम एचडी, उच्च अंत सीपीयू, बहुत तेज नेटवर्क, बिल्कुल भी डींग न मारना) पर डेटा, बिना संपीड़न के टार विशुद्ध रूप से आईओ बाध्य है, लेकिन -zसीपीयू बाध्य है, और बहुत धीमा है। gzip हमेशा संपीड़ित करने की कोशिश करेगा, इसलिए मंदी; आखिरकार, आप यह नहीं बता सकते कि क्या बाइट्स का एक तार सिकुड़ा हुआ है जब तक कि आपने इसे संपीड़ित करने की कोशिश नहीं की है। मेरे सेट अप में, यहां तक ​​कि सादे पाठ फ़ाइलों को स्थानांतरित करते समय, संपीड़न के बिना rsync सबसे हल्का संपीड़न के साथ 2-3 के कारक द्वारा सबसे तेज है। बेशक, YMMV।
डेविड मम

6

एक और कारण यह है कि एससीपी धीमा है, विशेष रूप से उच्च बैंडविड्थ नेटवर्क पर होना चाहिए, यह है कि इसमें आंतरिक रूप से आंतरिक प्रवाह नियंत्रण बफ़र है जो नेटवर्क प्रदर्शन बाधाओं का अंत करता है।

एचपीएन-एसएसएच ओपनएसएसएच का एक पैच संस्करण है जो इन बफ़र्स के आकार को बढ़ाता है। यह स्थानांतरण गति को बढ़ाने के लिए एक बड़ा अंतर बनाता है (साइट पर चार्ट देखें, लेकिन मैं व्यक्तिगत अनुभव से भी बात करता हूं)। बेशक, लाभ प्राप्त करने के लिए आपको अपने सभी मेजबानों पर एचपीएन-एसएसएच स्थापित करने की आवश्यकता है लेकिन यह अच्छी तरह से इसके लायक है यदि आपको नियमित रूप से बड़ी फ़ाइलों को स्थानांतरित करने की आवश्यकता है।


5

मैंने यहाँ वर्णित तकनीक का उपयोग किया है जो डेटा को जल्दी से संपीड़ित करने और कॉपी करने के लिए समानांतर gzip और netcat का उपयोग करता है।

यह करने के लिए नीचे फोड़े:

# SOURCE: 
> tar -cf - /u02/databases/mydb/data_file-1.dbf | pigz | nc -l 8888

# TARGET:
> nc <source host> 8888 | pigz -d | tar xf - -C /

यह फ़ाइल या फ़ाइलों को इकट्ठा करने के लिए टार का उपयोग करता है। फिर फ़ाइल को संपीड़ित करने और भेजने के लिए कई सीपीयू थ्रेड प्राप्त करने के लिए पिगज़ का उपयोग करता है, नेटवर्क ट्रांसमिशन नेटकैट का उपयोग कर रहा है। प्राप्त करने के पक्ष में, netcat सुनता है, फिर समरूपता (समानांतर में) और असत्य।


3
ncएन्क्रिप्टेड नहीं है। ssh -Dशायद कुछ जादू जोड़ें ?
आर्थर 2 ई 5

यह वास्तव में बहुत शानदार है
Jabran Saeed

5

बस एक बड़ी mp4 फ़ाइल के माध्यम से साइट-टू-साइट हस्तांतरण करने के लिए यह समस्या थी scp। ~ 250KB / s मिल रहा था। गंतव्य फ़ायरवॉल पर UDP बाढ़ सुरक्षा (FP) को अक्षम करने के बाद, स्थानांतरण दर बढ़कर 6.5MB / s हो गई। एफपी को वापस चालू करते समय, दर वापस ~ 250KB / s पर आ गई।

प्रेषक: साइबरविन, रिसीवर: फेडोरा 20, फ़ायरवॉल सोफोस यूटीएम।

SSH UDP के लिए क्या उपयोग करता है? @ superuser.com - यह सीधे मेरे द्वारा पढ़ी गई बातों से नहीं है।

फ़ायरवॉल लॉग की समीक्षा करने पर, बाढ़ का पता लगाने के लिए दोनों स्रोत और सार्वजनिक आईपी पते पर 4500 पोर्ट को नष्ट कर रहे थे, न कि निजी साइट-टू-साइट आंतरिक वीपीएन पते। ऐसा लगता है कि मेरा मुद्दा नैट ट्रावर्सल स्थिति की संभावना है जहां scpटीसीपी डेटा अंततः ईएसपी और यूडीपी पैकेट में एन्क्रिप्ट और एन्कैप्सुलेटेड है, और परिणामस्वरूप एफपी के अधीन है। scpसमीकरण से हटाने के लिए, मैंने वीपीएन के पार एक विंडोज फाइल कॉपी ऑपरेशन चलाया scpऔर एफपी सक्षम के साथ और इसके बिना समान प्रदर्शन देखा । iperfटीसीपी पर एक परीक्षण भी चलाया और एफपी के साथ 2Mbits / sec देखा, और 55Mbits / sec के बिना।

IPSec के साथ NAT-T कैसे काम करता है? @ cisco.com

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.