พื้นหลัง
ฉันวิ่งออกมาจากพื้นที่บน/home/data
และความจำเป็นในการถ่ายโอนไป/home/data/repo
/home/data2
/home/data/repo
มี 1M dirs ซึ่งแต่ละไฟล์มี 11 dirs และ 10 ไฟล์ มันรวม 2TB
/home/data
เปิดใช้ ext3 เมื่อเปิดใช้งาน dir_index
/home/data2
อยู่ใน ext4 CentOS กำลังใช้งาน 6.4
ฉันคิดว่าวิธีการเหล่านี้ช้าเพราะความจริงที่ว่าrepo/
มี 1 ล้าน dirs อยู่ข้างใต้
ความพยายามที่ 1: mv
เร็ว แต่ขัดจังหวะ
ฉันสามารถทำได้ถ้าสิ่งนี้เสร็จสิ้น:
/home/data> mv repo ../data2
แต่มันถูกขัดจังหวะหลังจากถ่ายโอน 1.5TB มันเขียนที่ประมาณ 1GB / นาที
ความพยายามที่ 2: rsync
รวบรวมข้อมูลหลังจากสร้างรายการไฟล์ 8 ชั่วโมง
/home/data> rsync --ignore-existing -rv repo ../data2
ใช้เวลาหลายชั่วโมงในการสร้าง 'รายการไฟล์ที่เพิ่มขึ้น' จากนั้นจะถ่ายโอนที่ 100MB / นาที
ฉันยกเลิกเพื่อลองใช้วิธีที่รวดเร็วกว่า
พยายาม 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
ประกันตัวฉัน
พยายาม 3b: 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-200MB / นาที
แต่เซิร์ฟเวอร์นั้นค้างคืนและการเชื่อมต่อของฉันปิด
ความพยายามที่ 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 / นาที
จนถึงตอนนี้เป็นคำสั่งเดียวที่ให้ความพึงพอใจทันที
Update: ขัดจังหวะอีกครั้งอย่างใดแม้จะมี nohup ..
ความพยายามที่ 7: ฮาราคีรี
ยังคงถกเถียงกันเรื่องนี้
ความพยายามที่ 8: สคริปต์ 'รวม' กับ mv
ปลายทางของฉันมีที่ว่างเปล่าประมาณ 120k ดังนั้นฉันจึงวิ่ง
/home/data2/repo> find . -type d -empty -exec rmdir {} \;
สคริปต์ Ruby:
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
DONE
mv
อีกครั้ง ในทางทฤษฎีmv
จะลบไฟล์ต้นฉบับเฉพาะเมื่อไฟล์ปลายทางได้รับการคัดลอกอย่างสมบูรณ์ดังนั้นจึงควรใช้งานได้ คุณมีการเข้าถึงเครื่องหรือทำผ่านการssh
เชื่อมต่อหรือไม่?
mv
ไม่ให้อภัยหากคุณยังคงถูกตัดการเชื่อมต่อคุณอาจสูญเสียข้อมูลและไม่รู้ตัวเลย อย่างที่คุณบอกว่าคุณกำลังทำสิ่งนี้อยู่ssh
ฉันขอแนะนำให้ใช้screen
และถอดออก เปิดใช้งานการบันทึกและติดตามวิธีนั้น หากคุณกำลังใช้ verbose มันจะใช้เวลานาน นอกจากนี้ยังพยายามiotop
screen
โทรดีใน ฉันสงสัยเกี่ยวกับ verbose แต่ฉันเดาว่ามันสายเกินไปที่จะเริ่มต้นใหม่tar
ในขณะนี้ และiotop
ได้รับยูทิลิตี้ที่ชื่นชอบสำหรับไม่กี่วันที่ผ่านมา :)