पृष्ठभूमि
मैं अंतरिक्ष से बाहर भाग गया /home/data
और इसे स्थानांतरित /home/data/repo
करने की आवश्यकता है /home/data2
।
/home/data/repo
इसमें 1M dirs होते हैं, जिनमें से प्रत्येक में 11 dirs और 10 फाइलें होती हैं। यह 2TB योग है।
/home/data
dir_index सक्षम के साथ ext3 पर है।
/home/data2
ext4 पर है। रनिंग सेंटोस 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 बी का प्रयास: cp
8 घंटे के बाद कहीं नहीं मिलता है
/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
किया हुआ।
mv
फिर से क्यों नहीं ? सिद्धांत रूप mv
में केवल एक स्रोत फ़ाइल को हटा देगा यदि गंतव्य फ़ाइल को पूरी तरह से कॉपी किया गया है तो उसे ठीक काम करना चाहिए । इसके अलावा, क्या आपके पास मशीन तक भौतिक पहुंच है या यह ssh
कनेक्शन के माध्यम से किया जाता है?
mv
क्षमा नहीं कर रहा है, यदि आप डिस्कनेक्ट हो रहे हैं तो आप डेटा खो सकते हैं और यह भी नहीं जानते हैं। जैसा कि आपने कहा था कि आप यह कर रहे हैं ssh
, मैं अत्यधिक उपयोग screen
और अलग करने की सलाह देता हूं । लॉगिंग सक्षम करें और उस तरह से ट्रैक रखें। यदि आप वर्बोज़ का उपयोग कर रहे हैं तो अभी और समय लगेगा। इसके अलावा कोशिशiotop
screen
। मैं क्रिया के बारे में सोच रहा था, लेकिन मुझे लगता है कि अभी इसे पुनः आरंभ करने में बहुत देर हो चुकी है tar
। और iotop
पिछले कुछ दिनों से मेरी पसंदीदा उपयोगिता है :)