Hareketli 2 TB (10 mil dosya + dir), tıkanıklığım nedir?


21

Arka fon

Ben boşluk bitti üzerine /home/datatransferi ve ihtiyaca /home/data/repogöre /home/data2.

/home/data/repoHer biri 11 ve 10 dosya içeren 1M dizin içerir. Toplam 2TB.

/home/dataext_3'te dir_index etkinleştirilmiş durumda. /home/data2ext4'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: mvhı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: rsync8 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 cpbeni kurtarır.

3b girişimi: cp8 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: rsync8 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. -WNeredeyse 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.


Haklısın, her bir dizini bulup sıralamak gerekiyor ve 1 milyon dir acı verici olacak.
cybernard

2
Parlak tarafa bakın ... eğer Windows olsaydı, bir milyon alt dizine bile sahip olamazdınız ve hala çalışan bir işletim sistemine sahip olamazdınız. :)
Jack

1
@Tim, neden bir daha yapmıyorsun 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 sshbağlantı ile mi yapılıyor ?
terdon

5
Hayır yapamaz. mvaffetmez, bağlantınızı kesmeye devam ederseniz, veri kaybedebilirsiniz ve hatta bilmiyor olabilirsiniz. Bunu yaptığınızı söylediğiniz gibi ssh, kullanmanızı screenve 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
sadece

2
@justbrowsing - İyi çağrı screen. Ayrıntılı bir şey merak ediyordum ama sanırım tarşimdi yeniden başlamak için çok geç . Ve iotopson birkaç gündür en sevdiğim yardımcı program oldu :)
Tim

Yanıtlar:


6

Büyük görevleri daha küçük görevlere bölmeyi hiç duydunuz mu?

/ home / data / repo, her biri 11 ve 10 dosya içeren 1M dizin içerir. Toplam 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/

(...)

Kahve molası zamanı.


1
Belli belirsiz vurgulayan ediyorum fayda olduğunu size küçük parçalar halinde ilerlemeyi izlemek elle kısmı iptal edilirse (adımların başarıyla tamamlanan biliyorum çünkü) görevi sürdürme zaman lesss alacak şekilde yerleştirin.
Ярослав Рахматуллин

Temelde bunun dışında sonunda yaptığım şey bu mv. Talihsiz bir araç toplantısı mvve rsyncyarısı yoktur.
Tim

4

Bu ne oluyor:

  • Başlangıçta rsync dosyaların listesini oluşturacaktır.
  • Bu listenin oluşturulması, dosya listesinin ilk sıralaması nedeniyle gerçekten yavaştır.
  • Bu, ls -f -1 kullanarak ve rsync'nin kullanacağı dosya kümesini oluşturmak için xargs ile birleştirerek veya çıktısını dosya listesiyle bir dosyaya yönlendirerek önlenebilir.
  • Bu listeyi klasör yerine rsync'ye geçirmek, rsync'in hemen çalışmaya başlamasını sağlar.
  • Milyonlarca dosya içeren klasörler üzerindeki ls -f -1 dizisi bu makalede tam olarak açıklanmıştır: http://unixetc.co.uk/2012/05/20/large-directory-causes-ls-to-hang/

1
Ls'nin rsync ile nasıl kullanılacağına dair bir örnek verebilir misiniz? Benzer fakat özdeş bir durumum yok. AI makinesinde çalışan rsyncd var ve büyük bir dizin ağacı B'ye aktarmak istiyorum (aslında dizinin% 90'ı zaten B'dedir). Sorun şu ki, bunu sık sık düşen kararsız bir mobil bağlantı kullanarak yapmak zorundayım. Her yeniden başlattığımda dosya listesini oluşturmak için bir saat harcamak oldukça yetersiz. Ayrıca B, NAT'ın arkasında olduğundan kontrol etmediğim için A -> B'yi bağlamak zordur, B -> A kolaydır.
db

@Db ile aynı fikirde. Bir örnek verilebilirse, bu cevabı çok daha kullanışlı hale getirir.
redfox05

1

Rsync yavaş olsa bile (neden yavaş? Belki -z yardımcı olacaktır) bir sürü taşınmış gibi ses çıkarır, böylece denemeye devam edebilirsiniz:

--Remove-source-files kullanıyorsanız, daha sonra boş dizinleri kaldırarak takip edebilirsiniz. --remove-source-files tüm dosyaları kaldıracak, ancak dizinleri orada bırakacaktır.

Sadece emin olun YAPMAYIN birden fazla geçiş yapmak --delete ile --remove kaynak dosyaları kullanın.

Ayrıca daha yüksek hız için kullanabilirsiniz - yerinde

Bunu bir sunucuda uzaktan yapmaya çalıştığınız için atılıyorsanız, devam edin ve bunu bir 'ekran' oturumu içinde çalıştırın. En azından bu şekilde çalışmasına izin verebilirsin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.