फ़ाइल स्थानांतरण में तेजी लाने के लिए मल्टीप्लेक्सिंग को उलटा करें


19

मैंने एक मशीन से दूसरी मशीन में बड़ी मात्रा में डेटा भेजा है। अगर मैं rsync (या किसी अन्य विधि) के साथ भेजता हूं, तो यह एक स्थिर 320kb / सेकंड पर जाएगा। यदि मैं एक साथ दो या तीन स्थानान्तरण शुरू करता हूं, तो प्रत्येक 320 पर जाएगा, और यदि मैं एक बार में चार करता हूं, तो वे लिंक को अधिकतम कर देंगे।

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

क्या कोई ऐसा उपकरण है जो ऐसा करता है, या मुझे अपना खुद का बनाने की आवश्यकता है? प्रेषक CentOS है, रिसीवर FreeBSD है।

जवाबों:


29

इसका सबूत यह है कि मैं दूर-दराज के आईना की 'पवित्र कब्र' पेश करता हूं। lftpसुझाव के लिए davr का धन्यवाद ।

lftp -c "mirror --use-pget-n=10 --verbose sftp://username:password@server.com/directory" 

इसके बाद के संस्करण के रूप में ऊपर एक दूरस्थ निर्देशिका मिरर करेगा दर्पण, प्रत्येक फ़ाइल को 10 थ्रेड्स में तोड़कर स्थानांतरित करता है!


lftpबहुत अच्छा है, लेकिन जब मैं लोड कर रहा हूं तो मैं इसे मल्टीपार्ट करने में असमर्थ हूं। मैं उपयोग कर रहा हूं mirror --use-pget-n=20 -R- लेकिन ऐसा लगता है कि --use-pget-nकेवल डाउनलोड करते समय काम करता है।
डैन

पुनश्च, -P20कई फ़ाइलों को अपलोड करने के लिए काम करता है, लेकिन मैं प्रत्येक फ़ाइल को मल्टीपार्ट नहीं कर सकता।
दान

1
lftp सेगमेंटेड / मल्टीपार्ट अपलोडिंग का समर्थन नहीं करता है। उपयोग करने के लिए आपको गंतव्य की ओर से स्थानांतरण आरंभ करना होगा pget -n
apraetor

याद रखें, mirrorद्वि-दिशात्मक है; pgetतर्क केवल फ़ाइलें डाउनलोड किया जा रहा करने के लिए लागू होता है।
apraetor

10

कुछ उपकरण हैं जो काम कर सकते हैं।

  • LFTP - FTP, HTTP और SFTP का समर्थन करता है। किसी एकल फ़ाइल को डाउनलोड करने के लिए कई कनेक्शनों का उपयोग करने का समर्थन करता है। मान लें कि आप किसी फ़ाइल को रिमोटसेवर से लोकलसर्वर में स्थानांतरित करना चाहते हैं, तो स्थानीय सर्वर पर LFTP स्थापित करें; और चलाएँ:

    lftp -e 'pget -n 4 sftp://userName@remoteServer.com/some/dir/file.ext'

    '-N 4' समानांतर में उपयोग करने के लिए कितने कनेक्शन हैं।

  • फिर कई 'डाउनलोड एक्सेलेरेटर' उपकरण हैं, लेकिन वे आम तौर पर केवल HTTP या एफ़टीपी का समर्थन करते हैं, जिन्हें आप दूरस्थ सर्वर पर सेट करना नहीं चाहते हैं। कुछ उदाहरण हैं एक्सल , एरी 2 और प्रोज़िला


8

यदि आपके पास कुछ और बड़ी फाइलें हैं lftp -e 'mirror --parallel=2 --use-pget-n=10 <remote_dir> <local_dir>' <ftp_server>, तो आप कुल 20 फीट के कनेक्शन के साथ 10 खंडों में विभाजित प्रत्येक फ़ाइल के साथ 2 फाइलें डाउनलोड करेंगे <ftp_server>;

यदि आपके पास बड़ी मात्रा में छोटी फ़ाइलें हैं, तो उपयोग करें lftp -e 'mirror --parallel=100 <remote_dir> <local_dir>' <ftp_server>: आप विभाजन के बिना समानांतर में 100 फ़ाइलों को डाउनलोड करेंगे, फिर। कुल 100 कनेक्शन खुले होंगे। यह सर्वर पर उपलब्ध क्लाइंट को बाहर निकाल सकता है, या आपको कुछ सर्वरों पर प्रतिबंध लगा सकता है।

आप --continueनौकरी को फिर से शुरू करने के लिए उपयोग कर सकते हैं :) और -Rडाउनलोड के बजाय अपलोड करने का विकल्प (फिर तर्क क्रम स्विच करना <local_dir> <remote_dir>)।


1
टाइपो इन पैरामीटर: --use-pget-n के बजाय --use-pget-m। संपादित करने का प्रयास किया, लेकिन मेरा संपादन संक्षिप्त था।
टोनी

2

आप इस समस्या से बचने के लिए अपनी टीसीपी सेटिंग्स को ट्विक करने में सक्षम हो सकते हैं, जो कि प्रति कनेक्शन सीमा 320KB / s के कारण हो सकता है। मेरा अनुमान है कि यह आईएसपी द्वारा सीमित प्रति-कनेक्शन दर स्पष्ट नहीं है । थ्रॉटलिंग के लिए दो संभावित अपराधी हैं:

  1. दो मशीनों के बीच कुछ लिंक संतृप्त और छोड़ने वाले पैकेट हैं।
  2. TCP विंडो संतृप्त है क्योंकि बैंडविड्थ विलंब उत्पाद बहुत बड़ा है।

पहले मामले में, प्रत्येक टीसीपी कनेक्शन, प्रभावी रूप से, मानक टीसीपी भीड़ नियंत्रण में समान रूप से प्रतिस्पर्धा करेगा। आप भीड़भाड़ नियंत्रण एल्गोरिदम को बदलकर या बैकऑफ़ की मात्रा को कम करके भी इसमें सुधार कर सकते हैं।

दूसरे मामले में आप पैकेट नुकसान से सीमित नहीं हैं। अतिरिक्त कनेक्शन जोड़ना कुल विंडो आकार के विस्तार का एक कच्चा तरीका है। यदि आप मैन्युअल रूप से खिड़की के आकार में वृद्धि कर सकते हैं तो समस्या दूर हो जाएगी। ( यदि कनेक्शन विलंबता पर्याप्त रूप से अधिक है तो इसके लिए TCP विंडो स्केलिंग की आवश्यकता हो सकती है ।)

आप लगभग बता सकते हैं कि कनेक्शन की कुल गति से गोल यात्रा "पिंग" समय को गुणा करके खिड़की को कितना बड़ा होना चाहिए। 1280KB / s को 1280 (1311 के लिए 1024 = 1K) बाइट प्रति मिलीसेकंड राउंड ट्रिप की जरूरत है। 64K बफर को लगभग 50 ms विलंबता पर अधिकतम किया जाएगा, जो काफी विशिष्ट है। एक 16K बफर फिर 320KB / s के आसपास संतृप्त होगा।


1

आपका डेटा कैसे संरचित है? कुछ बड़ी फाइलें? कुछ बड़ी निर्देशिका? आप अपनी निर्देशिका ट्री की विशिष्ट शाखाओं पर rsync के कई उदाहरणों को बंद कर सकते हैं।

यह सब इस बात पर निर्भर करता है कि आपका स्रोत डेटा कैसे संरचित है। फ़ाइलों को स्लाइस, पासा और रिसेम्बल करने के लिए कई यूनिक्स उपकरण हैं।


मनमाना डेटा। कभी-कभी यह एक बड़ी निर्देशिका है, कभी-कभी एक ही फ़ाइल।
ZimmyDubZongyZongDubby

1

यदि आप पासवर्डलेस ssh लॉगिन को सेटअप कर सकते हैं, तो यह 4 समवर्ती scp कनेक्शन (-n) खोलेगा, जिसमें प्रत्येक कनेक्शन 4 फाइल (-L) को हैंडल करेगा:

खोजो। -प्रकार f | xargs -L 4 -n 4 /tmp/scp.sh उपयोगकर्ता @ होस्ट: पथ

फ़ाइल /tmp/scp.sh:

#!/bin/bash

#Display the help page
function showHelp()
{
    echo "Usage: $0 <destination> <file1 [file2 ... ]>"
}

#No arguments?
if [ -z "$1" ] || [ -z "$2" ]; then
    showHelp
    exit 1
fi

#Display help?
if [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
    showHelp
    exit 0
fi

#Programs and options
SCP='scp'
SCP_OPTS='-B'
DESTINATION="$1";shift;

#Check other parameters
if [ -z "$DESTINATION" ]; then
    showHelp
    exit 1
fi

echo "$@"

#Run scp in the background with the remaining parameters.
$SCP $SCP_OPTS $@ $DESTINATION &

0

इनोड पर सभी फाइलों को क्रमबद्ध करने का प्रयास करें (ढूँढें / mydir -type f -print | xargs ls -i | sort -n) और उदाहरण के लिए cpio से ssh पर उन्हें स्थानांतरित करें। यह आपकी डिस्क को अधिकतम करेगा और आपके द्वारा नेटवर्क को अड़चन बना देगा। इसके बजाय तेजी से जब नेटवर्क में जाना मुश्किल है।


यह बिल्कुल डरपोक है :)
वॉरेन

मैं गारंटी नहीं दे सकता कि सभी फाइल सिस्टम को इससे बढ़ावा मिलता है, यह इस बात पर निर्भर करता है कि इनोड लेआउट कैसे किया जाता है।
जिमी हैडमैन

अड़चन यह है कि प्रत्येक टीसीपी कनेक्शन 320KB / सेकंड तक सीमित है। मैं समानांतर टीसीपी कनेक्शनों में फाइलें भेजना चाहता हूं ताकि मुझे नेटवर्क की सीमा तक 320 * न्यूमोनकनेक्ट मिलें (लगभग 1200KB / सेकंड)। इनकोड द्वारा छांटना यह हासिल नहीं करता है।
ZimmyDubZongyZongDubby

टीसीपी गति को सीमित करना क्या है? मशीनों के बीच एक राउटर?
जिमी हेडमैन 21

मेरा आई.एस.पी. नेट न्यूट्रैलिटी? हा!
जिमी डडज़ॉन्गयॉन्गडॉबी

0

मैं एक उपकरण जानता हूं जो फ़ाइलों को चंक्स में स्थानांतरित कर सकता है। टूल को 'होस्टल' पैकेज / पोर्ट कहा जाता है, जो दोनों मेजबानों पर उपलब्ध है;) बिटटोरेंट क्लाइंट अक्सर ट्रांसफर से पहले डिस्क स्थान आरक्षित करते हैं, और चंक्स सीधे सॉकेट से डिस्क पर लिखे जाते हैं। इसके अतिरिक्त, आप एक अच्छे ncurses स्क्रीन में सभी स्थानान्तरण राज्यों की समीक्षा करने में सक्षम होंगे।

आप "* .torrent" फ़ाइल निर्माण को स्वचालित करने के लिए सरल बैश स्क्रिप्ट बना सकते हैं और रिमोट मशीन पर कमांड भेज सकते हैं ताकि यह इसे डाउनलोड करे। यह थोड़ा बदसूरत लग रहा है, लेकिन मुझे नहीं लगता कि आप विकास के बिना कोई सरल समाधान पाएंगे :)


1
यदि फ़ाइल स्थानांतरण में केवल दो मशीनें शामिल हैं, तो एक धार कैसे मदद कर सकती है? एक धार का विचार एक ग्राहक अनुरोधकर्ता को डेटा उपलब्ध कराने वाले बीजों का झुंड है।
डेवपैरिलो

आप सही हे। लेकिन किसने कहा कि यह एक एकल बीजक के साथ उपयोगी नहीं है? ;)
कोलिप्टो

2
यदि एक टोरेंट क्लाइंट एक ही पीयर के साथ कई टीसीपी कनेक्शन बनाता है, तो यह ओपी की समस्या को हल करेगा। हालाँकि, मुझे नहीं पता कि क्या टोरेंट क्लाइंट वास्तव में एकल साथियों के साथ कई टीसीपी कनेक्शन बनाते हैं।
क्रोनोस डे 7'09

0

FTP डाउनलोड के लिए कई कनेक्शन का उपयोग करता है। यदि आप एसएसपी पर एक वीपीएन या एफ़टीपी पर एफ़टीपी के लिए एक सुरक्षित चैनल सेट कर सकते हैं , तो आपको अपने नेटवर्क लिंक को अधिकतम करने में सक्षम होना चाहिए। (ध्यान दें कि SSH पर FTP के लिए विशेष विचार आवश्यक है - लिंक देखें।)

एफटीपीएस (एसएसएल पर एफटीपी) भी वह कर सकता है जो आपको चाहिए।

आप एक SFTP क्लाइंट का उपयोग कर सकते हैं जो कई कनेक्शनों का समर्थन करता है, लेकिन मुझे यकीन नहीं है कि SFTP एक फ़ाइल के लिए कई कनेक्शनों का समर्थन करता है। यह वही करना चाहिए जो आपको सबसे अधिक समय की आवश्यकता है, लेकिन आपको अधिकतम थ्रूपुट नहीं दे सकता है जब आपको केवल एक बड़ी फ़ाइल को स्थानांतरित करना होगा।


क्या SFTP ज्यादा आसान नहीं होगा और जैसे (यदि अधिक नहीं) सुरक्षित है?
मार्क रेनॉफ

1
@rob: आपको कहां से मिला कि "एफ़टीपी फ़ाइल स्थानांतरण के लिए कई कनेक्शन का उपयोग करता है"? कुछ क्लाइंट एफ़टीपी से डाउनलोड करने के लिए कई स्ट्रीम की अनुमति देते हैं , लेकिन एफ़टीपी क्लाइंट / सर्वर कॉम्बो निश्चित रूप से एफ़टीपी पर अपलोड करने के लिए कई स्ट्रीम की अनुमति नहीं देता है ।
क्रोनोस डे

@ मर्क: हां, एसएफटीपी शायद आसान और समान रूप से सुरक्षित होगा, लेकिन मुझे नहीं पता कि क्या यह एकल फ़ाइल को स्थानांतरित करने के लिए कई कनेक्शनों का समर्थन करता है। फिर भी सुझाव के लिए धन्यवाद; मैं इसे सूची में जोड़ दूंगा।
लूट

1
@ सिंक्रोस: क्षमा करें यह स्पष्ट नहीं था; मैं सुझाव दे रहा था कि ZimmyDubZongyZongDubby CentOS सर्वर से फ्रीबीएस क्लाइंट तक डाउनलोड करने के लिए एफ़टीपी का उपयोग करें। मैंने "फ़ाइल स्थानांतरण" के बजाय विशेष रूप से "डाउनलोड" कहने का उत्तर अपडेट किया है।
लुटेरा

-1

समाधान 1: मुझे यकीन नहीं है कि यह आपके मामले में व्यावहारिक है, लेकिन आप एक स्पोकन आर्काइव बना सकते हैं (उदाहरण के लिए, एक तिकड़ी विभाजन विखंडू या स्पंजी 7zip आर्काइव में), फिर उसे भेजने के लिए rsync के कई उदाहरणों का उपयोग करें नेटवर्क और उन्हें दूसरी तरफ फिर से जोड़ना / निकालना। आप एक सामान्य-उद्देश्य वाली स्क्रिप्ट लिख सकते हैं जिसके तर्क हस्तांतरित होने वाली निर्देशिका और उपयोग करने के लिए कनेक्शन की संख्या है। स्पष्ट नकारात्मक पक्ष यह है कि आपको दोनों पक्षों पर दो बार अधिक खाली स्थान की आवश्यकता होगी, और दोनों छोरों पर फ़ाइलों को संग्रह / निकालने का अतिरिक्त ओवरहेड होगा।

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


किसी को भी डाउनवोट पर विस्तार से ध्यान देना चाहिए?
लुटेरा

-1

क्या आप दो मशीनें विश्वसनीय वातावरण में चल रही हैं? तुम netcat कोशिश कर सकते हैं । सर्वर की ओर:

tar -czf - ./yourdir | nc -l 9999

और ग्राहक पर:

nc your.server.net 9999 > yourdir.tar.gz

आपके पास क्लाइंट कनेक्शन एक ssh सुरंग का उपयोग हो सकता है:

ssh -f -L 23333:127.0.0.1:9999 foo@your.server.net sleep 10; \
    nc 127.0.0.1 23333 > yourdir.tar.gz

यहां तक ​​कि एक पूरे विभाजन को इस तरह से स्थानांतरित किया जा सकता है:

dd if=/dev/sda1 | gzip -9 | nc -l 9999

और ग्राहक पर:

nc your.server.net 9999 > mysda1.img.gz

ध्यान दें

netcat वहां से सबसे सुरक्षित स्थानांतरण उपकरण नहीं है, लेकिन सही वातावरण में तेज़ हो सकता है क्योंकि इसमें इतना कम ओवरहेड होता है।

HowtoForge का एक अच्छा उदाहरण पृष्ठ है


यह एक सामान्य उत्तर की तरह लगता है जो उसके प्रश्न का उत्तर नहीं देता है। मैं नहीं देख सकता कि आपका कोई भी समाधान समानांतर में कैसे स्थानांतरित होगा, एनसी केवल एक ही कनेक्शन है जहां तक ​​मुझे पता है
davr

आप सही हो सकते हैं, हालांकि, एनसी का उपयोग करके, आपके पास खोले गए बंदरगाहों पर नियंत्रण है। यदि आप इतने इच्छुक हैं तो आप 10,000 निर्दिष्ट कर सकते हैं।
डेवपैरिलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.