Dosya önbelleğini kullanmadan büyük dosyaları daha hızlı kopyalayabilir miyim?


19

preloadPaketi ekledikten sonra uygulamalarım hızlanıyor gibi görünüyor, ancak büyük bir dosyayı kopyalarsam dosya önbelleği dosyanın boyutunu iki katından daha fazla büyütür.

Tek bir 3-4 GB sanal kutu görüntüsünü veya video dosyasını harici bir sürücüye aktararak, bu büyük önbellek, önceden yüklenmiş tüm uygulamaları bellekten kaldırmış gibi görünerek yükleme sürelerinin artmasına ve genel performans düşüşlerine neden olur.

Büyük, çok gigabaytlık dosyaları önbelleğe almadan kopyalamanın bir yolu var mı (yani dosya önbelleğini atlamak)? Veya belirli klasörlerin önbelleğe alınmasını beyaz listeye veya kara listeye almanın bir yolu mu?

Yanıtlar:


19

Ve nocachegibi bir komutun başına geçebilen yardımcı program vardır . Bu ekler bir kütüphane önceden yükleyerek çalışır ile herhangi bir açık çağrılara bayrak.ioniceniceposix_fadvisePOSIX_FADV_DONTNEED

Basit bir ifadeyle, çekirdeğe söz konusu dosya için önbelleğe almanın gerekli olmadığını bildirir ; çekirdek normalde dosyayı önbelleğe almaz. Teknik ayrıntılar için buraya bakın .

Herhangi bir büyük kopyalama işi için harikalar yaratır, örneğin arka planda çok terabaytlık bir diski çalışan sisteminiz üzerinde mümkün olan en az etkiyle yedeklemek istiyorsanız, birlikte bir şeyler yapabilirsiniz nice -n19 ionice -c3 nocache cp -a /vol /vol2.

Ubuntu 13.10 ve sonraki sürümlerde bir paket sunulacaktır. Önceki bir sürümdeyseniz 13.10 paketini kurabilir veya François Marier'in bu 12.04 backport'unu seçebilirsiniz .


GUI aracılığıyla yapılabilecek bir şeyin yanı sıra 'önbellek yok' klasörlerini kara listeye almanın bir yolunu umuyordum, ancak bunun şimdilik yapması gerekecek.
Veazer

12

Tek Büyük dosyalar, kullanım için ddolan doğrudan dosya önbelleği baypas etmek I / O:

Bir (veya birkaç) büyük çok gigabaytlık dosyayı aktarmak istiyorsanız, aşağıdakileri yapmak kolaydır dd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • directBayraklar anlatmak ddçekirdeğin doğrudan G / Ç seçeneği (kullanmak O_DIRECTböylece tamamen dosya önbelleği atlayarak okuma ve yazma sırasında).
  • bsFiziksel disk işlemlerinin sayısını en aza indirmek için çünkü blokboyu seçeneği oldukça büyük bir değere ayarlanması gerekir ddgerçekleştirmelisiniz okur beri / yazma artık önbelleğe alınır ve çok sayıda küçük direkt operasyonlar ciddi yavaşlamaya neden olabilir.
    • 1 ila 32 MB arasındaki değerlerle deneme yapmaktan çekinmeyin; yukarıdaki ayar 4 MB'dir ( 4M).

Birden çok / özyinelemeli dizin kopyaları için maalesef kolay ulaşılabilir bir araç yoktur; Her zamanki cpvb yok direkt I / O'yu desteklemektedir.

/ e iflags & oflags doğru iflag ve oflag olarak değiştirildi


1
Yinelemeli zsh' **operatörü ile yapılabilir . zshdepolardan manuel olarak yüklenmesi gerekir.
Monica'yı eski durumuna getirin - Jul--

1
Aslında hayır. dd'nin garip sözdizimi ** oprtator'a faul yapar. Hala (normalde bağımsız değişken vardı bir shell script kullanabilirsiniz dd.sh in.file out.fileDosya adlarında ** ile) ve dosya adlarını verdi ddkullanarak $1, $2DD'in garip sözdizimi tarafından Faul edilmemelidir vb.
Monica'yı eski durumuna getir - ζ--

1
Doğrudan yapım çok yavaştır, çünkü AFAIK, muhtemelen istediğiniz şey olmayan ve bir kıyaslama senaryosunda gerçekçi olmayan readahead önbelleklerini de devre dışı bırakır. Bunun yerine, işletim sistemine dosyaya veya önbelleğe alınmış önbelleğe ihtiyacınız olmadığını söyleyen "iflag = nocache oflag = nocache" kullanın.
stolsvik

1

Ve ddkullanarak bir dizini yinelemeli olarak kopyalayabilirsinizfindmkdir

İki problemi çözmemiz gerekiyor:

  1. dd dizinlerle ne yapacağını bilmiyor
  2. dd bir seferde yalnızca bir dosya kopyalayabilir

Önce giriş ve çıkış dizinlerini tanımlayalım:

SOURCE="/media/source-dir"
TARGET="/media/target-dir"

Şimdi cdkaynak dizinine girelim find, böylece kolayca işleyebileceğimiz göreceli dizinleri rapor edelim:

cd "$SOURCE"

Dizin ağacı çoğaltın $SOURCEiçin$TARGET

find . -type d -exec mkdir -p "$TARGET{}" \;

Dosyaları, önbelleği yazma girişinden $SOURCEçıkarmaya kopyalayın $TARGET(ancak okuma önbelleğini kullanın!)

find . -type f -exec dd if={} of="$TARGET{}" bs=8M oflag=direct \;

Bunun dosya değiştirme sürelerini, sahipliğini ve diğer öznitelikleri korumadığını lütfen unutmayın.

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.