Arka fon
Ben boşluk bitti üzerine /home/data
transferi ve ihtiyaca /home/data/repo
göre /home/data2
.
/home/data/repo
Her biri 11 ve 10 dosya içeren 1M dizin içerir. Toplam 2TB.
/home/data
ext_3'te dir_index etkinleştirilmiş durumda.
/home/data2
ext4'te. CentOS’un Çalıştırılması 6.4.
repo/
Altında 1 milyon direk olduğu için bu yaklaşımların yavaş olduğunu düşünüyorum.
Girişim 1: mv
hızlı ancak kesintiye uğradı
Bu bitmiş olsaydı yapılabilirdi:
/home/data> mv repo ../data2
Ancak 1.5 TB aktarıldıktan sonra kesildi. Yaklaşık 1GB / dk'da yazıyordu.
Deneme 2: rsync
8 saatlik bir dosya listesi oluşturulduktan sonra tarar
/home/data> rsync --ignore-existing -rv repo ../data2
'Artımlı dosya listesini' oluşturmak birkaç saat sürdü ve ardından 100 MB / dak hızında aktarıyor.
Daha hızlı bir yaklaşım denemek için iptal ediyorum.
3a girişimi: mv
şikayet
Bir alt dizinde test etmek:
/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
Bunun ne anlama geldiğinden emin değilim, ama belki cp
beni kurtarır.
3b girişimi: cp
8 saat sonra hiçbir yerde kalmıyor
/home/data> cp -nr repo ../data2
Diski 8 saat okur ve iptal edip rsync'e geri dönerim.
Deneme 4: rsync
8 saatlik bir yapım dosyası listesi sonrasında taranıyor
/home/data> rsync --ignore-existing --remove-source-files -rv repo ../data2
Ben kullanılan --remove-source-files
şimdi temizlemeyi başlatmak eğer daha hızlı hale getirebileceğini düşünerek.
Dosya listesini oluşturmak en az 6 saat sürüyor, ardından 100-200MB / dak hızında aktarılıyor.
Ancak sunucu gece boyunca yüklendi ve bağlantım kapandı.
Girişimi 5: BU ÇOK AĞIR NEDİR, SADECE 300 GB KALDIRILMASI GEREKENLER
/home/data> rsync --ignore-existing --remove-source-files -rvW repo ../data2
Tekrar kesildi. -W
Neredeyse benim anlayış mantıklı olmamalı, hangi hızlı "artırmalı dosya listesini gönderme" yapmak gibiydi. Ne olursa olsun, transfer korkunç derecede yavaştır ve bundan vazgeçiyorum.
Deneme 6: tar
/home/data> nohup tar cf - . |(cd ../data2; tar xvfk -)
Temel olarak her şeyi yeniden kopyalamaya çalışmak, ancak varolan dosyaları görmezden gelmek. Mevcut dosyaların 1.7 TB'ını doldurmalı ancak en azından 1.2GB / dak'da okuması gerekiyor.
Şimdiye kadar bu, anında tatmin sağlayan tek komut.
Güncelleme: nohup ile bile, bir şekilde tekrar kesildi ..
Girişimi 7: harakiri
Hala bunu tartışıyor
Girişimi 8: komut dosyasıyla 'birleştirme' mv
Hedef dir yaklaşık 120k boş dir kaldı, ben koştum
/home/data2/repo> find . -type d -empty -exec rmdir {} \;
Ruby betiği:
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
YAPILAN.
mv
? Teoride mv
, sadece hedef dosya tamamen kopyalanmışsa bir kaynak dosyayı silecektir, bu yüzden TAMAM çalışması gerekir . Ayrıca, makineye fiziksel erişiminiz var mı yoksa bu bir ssh
bağlantı ile mi yapılıyor ?
mv
affetmez, bağlantınızı kesmeye devam ederseniz, veri kaybedebilirsiniz ve hatta bilmiyor olabilirsiniz. Bunu yaptığınızı söylediğiniz gibi ssh
, kullanmanızı screen
ve ayırmanızı şiddetle tavsiye ediyorum . Günlüğü etkinleştirin ve bu şekilde takip edin. Ayrıntılı kullanıyorsanız, sadece daha uzun sürer. Ayrıca deneyiniotop
screen
. Ayrıntılı bir şey merak ediyordum ama sanırım tar
şimdi yeniden başlamak için çok geç . Ve iotop
son birkaç gündür en sevdiğim yardımcı program oldu :)