Kompresi terbaik untuk ZFS send / recv


15

Saya mengirim snapshot ZFS tambahan melalui jalur T1 point-to-point dan kami sampai pada titik di mana snapshot satu hari tidak dapat menembus kawat sebelum pencadangan berikutnya dimulai. Perintah kirim / terima kami adalah:

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | bzip2 -c | \
ssh offsite-backup "bzcat | zfs recv -F tank/vm"

Saya punya banyak siklus CPU. Apakah ada algoritma kompresi yang lebih baik atau metode alternatif yang dapat saya gunakan untuk mendorong lebih sedikit data melalui saluran?


1
Sudahkah Anda memverifikasi itu sebenarnya tautan yang merupakan bagian paling lambat? Mungkin disk membaca / menulis.
kbyrd

Ya, saya mendapatkan 80-100 MBps menghubungkan ke kotak melalui NFS. Koneksi jaringan adalah 1,5 Mbps
Sysadminicus

3
Sudahkah Anda mencoba menggunakan lzma --best?
Amok

1
Seperti yang ditunjukkan Amuck, LZMA saat ini merupakan algoritma kompresi data umum terbaik yang tersedia secara luas.
Chris S

Misalnya, statistik yang menunjukkan bahwa zfs receivebisa menjadi penyebab:received 953MB stream in 36 seconds (26.5MB/sec)
poige

Jawaban:


2

Sepertinya Anda sudah mencoba semua mekanisme kompresi terbaik dan masih dibatasi oleh kecepatan jalur. Dengan asumsi menjalankan garis yang lebih cepat adalah keluar dari pertanyaan, apakah Anda menganggap menjalankan cadangan lebih jarang sehingga mereka memiliki lebih banyak waktu untuk berjalan?

Singkatnya, apakah ada cara untuk mengurangi jumlah data yang ditulis? Tanpa mengetahui aplikasi Anda, sulit untuk mengatakannya, tetapi hanya melakukan hal-hal seperti memastikan aplikasi menimpa file yang sudah ada alih-alih membuat yang baru mungkin membantu. Dan pastikan Anda tidak menyimpan cadangan file temp / cache yang tidak Anda perlukan.


9

Inilah yang saya pelajari melakukan hal yang persis sama dengan yang Anda lakukan. Saya sarankan menggunakan mbuffer. Saat menguji di lingkungan saya, itu hanya membantu di sisi penerima, tanpa itu sama sekali pengiriman akan melambat saat menerima tertangkap.

Beberapa contoh: http://everycity.co.uk/alasdair/2010/07/using-mbuffer-to-speed-up-slow-zfs-send-zfs-receive/

Beranda dengan opsi dan sintaks http://www.maier-komor.de/mbuffer.html

Perintah kirim dari skrip replikasi saya:

zfs send -i tank/pool@oldsnap tank/pool@newsnap | ssh -c arcfour remotehostip "mbuffer -s 128k -m 1G | zfs receive -F tank/pool"

ini menjalankan mbuffer pada host jarak jauh sebagai buffer penerima sehingga pengiriman berjalan secepat mungkin. Saya menjalankan baris 20mbit dan menemukan bahwa memiliki mbuffer di sisi pengirim juga tidak membantu, juga kotak zfs utama saya menggunakan semua ram sebagai cache sehingga memberikan bahkan 1g untuk mbuffer akan mengharuskan saya untuk mengurangi beberapa ukuran cache.

Juga, dan ini bukan bidang keahlian saya, saya pikir lebih baik membiarkan ssh melakukan kompresi. Dalam contoh Anda, saya pikir Anda menggunakan bzip dan kemudian menggunakan ssh yang secara default menggunakan kompresi, jadi SSH mencoba untuk mengompresi aliran terkompresi. Saya akhirnya menggunakan arcfour sebagai cipher karena ini adalah CPU yang paling sedikit dan itu penting bagi saya. Anda mungkin memiliki hasil yang lebih baik dengan cipher lain, tapi saya sarankan menyarankan SSH melakukan kompresi (atau matikan kompresi ssh jika Anda benar-benar ingin menggunakan sesuatu yang tidak didukung).

Yang sangat menarik adalah menggunakan mbuffer saat mengirim dan menerima di localhost juga mempercepat:

zfs send tank/pool@snapshot | mbuffer -s 128k -m 4G -o - | zfs receive -F tank2/pool

Saya menemukan bahwa 4g untuk transfer localhost tampaknya menjadi manisan bagi saya. Ini hanya menunjukkan bahwa zfs mengirim / menerima tidak terlalu menyukai latensi atau jeda lainnya di aliran agar berfungsi dengan baik.

Hanya pengalaman saya, semoga ini membantu. Butuh beberapa saat untuk memikirkan semua ini.


1
Terima kasih banyak untuk posting ini. Melihat zfs mengirim lebih dekat saya sangat cepat mendapat perasaan bahwa ia memiliki perilaku buruk (alias "desain") ketika mengirim ke target yang terikat latensi. Setelah sekitar selusin hasil mengatakan bahwa zf tidak mungkin disalahkan atas apa pun. Saya sangat berterima kasih Anda meluangkan waktu untuk melihatnya dan memposting hasil Anda.
Florian Heigl

2

Ini adalah jawaban untuk pertanyaan spesifik Anda:

Anda dapat mencoba rzip , tetapi bekerja dengan cara yang sedikit berbeda dari kompres / bzip / gzip:

rzip berharap dapat membaca seluruh file, jadi itu tidak dapat dijalankan dalam pipa. Ini akan sangat meningkatkan persyaratan penyimpanan lokal Anda dan Anda tidak akan dapat menjalankan cadangan dan mengirim cadangan melalui kabel dalam satu pipa tunggal. Yang mengatakan, file yang dihasilkan, setidaknya menurut tes ini , sedikit lebih kecil.

Jika kendala sumber daya Anda adalah pipa Anda, Anda akan menjalankan backup 24x7 jadi Anda hanya perlu menyalin snapshot terus-menerus dan berharap Anda tetap melakukannya.

Perintah baru Anda adalah:

remotedir=/big/filesystem/on/remote/machine/
while 
  snaploc=/some/big/filesystem/
  now=$(date +%s)
  snap=snapshot.$now.zfssnap
  test -f $snaploc/$snap
do
  sleep 1
done

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 > $snaploc/$snap &&
rzip $snaploc/$snap &&
ssh offsite-backup "
        cat > $remotedir/$snap.rzip && 
        rzip -d $remotedir/$snap.rzip && 
        zfs recv -F tank/vm < $remotedir/$snap &&
        rm $remotedir/$snap " < $snaploc/$snap &&
rm $snaploc/$snap

Anda akan ingin memasukkan koreksi kesalahan yang lebih baik, dan Anda ingin mempertimbangkan menggunakan sesuatu seperti rsync untuk mentransfer file terkompresi sehingga jika transfer gagal di tengah Anda dapat mengambil di mana Anda tinggalkan.


2

Banyak hal telah berubah pada tahun-tahun sejak pertanyaan ini diposting:

1: ZFS sekarang mendukung replikasi terkompresi, tambahkan saja flag -c ke perintah kirim zfs, dan blok apa yang dikompres pada disk akan tetap terkompresi ketika mereka melewati pipa ke ujung lainnya. Mungkin masih ada lebih banyak kompresi yang bisa diperoleh, karena kompresi default di ZFS adalah lz4

2: Kompresor terbaik untuk digunakan dalam hal ini adalah zstd (ZStandard), sekarang memiliki mode 'adaptif' yang akan mengubah tingkat kompresi (antara 19 tingkat yang didukung, ditambah kecepatan zstd-cepat tingkat baru) berdasarkan kecepatan tautan antara zfs send dan zfs recv. Ini memampatkan sebanyak mungkin sambil menjaga antrian data menunggu untuk keluar pipa ke minimum. Jika tautan Anda cepat, tidak akan membuang waktu untuk mengompresi data lebih banyak, dan jika tautan Anda lambat, itu akan terus bekerja untuk mengompres data lebih banyak dan menghemat waktu Anda pada akhirnya. Ini juga mendukung kompresi berulir, jadi saya bisa memanfaatkan beberapa core, yang tidak dimiliki gzip dan bzip, di luar versi khusus seperti pigzip.


1

Saya berasumsi Anda tidak dapat meningkatkan bandwidth mentah situs Anda ...

Anda mungkin melihat manfaat dari tidak menggunakan kompresi pada host.

Jika Anda menggunakan sesuatu seperti pengoptimal lemah, itu akan dapat mengoptimalkan transfer jauh lebih baik jika Anda tidak mengkompres file sebelum Anda mengirimnya, yaitu Anda melakukan persis apa yang Anda lakukan tetapi menghapus bzip2 dari pipa. Setelah beberapa kali pencadangan Anda, pengoptimal yang lemah akan menembolok sebagian besar dari barang-barang yang dilihatnya dalam transfer dan Anda akan melihat peningkatan besar dalam kecepatan transfer.

Jika Anda memiliki anggaran terbatas, Anda mungkin dapat melihat peningkatan serupa dengan menggunakan rsync dan rsyncing snapshot yang tidak terkompresi , yaitu:

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 > /path/to/snapshotdir/snapshotfile
rsync /path/to/snapshotdir/snapshotfile offsite-backup:/remote/path/to/snapshotfile
ssh offsite-backup 'zfs recv -F tank/vm < /remote/path/to/snapshotfile'

Ini akan lebih cepat karena rsync hanya akan mentransfer perbedaan antara snapshot kemarin dan hari ini. Bergantung pada bagaimana proses snapshotting bekerja, mungkin masih ada banyak redundansi di antara keduanya bahkan jika mereka tidak benar-benar file yang sama sekali.

Pengoptimal lemah adalah cara yang jauh lebih mungkin untuk memperbaiki masalah ini (yah, metro ethernet adalah cara yang paling mungkin untuk menyelesaikan masalah ini, tetapi kami akan mengabaikannya). Rsync hanyalah bidikan liar dalam gelap yang layak diuji (secara lokal; rsync akan memberi tahu Anda berapa banyak waktu yang dihemat melalui salinan langsung) pada data lokal Anda sebelum menulis cek besar untuk serat atau pemasangan dasar sungai.


1

Untuk apa nilainya. Saya tidak akan melakukan pengiriman langsung | kompres | dekompresi | menerima ini dapat menyebabkan masalah di ujung penerima jika garis transfer terputus dan kolam Anda akan offline untuk waktu yang lama selama penerimaan. Kami mengirim ke file lokal kemudian gzip snapshot dan transfer menggunakan rsync (dengan dasar sungai), kemudian kami terima dari file tersebut. Dasar sungai tidak mengoptimalkan lalu lintas TETAPI jika ada masalah dengan transfer dan perlu dimulai kembali dasar sungai mempercepat pengiriman ulang.

Kami telah melihat tidak mengompresi snapshot inkremental, menggunakan kompresi Rsync dan tidak menggunakan kompresi apa pun selain dasar sungai. Sulit untuk mengatakan mana yang terbaik tetapi ketika kami mentransfer archivelog dari oracle dengan kompresi rsync, laju transfer kira-kira dua kali lipat dari file biasa dan dasar sungai (dengan RSync).

Jika Anda memiliki dasar sungai maka gunakan rsync bukan ssh karena dasar sungai memahami rsync dan akan mencoba untuk mengoptimalkannya dan akan menambahkan data ke cache (lihat di atas, memulai kembali transfer).


1

Pengalaman saya adalah bahwa zfs senditu cukup meledak walaupun jauh lebih cepat (rata-rata) daripada langkah kompresi berikut. Cadangan saya memasukkan buffering yang cukup setelah zfs senddan lebih setelah gzip:

zfs send $SNAP | mbuffer $QUIET -m 100M | gzip | mbuffer -q -m 20M | gpg ... > file

Dalam kasus saya, perangkat output terhubung dengan USB (bukan jaringan), tetapi buffering penting untuk alasan yang sama: Waktu cadangan keseluruhan lebih cepat ketika drive USB disimpan 100% sibuk. Anda tidak boleh mengirim lebih sedikit byte secara keseluruhan (seperti yang Anda minta) tetapi Anda masih bisa menyelesaikan lebih cepat. Buffering menjaga langkah kompresi terikat CPU dari menjadi IO-terikat.


1

Saya menggunakan pbzip2 sepanjang waktu (paralel bzip2) saat mengirim melalui WAN. Karena ini adalah utas, Anda dapat menentukan jumlah utas untuk digunakan dengan opsi -p. Instal pbzip2 terlebih dahulu pada host pengirim dan penerima, instruksi instalasi ada di http://compression.ca/pbzip2/ .

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | pbzip2 -c | \
ssh offsite-backup "pbzip2 -dc | zfs recv -F tank/vm"

Kunci utamanya adalah membuat snapshot pada interval yang sering (~ 10 menit) untuk membuat ukuran foto Anda lebih kecil lalu kirim setiap foto. ssh tidak akan melanjutkan dari aliran snapshot yang rusak jadi jika Anda memiliki snapshot besar untuk dikirim, pipa aliran ke pbzip2 kemudian dipecah menjadi potongan-potongan berukuran dikelola, kemudian rsync membagi file ke host penerima, kemudian pipa ke zfs untuk memulihkan file pbzip2 yang digabungkan.

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | pbzip2 -c | \
split -b 500M - /somedir/snap-inc-10-to-12.pbzip2--

ini akan menghasilkan file dengan nama potongan 500MB:

/somedir/snap-inc-10-to-12.pbzip2--aa
/somedir/snap-inc-10-to-12.pbzip2--ab
/somedir/snap-inc-10-to-12.pbzip2--ac
...

rsync untuk menerima host beberapa kali (Anda dapat rsync bahkan sebelum zfs mengirim selesai atau segera setelah Anda melihat potongan 500MB yang lengkap), tekan ctrl + c kapan saja untuk membatalkan:

while [[ true ]]; do rsync -avP /somedir/snap-inc-10-to-12.pbzip2--* offsite-backup:/somedir ; sleep 1; done;

zfs menerima:

cat /somedir/snap-inc-10-to-12.pbzip2--* | pbzip2 -dc | zfs recv -Fv tank/vm

User freind menyebutkan: Untuk apa nilainya. Saya tidak akan melakukan pengiriman langsung | kompres | dekompresi | menerima ini dapat menyebabkan masalah di ujung penerima jika garis transfer terputus dan kolam Anda akan offline untuk waktu yang lama selama penerimaan. - Saya pernah mengalami masalah sebelumnya dengan versi zfs yang lebih lama <28 di host penerima jika send / recv yang sedang berlangsung terganggu oleh tetes jaringan tetapi tidak sejauh bahwa pool dibatalkan. Itu menarik. Kirim ulang snapshot hanya jika "zfs recv" telah keluar di sisi penerima. Bunuh "zfs recv" secara manual jika diperlukan. zfs send / recv sekarang jauh lebih baik di FreeBSD atau Linux.


0

Anda dapat mengambil cipher yang lebih cepat untuk ssh mungkin blowfish-cbc, juga coba sakelar -123456789

-1 (or --fast) to -9 (or -best)

1
Dari halaman manual unix: alias --fast dan --best terutama untuk kompatibilitas GNU gzip. Secara khusus, --fast tidak membuat segalanya lebih cepat secara signifikan. Dan --best hanya memilih perilaku default.
Sysadminicus

1
jadi itu tidak berpengaruh dalam kasus Anda. Bagaimana dengan cipher?
Istvan

Saya beruntung dengan kompresi LZMA, tetapi mungkin tautan Anda terlalu lambat.
Amok

0

Anda perlu menguji dengan data Anda. Kirimkan saja ke file dan kompres dengan setiap metode.

Bagi kami, gzip membuat perbedaan besar dan kami menjalankan semuanya, tetapi bahkan tidak ada perbedaan 1% antara gzip dan bzip atau 7z.

Jika Anda menggunakan T1 yang lambat, Anda harus menyimpannya di file dan rsync.

Bagi mereka (bukan Anda) yang dibatasi sedikit lebih banyak oleh CPU daripada bandwidth, seperti lstvan mengatakan cipher yang berbeda seperti arcfour128 mempercepat semuanya. Kami menggunakannya secara internal saat memindahkan barang.


0

Eksperimen dengan mengaktifkan dedup untuk zfs kirim dengan -D. Penghematan tergantung pada seberapa banyak duplikasi yang ada dalam data Anda, tentu saja.


Karena dia menggunakan -iyang menyiratkan cadangan "tambahan", tidak ada banyak harapan yang -Dakan memberikan apa pun.
poige

@poige tergantung pada seperti apa data mereka. Jika mereka menghasilkan banyak data yang memiliki blok duplikat, itu adalah kemenangan besar. Saya tidak melihat bagaimana -i akan membuatnya lebih atau kurang mungkin ada duplikat blok. Jika Anda biasanya membuat data yang memiliki banyak duplikasi, Anda mungkin akan membuat banyak duplikasi di dalam setiap hari, jadi -i tidak membantu atau melukai.
James Moore

Nah, jika Anda memiliki banyak duplikat kompresi apa pun akan mengurusnya.
poige

@poige Mereka harus mengukur data aktual mereka. Anda pasti dapat memiliki kumpulan data yang kompres buruk dan dedup dengan sangat baik. Sebagai contoh, banyak salinan dari file video terkompresi yang sama terpotong dengan sangat baik, dan kompresi pada tingkat sistem file mungkin lebih buruk daripada tidak berguna.
James Moore

Ah,
kasing

-1

Algoritma kompresi "terbaik" tergantung pada tipe data apa yang Anda miliki - jika Anda mendorong kompresi koleksi MP3 mungkin akan memperlambat proses, sementara teks / file log dapat dikompresi secara signifikan dengan gzip -9 .

Berapa banyak data yang Anda dorong setiap hari?


-1

Sudahkah Anda mempertimbangkan untuk menyetel tumpukan TCP / IP sehingga Anda menjadi penyangga TCP dan ukuran jendela sedikit lebih besar? Anda dapat menggunakan nddalat di Solaris untuk ini atau sysctlalat di Linux / BSD / Mac OSX. Di Solaris, Anda mencari /dev/tcp tcp_max_bufdan /dev/tcp tcp_cwnd_maxmenghargai, dan di sysctl Linux, Anda mencari net.ipv4.tcp_mem, net.ipv4.tcp_rmemdannet.ipv4.tcp.wmem menghargai.

Juga, tautan ini mungkin bisa membantu tambahan:

Penyesuaian Kinerja TCP Solaris

Ada satu set tautan di bagian bawah halaman itu yang akan menjelaskan bagaimana melakukan hal yang sama untuk Linux / BSD / OSX juga.


1
1. Ini adalah pertanyaan berumur 5 tahun yang sedang Anda gali. 2. Dia tidak mengatakan tautannya kurang dimanfaatkan dan bertanya tentang kompresi, yang tidak Anda rujuk. 3. Sebagian besar OS menyesuaikan ukuran jendela secara otomatis akhir-akhir ini. Info yang Anda tautkan sudah berusia 3 tahun yang lalu ketika penulis mempostingnya.
Chris S
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.