Bisakah saya menyalin file besar lebih cepat tanpa menggunakan cache file?

19

Setelah menambahkan preloadpaket, aplikasi saya tampaknya mempercepat tetapi jika saya menyalin file besar, cache file tumbuh lebih dari dua kali lipat ukuran file.

Dengan mentransfer gambar virtualbox 3-4 GB atau file video ke drive eksternal, cache yang besar ini tampaknya menghapus semua aplikasi yang dimuat sebelumnya dari memori, yang mengarah ke peningkatan waktu muat dan penurunan kinerja secara umum.

Apakah ada cara untuk menyalin file berukuran besar, multi-gigabyte tanpa menyimpannya (yaitu mem-bypass cache file)? Atau cara daftar putih atau daftar hitam folder tidak di-cache?

Veazer
sumber

Jawaban:

19

Ada nocacheutilitas, yang dapat ditukar dengan perintah seperti ionicedan nice. Ini bekerja dengan preloading perpustakaan yang ditambahkan posix_fadvisedengan POSIX_FADV_DONTNEEDbendera untuk setiap panggilan terbuka.

Dalam istilah sederhana, ini menyarankan kernel bahwa caching tidak diperlukan untuk file tertentu; kernel biasanya tidak akan men -cache file. Lihat di sini untuk detail teknis.

Itu sangat bagus untuk pekerjaan penyalinan besar, misalnya jika Anda ingin membuat cadangan disk multi-terabyte di latar belakang dengan dampak sekecil mungkin pada Anda menjalankan sistem, Anda dapat melakukan sesuatu nice -n19 ionice -c3 nocache cp -a /vol /vol2.

Paket akan tersedia di Ubuntu 13.10 dan lebih tinggi. Jika Anda berada pada rilis sebelumnya, Anda dapat menginstal paket 13.10 atau memilih untuk backport 12,04 ini oleh François Marier.

Piez Gunther
sumber
Saya berharap untuk sesuatu yang dapat dilakukan melalui GUI, serta cara untuk cukup daftar hitam folder 'tidak ada cache', tetapi ini harus dilakukan untuk saat ini.
Veazer
12

Untuk satu file besar, gunakan dddengan I / O langsung untuk mem-bypass cache file:

Jika Anda ingin mentransfer satu (atau beberapa) file multi-gigabyte besar, mudah dilakukan dengan dd:

dd if=/path/to/source of=/path/to/destination bs=4M iflag=direct oflag=direct
  • The directbendera memberitahu ddmenggunakan opsi I / O langsung kernel ( O_DIRECT) saat membaca dan menulis, sehingga benar-benar melewati file cache.
  • The bspilihan Blocksize harus diatur ke nilai yang cukup besar karena untuk meminimalkan jumlah operasi disk fisik ddharus melakukan, karena membaca / menulis tidak lagi cache dan terlalu banyak operasi langsung kecil dapat mengakibatkan perlambatan serius.
    • Jangan ragu untuk bereksperimen dengan nilai dari 1 hingga 32 MB; pengaturan di atas adalah 4 MB ( 4M).

Sayangnya, untuk banyak direktori / salinan rekursif , tidak ada alat yang mudah tersedia; yang biasa cp, dll tidak mendukung I / O langsung.

/ e iflags & oflags diubah ke iflag & oflag yang benar

ish
sumber
1
Rekursif bisa dilakukan dengan zsh's **operator. zshperlu diinstal secara manual dari repo.
Reinstate Monica - ζ--
1
Sebenarnya tidak. ddSintaks aneh mengotori oprtator **. Anda masih bisa menggunakan script shell yang mendapat argumen biasanya ( dd.sh in.file out.filedengan ** di nama file) dan memberikan nama file untuk ddmenggunakan $1, $2, dll, yang tidak boleh dilanggar oleh sintaks aneh dd.
Pasang kembali Monica - ζ--
1
Merek langsung sangat lambat, karena AFAIK juga menonaktifkan cache readahead, yang mungkin bukan yang Anda inginkan, dan juga tidak realistis dalam skenario pembandingan. Gunakan "iflag = nocache oflag = nocache" sebagai gantinya, yang persis mengatakan kepada OS bahwa Anda tidak memerlukan file-in atau file-out di-cache.
stolsvik
1

Anda dapat menyalin direktori secara rekursif dengan ddmenggunakan finddanmkdir

Kita perlu menyelesaikan dua masalah:

  1. dd tidak tahu apa yang harus dilakukan dengan direktori
  2. dd hanya dapat menyalin satu file pada satu waktu

Pertama mari kita tentukan direktori input dan output:

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

Sekarang mari cdmasuk ke direktori sumber sehingga findakan melaporkan direktori relatif yang dapat kita manipulasi dengan mudah:

cd "$SOURCE"

Gandakan pohon direktori dari $SOURCEke$TARGET

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

File duplikat dari $SOURCEke $TARGETmenghilangkan write cache (tapi memanfaatkan cache yang membaca!)

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

Harap dicatat bahwa ini tidak akan menghemat waktu modifikasi file, kepemilikan, dan atribut lainnya.

unfa
sumber