2TB (10 मिलिट्री फ़ाइल + dirs) को स्थानांतरित करना, मेरी अड़चन क्या है?


21

पृष्ठभूमि

मैं अंतरिक्ष से बाहर भाग गया /home/dataऔर इसे स्थानांतरित /home/data/repoकरने की आवश्यकता है /home/data2

/home/data/repoइसमें 1M dirs होते हैं, जिनमें से प्रत्येक में 11 dirs और 10 फाइलें होती हैं। यह 2TB योग है।

/home/datadir_index सक्षम के साथ ext3 पर है। /home/data2ext4 पर है। रनिंग सेंटोस 6.4।

मुझे लगता है कि ये दृष्टिकोण इस तथ्य के कारण धीमा हैं कि repo/1 मिलियन डायर सीधे इसके नीचे हैं।


प्रयास 1: mvतेजी से होता है, लेकिन बाधित होता है

अगर यह काम पूरा हो जाता तो मैं किया जा सकता था:

/home/data> mv repo ../data2

लेकिन 1.5TB को स्थानांतरित करने के बाद इसे बाधित कर दिया गया था। यह लगभग 1GB / मिनट पर लिख रहा था।

प्रयास 2: rsyncफ़ाइल सूची के निर्माण के 8 घंटे के बाद क्रॉल करता है

/home/data> rsync --ignore-existing -rv repo ../data2

'वृद्धिशील फ़ाइल सूची' के निर्माण में कई घंटे लग गए और फिर यह 100 एमबी / मिनट पर स्थानांतरित हो गया।

मैं इसे तेज़ तरीका आज़माने के लिए रद्द करता हूँ।

प्रयास 3a: mvशिकायत करता है

एक उपनिर्देशिका पर इसका परीक्षण:

/home/data/repo> mv -f foobar ../../data2/repo/
mv: inter-device move failed: '(foobar)' to '../../data2/repo/foobar'; unable to remove target: Is a directory

मुझे यकीन नहीं है कि यह किस बारे में त्रुटि है, लेकिन शायद cpमुझे जमानत दे सकती है ।।

3 बी का प्रयास: cp8 घंटे के बाद कहीं नहीं मिलता है

/home/data> cp -nr repo ../data2

यह 8 घंटे के लिए डिस्क को पढ़ता है और मैं इसे रद्द करने और rsync पर वापस जाने का निर्णय लेता हूं।

प्रयास 4: rsyncफ़ाइल सूची के निर्माण के 8 घंटे के बाद क्रॉल करता है

/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2

मैं --remove-source-filesसोचता था कि अगर मैं अब सफाई शुरू कर दूं तो यह और तेज हो सकता है।

फ़ाइल सूची बनाने में कम से कम 6 घंटे का समय लगता है फिर यह 100-200 एमबी / मिनट पर स्थानांतरित हो जाता है।

लेकिन सर्वर रात भर बोझ था और मेरा कनेक्शन बंद हो गया।

प्रयास 5: केवल 300GB करने के लिए छोड़ दिया तो यह एक दर्द है

/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2

फिर से व्यवधान डाला। -Wलगभग बनाने के लिए "वृद्धिशील फ़ाइल सूची भेजने" तेजी से है, जो मेरी समझ का कोई मतलब नहीं होना चाहिए लग रहा था। भले ही, स्थानांतरण बहुत धीमा है और मैं इस पर ध्यान दे रहा हूं।

प्रयास 6: tar

/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)

मूल रूप से सब कुछ फिर से कॉपी करने का प्रयास कर रहे हैं, लेकिन मौजूदा फ़ाइलों की अनदेखी कर रहे हैं। यह मौजूदा फ़ाइलों के 1.7TB के माध्यम से उतारा है, लेकिन कम से कम यह 1.2GB / मिनट पर पढ़ रहा है।

अब तक, यह एकमात्र आदेश है जो तुरंत संतुष्टि देता है।

अद्यतन: फिर से बाधित, किसी भी तरह, nohup के साथ भी ..

प्रयास 7: हरकीरी

फिर भी इस पर बहस कर रहे हैं

प्रयास 8: स्क्रिप्टेड 'मर्ज' के साथ mv

गंतव्य डायर में लगभग 120k खाली डायर थे, इसलिए मैं भाग गया

/home/data2/repo> find . -type d -empty -exec rmdir {} \;

रूबी लिपि:

SRC  = "/home/data/repo"
DEST = "/home/data2/repo"

`ls #{SRC}  --color=never > lst1.tmp`
`ls #{DEST} --color=never > lst2.tmp`
`diff lst1.tmp lst2.tmp | grep '<' > /home/data/missing.tmp`

t = `cat /home/data/missing.tmp | wc -l`.to_i
puts "Todo: #{t}"

# Manually `mv` each missing directory
File.open('missing.tmp').each do |line|
  dir = line.strip.gsub('< ', '')
  puts `mv #{SRC}/#{dir} #{DEST}/`
end

किया हुआ।


आप सही हैं, इसे प्रत्येक डायरेक्टरी को ढूंढना और एनुमरेट करना है और 1 मिलियन डायर दर्दनाक होने वाला है।
सायबरनार्ड

2
उजले पक्ष को देखें ... यदि यह विंडोज होता, तो आपके पास एक लाख उपनिर्देशिकाएँ भी नहीं हो सकती थीं और अभी भी एक ओएस है जो काम करता है। :)
जैक

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

5
नहीं, यह नहीं हो सकता। mvक्षमा नहीं कर रहा है, यदि आप डिस्कनेक्ट हो रहे हैं तो आप डेटा खो सकते हैं और यह भी नहीं जानते हैं। जैसा कि आपने कहा था कि आप यह कर रहे हैं ssh, मैं अत्यधिक उपयोग screenऔर अलग करने की सलाह देता हूं । लॉगिंग सक्षम करें और उस तरह से ट्रैक रखें। यदि आप वर्बोज़ का उपयोग कर रहे हैं तो अभी और समय लगेगा। इसके अलावा कोशिशiotop
justbrowsing

2
@ ज़बरदस्त - अच्छा फोन पर screen। मैं क्रिया के बारे में सोच रहा था, लेकिन मुझे लगता है कि अभी इसे पुनः आरंभ करने में बहुत देर हो चुकी है tar। और iotopपिछले कुछ दिनों से मेरी पसंदीदा उपयोगिता है :)
टिम

जवाबों:


6

कभी बड़े कार्यों को छोटे कार्यों में विभाजित करने के बारे में सुना है?

/ होम / डेटा / रेपो में 1M डायरियां होती हैं, जिनमें से प्रत्येक में 11 डायरियां और 10 फाइलें होती हैं। यह 2TB योग है।

rsync -a /source/1/ /destination/1/
rsync -a /source/2/ /destination/2/
rsync -a /source/3/ /destination/3/
rsync -a /source/4/ /destination/4/
rsync -a /source/5/ /destination/5/
rsync -a /source/6/ /destination/6/
rsync -a /source/7/ /destination/7/
rsync -a /source/8/ /destination/8/
rsync -a /source/9/ /destination/9/
rsync -a /source/10/ /destination/10/
rsync -a /source/11/ /destination/11/

(...)

कॉफी ब्रेक का समय।


1
जिस लाभ पर मैं जोर दे रहा हूं, वह यह है कि आप मैन्युअल रूप से छोटे भागों में प्रगति को ट्रैक करते हैं ताकि कार्य को फिर से शुरू करने में कम समय लगे यदि कुछ भाग निरस्त हो जाता है (क्योंकि आप जानते हैं कि कौन से चरण सफलतापूर्वक पूरे हुए थे)।
урослав Рахматуллин

यह मूल रूप से मैं अंत में क्या कर रहा था, को छोड़कर mv। दुर्भाग्य से कोई उपकरण बैठक mvऔर rsyncआधे रास्ते में नहीं है।
टिम

4

यह क्या हो रहा है:

  • प्रारंभ में rsync फ़ाइलों की सूची का निर्माण करेगा।
  • फ़ाइल सूची की एक प्रारंभिक छँटाई के कारण इस सूची का निर्माण वास्तव में धीमा है।
  • इसे ls -f -1 का उपयोग करके और rsync का उपयोग करने वाली फ़ाइलों के सेट के निर्माण के लिए xargs के साथ संयोजन करके या फ़ाइल सूची के साथ किसी फ़ाइल में आउटपुट को पुनर्निर्देशित करके इसे टाला जा सकता है।
  • फ़ोल्डर के बजाय rsync के लिए इस सूची को पास करना, rsync को तुरंत काम करना शुरू कर देगा।
  • लाखों फ़ाइलों वाली फ़ोल्डरों में ls -f -1 की यह चाल इस लेख में पूरी तरह से वर्णित है: http://unixetc.co.uk/2012/05/20/large-directory-causes-ls-to-hang/

1
क्या आप rsync के साथ ls का उपयोग करने का एक उदाहरण दे सकते हैं? मेरे पास एक समान है लेकिन समान स्थिति नहीं है। मशीन एआई में rsyncd चल रहा है और एक बड़ी निर्देशिका ट्री मैं मशीन B पर स्थानांतरित करना चाहता हूं (वास्तव में, 90% निर्देशिका पहले से ही B पर है)। समस्या यह है कि मुझे एक अस्थिर मोबाइल कनेक्शन का उपयोग करना पड़ता है जो अक्सर गिरता है। फ़ाइल सूची के निर्माण पर एक घंटे का खर्च हर बार जो मैं पुनः आरंभ करता हूं वह काफी अक्षम है। इसके अलावा, बी NAT के पीछे है जो मुझे नियंत्रित नहीं करता है, इसलिए ए -> बी को जोड़ना मुश्किल है, जबकि बी -> ए आसान है।
db

@Db से सहमत हैं। यदि एक उदाहरण दिया जा सकता है, जो इस उत्तर को और अधिक उपयोगी बना देगा।
redfox05

1

यहां तक ​​कि अगर rsync धीमा है (यह धीमा क्यों है? शायद -z मदद करेगा) ऐसा लगता है कि आप इसे बहुत आगे बढ़ गए हैं, इसलिए आप बस कोशिश कर सकते हैं:

यदि आपने --remove-source-files का उपयोग किया है, तो आप खाली निर्देशिकाओं को हटाकर अनुवर्ती कर सकते हैं। --remove-source-files सभी फ़ाइलों को हटा देगा, लेकिन वहां निर्देशिकाओं को छोड़ देगा।

बस सुनिश्चित करें कि आप एकाधिक पास करने के लिए --delete के साथ -remove-source-files का उपयोग करें।

बढ़ी हुई गति के लिए भी आप --inplace का उपयोग कर सकते हैं

यदि आप एक सर्वर पर दूरस्थ रूप से ऐसा करने की कोशिश कर रहे हैं, तो आगे बढ़ें और इसे 'स्क्रीन' सत्र के अंदर चलाएं। कम से कम उस तरह से आप इसे चलने दे सकते हैं।

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