Bagaimana saya bisa mempercepat operasi pada file jarang dengan tar, gzip, rsync?

9

Saya punya file yang jarang. ( du -hmelaporkan 3G dan du -h --apparent-sizemelaporkan 100G.) Sejauh ini, sangat bagus.

Sekarang, ketika saya ingin mengompres file menggunakan taratau mengirimnya melalui jaringan menggunakan rsync, itu akan memerlukan waktu sebanyak 3G. Tampaknya alat ini membaca semua nol.

Saya pikir lubangnya entah bagaimana ditandai dan alat-alat ini entah bagaimana bisa melompati mereka?

Kemungkinan tidak ada masalah dengan file saya?

Apakah ini fitur yang hilang tardan rsynctidak mencari file jarang? Saya menggunakan tarparameter --sparse, tapi itu tidak mempercepat. rsyncParameter juga tidak --sparse.

Apakah ada cara untuk mempercepat alat ini pada file yang jarang?

adrelanos
sumber

Jawaban:

7

bsdtar(setidaknya dari libarchive3.1.2) dapat mendeteksi bagian yang jarang menggunakan FS_IOC_FIEMAPioctl pada sistem file yang mendukungnya (meskipun mendukung sejumlah API lain juga), namun, setidaknya dalam pengujian saya, anehnya, itu adalah tidak dapat menangani tarfile yang dihasilkannya sendiri (terlihat seperti bug sekalipun).

Namun menggunakan GNU taruntuk mengekstraknya berfungsi, tetapi kemudian GNU tar tidak dapat menangani beberapa atribut tambahan yang didukung bsdtar.

Begitu

bsdtar cf - sparse-files | (cd elsewhere && tar xpf -)

berfungsi selama file tidak memiliki atribut atau flag yang diperluas.

Masih tidak berfungsi untuk file yang sepenuhnya jarang (hanya nol) karena FS_IOC_FIEMAPioctl kemudian mengembalikan tingkat 0 dan sepertinya bsdtartidak menangani dengan benar (bug lain?).

star( Schily tar ) adalah implementasi tar opensource lain yang dapat mendeteksi file jarang (gunakan -sparseopsi) dan tidak memiliki bug tersebut bsdtar(tetapi tidak dikemas oleh banyak sistem).

Stéphane Chazelas
sumber
2

Artikel ini memiliki beberapa saran berguna untuk rsyncsetidaknya:

Masalah

Menggunakan rsync --sparse works, tetapi menyebabkan banyak penulisan disk yang tidak perlu. Mengubah 10 byte pada 50GB panjang (1GB digunakan) harus menyebabkan hanya satu atau dua blok yang ditulis, ini menyebabkan 1GB ditulis. Ini lambat, dan mungkin tidak baik untuk umur disk yang panjang.

Menggunakan rsync --inplacekarya, tetapi membuat file non-jarang.

Anda tidak dapat menggunakan --sparse dan --inplace secara bersamaan :-( ini tidak diizinkan oleh rsync. Rsync: --sparse tidak dapat digunakan dengan --inplace

Larutan

Jika Anda menggunakan --inplace untuk memperbarui file sparse yang sudah ada sebelumnya, file akan tetap jarang dan hanya memiliki sejumlah kecil blok yang ditulis. Hanya ketika rsync --inplace membuat file yang membuatnya menjadi non-sparse.

Jadi solusinya adalah membuat file yang sesuai, dengan panjang yang benar, kosong, jarang pada mesin target untuk setiap file pada mesin sumber - jika file tersebut belum ada pada mesin target.

Kemudian rsync --inplace akan berfungsi sebagaimana mestinya, meninggalkan file jarang, dan hanya menulis blok yang diubah ke disk.

Jadi, jika saya membacanya dengan benar, Anda ingin terlebih dahulu membuat file kosong kosong pada target. Anda dapat melakukannya dengan

truncate -s 3G filename

Anda kemudian dapat menggunakannya rsync --inplaceuntuk menyalin file. Ini seharusnya hanya perlu satu kali.


Artikel yang sama menyarankan menggunakan Virtsync yang

alat baris perintah Linux komersial senilai $ 49 untuk menyinkronkan konten file besar (seperti gambar disk virtual dan basis data mesin).

Ini mungkin solusi terbaik jika Anda bersedia membayar karena tampaknya ditulis khusus untuk situasi seperti ini.

terdon
sumber