Apakah btrfs juga menyeimbangkan file defrag?

9

Ketika saya menjalankan btrfs filesystem balance, apakah ini defragment file secara implisit? Saya bisa membayangkan keseimbangan yang hanya mengalokasikan ulang setiap file secara terpisah, menjaga fragmentasi yang ada.

Ada entri FAQ, 'Apa yang dilakukan "saldo"? , yang tidak jelas dalam hal ini:

btrfs filesystem balance adalah operasi yang hanya mengambil semua data dan metadata pada sistem file, dan menulis ulang di tempat yang berbeda pada disk, meneruskannya melalui algoritma pengalokasi di jalan. Awalnya dirancang untuk sistem file multi-perangkat, untuk menyebarkan data lebih merata di seluruh perangkat (yaitu untuk "menyeimbangkan" penggunaannya). Ini sangat berguna ketika menambahkan perangkat baru ke sistem file yang hampir penuh.

Karena cara keseimbangan bekerja, ia juga memiliki beberapa efek samping yang berguna:

  • Jika ada banyak data yang dialokasikan tetapi tidak terpakai atau potongan metadata, keseimbangan dapat mengambil kembali sebagian dari ruang yang dialokasikan. Ini adalah alasan utama untuk menjalankan keseimbangan pada sistem file satu perangkat.
  • Pada sistem file dengan replikasi yang rusak (mis. RAID-1 FS dengan disk mati dan dihapus), itu akan memaksa FS untuk membangun kembali salinan data yang hilang pada salah satu perangkat yang saat ini aktif, memulihkan kemampuan RAID-1 dari berkas sistem.
pauldoo
sumber

Jawaban:

9

TL; DR

Fitur defrag Btrfs khusus untuk memperbaiki fragmentasi dalam metadata folder dan konten file, sementara fitur keseimbangan dibuat untuk " menyeimbangkan " (karenanya namanya) jumlah data yang dibagikan antara drive setiap kali drive ditambahkan atau dihapus. Meskipun mereka memiliki beberapa tumpang tindih teoritis dalam apa yang mereka lakukan, mereka tidak terkait langsung, sehingga dokumentasi tidak menghubungkan kedua fitur tersebut.

Verbose jawaban di bawah ini. Perhatikan tentu saja bahwa jawaban panjang saya adalah dengan harapan akan membantu orang lain yang tidak memiliki konteks penuh masalah yang dihadapi.


Alokasi Potongan

Konsep penting dengan btrfs adalah alokasi chunk. Ketika Anda menulis data ke btrfs, ia menulis data itu menjadi potongan "saat ini", biasanya berukuran 1GB dalam ukuran 1 . Jika potongan "saat ini" menjadi penuh, itu akan mengalokasikan potongan baru. Jika potongan yang ada dikosongkan, ruang penyimpanannya tersedia untuk dialokasikan kembali ketika potongan baru diperlukan.

Jika filesystem menggunakan lebih dari satu drive dengan profil penyimpanan "dup", "single", atau "raid1" , pengalokasi chunk selalu lebih suka menempatkan chunk baru berikutnya pada drive dengan ruang paling kosong yang tersedia. Ini memastikan, secara umum, bahwa drive digunakan sama.


Bagaimana Saldo Melakukan Masalahnya

Fitur keseimbangan bekerja dengan mengambil potongan data yang ada dan menuliskannya kembali ke dalam potongan "saat ini". Ketika potongan yang ada dikosongkan dengan cara ini, maka secara otomatis disediakan untuk pengalokasi. Jika potongan yang ada dikosongkan tidak penuh untuk memulai dengan (mungkin data lama dalam potongan dihapus), hasil bersihnya adalah membebaskan ruang disk karena potongan yang lebih baru "lebih padat" dengan data yang relevan.

Ini adalah bagian yang bisa, secara teori, digunakan sebagai bagian dari strategi de-fragmentasi , yang saya rasa adalah alasan mengapa banyak orang menganggapnya sudah. Namun, tentu saja, fitur keseimbangan dibangun dengan tujuan tertentu, jadi mengapa tidak melihat konten file. Ini hanya memeriksa apakah data yang diambil dari potongan yang ada relevan 2 sebelum menyalin data itu ke potongan baru.

Di mana bagian Saldo masuk?

Ketika Anda menambahkan drive baru ke sistem file, pengalokasi awalnya akan cenderung menulis semua data baru ke drive baru, terutama karena memiliki lebih banyak ruang kosong yang tersedia daripada drive yang ada. Dengan menulis ulang semua chunks, semua chunks yang awalnya seimbang hanya ditulis ke drive baru. Setelah disamakan (menjadi seimbang), sisa data akan dialokasikan ulang secara merata di antara drive.

Skenario Saldo Umum:

Saya memiliki drive 2x 500GB dengan 240GB digunakan pada masing-masing; Saya menambahkan drive 500GB lain. Saya biasanya memiliki:

  • drive a: 240GB digunakan
  • drive b: 240GB digunakan
  • drive c: 0GB digunakan

Saya mulai menyeimbangkan semua data. Sekitar seperempat melalui saldo, saya cenderung melihat situasi yang mirip dengan yang berikut:

  • drive a: 180GB digunakan
  • drive b: 180GB digunakan
  • drive c: 120GB digunakan

Pada sekitar sepertiga tanda, tampaknya menjadi seimbang:

  • drive a: 160GB digunakan
  • drive b: 160GB digunakan
  • drive c: 160GB digunakan

Anda tentu saja dapat menghentikan operasi keseimbangan pada titik ini, meskipun ada alasan (baik dan buruk) mengapa Anda ingin membiarkannya selesai 3 .


Bagaimana Fragmentasi Terjadi pada btrfs

Btrfs adalah sistem file CoW ( Copy on Write ), yang berarti bahwa data tidak pernah ditulis berlebihan 4 . Jika Anda memiliki file 100MB yang ada dan menulis lebih dari 1MB sebagian file, porsi 1MB itu tidak dituliskan di atas data yang ada di drive. Sebaliknya itu ditulis di tempat lain dalam potongan "saat ini". Btrf melacak di mana "fragmen" data baru ini disimpan. Ini paling berguna untuk menjaga snapshot data karena itu berarti data lama dipertahankan secara default. Karena SSD, dengan cara yang sangat mirip, juga tidak pernah menimpa data, mekanisme Kontrak Karya ini cocok untuk memungkinkan SSD mempertahankan umur dan kinerjanya.

Di mana Defrag Datang

Terlepas dari kelebihannya, beberapa file sering ditulis berlebihan (biasanya file basis data), sehingga akhirnya memiliki ratusan fragmen ini. Dengan SSD, ada sedikit penalti kinerja dalam jangka pendek. Tetapi dengan spindle drive, penalti kinerja sangat berat.

Salah satu solusinya tentu saja adalah dengan menggunakan fitur defrag btrfs. Operasi defrag menulis ulang konten file dalam potongan saat ini dalam urutan logis dari kondisi saat ini, sehingga mengurangi fragmen menjadi satu set data besar 100MB, bukan banyak potongan terpisah.

Solusi alternatif adalah dengan menggunakan fitur "nocow" khusus untuk file seperti ini. Fitur nocow menyebabkan file ditimpa di tempat. Waspadalah bahwa ada peringatan untuk nocow 5 6 .


Ringkasan Lagi

  • Saldo melihat potongan dan garis - dan sebenarnya tidak mengetahui konten file kecuali apakah data dalam potongan tersebut masih relevan.

  • Operasi defrag melihat data folder dan konten file individual dan menulis ulang data dengan cara yang berdekatan. Sisi buruknya adalah dengan snapshot di mana defrag menyebabkan duplikasi dan penggunaan drive ekstra.


Catatan:

  1. Meskipun potongan biasanya berukuran 1GB, mereka bisa lebih besar atau lebih kecil. Saat menggunakan tipe raid, potongan biasanya dilewati beberapa drive dalam kelipatan 1GB. Misalnya, 5 drive dengan raid0 biasanya menghasilkan strip 5GB yang terdiri dari potongan 1GB yang ditulis untuk setiap drive.

  2. Btrfs menggunakan "referensi" ke file konten. Ketika bagian dari file ditimpa, sistem file langsung "referensi" lokasi di mana data itu ditulis. Namun snapshot mungkin masih "merujuk" lokasi lama. Jika tidak ada snapshot - atau snapshot lama dihapus, ini tidak menghasilkan sisa "referensi" yang merujuk pada konten asli yang ditimpa. Konten ini kemudian dianggap tidak relevan dan tidak akan disalin dengan data relevan lainnya dalam operasi keseimbangan.

  3. Pada titik ini, dengan asumsi penyimpanan menggunakan profil "tunggal" 7 yang sederhana , keseimbangan 160GB pertama semuanya akan dipindahkan ke drive baru - tetapi juga pada saat ini, masih memiliki sekitar 320GB yang tersisa untuk diseimbangkan. Sisanya akan seimbang di seluruh drive. Dengan spindle, idealnya Anda ingin menyeimbangkan hanya 160 chunks sebelum meminta btrf menyeimbangkan kembali ketiga drive untuk "penyebaran" data yang lebih baik. Dengan SSD, upaya mempertahankan "penyebaran" data yang merata menjadi sangat rumit, mungkin tidak ada gunanya, dan jauh lebih mungkin sangat buruk untuk masa pakai SSD.

  4. Pengecualian adalah fitur "nocow".

  5. Jika ada snapshots, defragmenting file "live" menyebabkan snapshots dan "live" file merujuk ke lokasi data yang berbeda pada disk, menyebabkan data diduplikasi dan dengan demikian mengambil ruang disk tambahan. Ketika fitur de-duplikasi tujuan umum tersedia, ini tidak akan menjadi masalah.

  6. Menggunakan nocow berarti btrfs tidak memelihara checksum untuk konten file.

  7. Dengan sebagian besar tipe raid (pengecualian raid1), "sebaran" di seluruh drive dapat diperdebatkan karena garis-garis tersebut biasanya ditulis di semua drive.

zTricky
sumber
Wow, jawaban yang bagus. Saya melihat ada kekurangan serius dari informasi yang relevan pengguna BTRFS, dalam buku-buku atau sejenisnya (agak tidak seperti ZFS) yang tampaknya berkontribusi untuk itu melanjutkan reputasi buruk. Apakah Anda punya blog atau lebih banyak barang bagus seperti ini?
Andrew Keech
1
Terima kasih! Saya benar-benar harus membawa beberapa konten yang lebih baru di sana. : - | Waktu sangat kurang: dogma.swiftspirit.co.za
zaTricky
6

Mungkin melihat kode sumber dari perintah itu mungkin bisa membantu

Lebih suka btrfs balance start

Perintah 'btrfs filesystem balance' sudah tidak digunakan lagi, silakan gunakan perintah 'btrfs balance start'.

Dan kemudian pada string perintah

"btrfs [filesystem] balance start [options] <path>",
"Balance chunks across the devices",
"Balance and/or convert (change allocation profile of) chunks that",
"passed all filters in a comma-separated list of filters for a",
"particular chunk type.  If filter list is not given balance all",
"chunks of that type.  In case none of the -d, -m or -s options is",
"given balance all chunks in a filesystem."

Saya mungkin memberikan pandangan kedua tetapi saya tidak bisa melihat referensi apa pun untuk defrag pada struct atau panggilan ioctl (). Jadi tidak ada defrag eksplisit.

Yang dilakukan adalah menyalin dari satu tempat ke tempat lain dan menggunakan pengalokasi default dalam proses. Diambil dari sini

Bergantung pada alokasi tujuan dan pada mode alokasi, algoritma dapat secara langsung mencari freespace terus menerus di setiap grup alokasi yang sesuai (grup dalam btrfs sesuai dengan chunk yang dijelaskan di atas

Jadi tergantung pada mode alokasi, ruang kosong pada perangkat, dan sebagainya Anda dapat mengatakan bahwa btrf akan mengalokasikan sedemikian rupa sehingga defragmenting tidak diperlukan. Yang mungkin Anda anggap sebagai bentuk defragmentasi implisit.

HTH

pengguna
sumber
3

Balance bekerja pada level chunk; potongan adalah bagaimana Btrf mengimplementasikan redundansi raid. Itu tidak melakukan apa pun di tingkat Btree dan tidak defragment.

Gabriel
sumber
0

Jika Anda menggunakan media dengan latensi akses tinggi, framenasi selalu diperhitungkan, terlepas dari sistem file yang digunakan. Mencari tetap mencari, pediod.

pengguna203842
sumber
3
Kecuali jika Anda mengakses data dari drive SSD maka itu tidak ada artinya sama sekali.
Matt
1
Itu tidak menjawab pertanyaan.
Karl Richter
-2

Defragmentasi berlebihan. Tentu, pada FAT16, itu membuat perbedaan nyata, tetapi tidak pada apa pun yang modern, dalam banyak kasus. Secara efektif, penyeimbangan kembali akan meningkatkan organisasi sistem file Anda, dan file akan kurang terfragmentasi.

Ronald Pottol
sumber
6
Fragmentasi sebenarnya bukan masalah bagi ext2 / 3/4, xfs, jfs, dll., Tetapi bisa menjadi masalah yang signifikan untuk btrfs. Lihat btrfs.wiki.kernel.org/index.php/Gotchas yang mengatakan "File dengan banyak penulisan acak dapat menjadi sangat terfragmentasi (10.000+ luasan) yang menyebabkan trash pada HDD dan lonjakan multi-detik yang berlebihan dari beban CPU pada sistem dengan sistem SSD atau RAM dalam jumlah besar. " Itu tidak berlebihan, bahkan untuk kasus penggunaan umum (file diunduh dengan bittorrent, database sqlite, dll.).
nemequ
2
Defragmentasi dapat membuat perbedaan besar bahkan dengan sistem file yang lebih modern terutama setelah drive mulai penuh pada HDD konvensional. Beberapa sistem file menanganinya lebih baik daripada yang lain dan beberapa jenis file lebih buruk daripada yang lain. Ruang kendur, skenario yang tidak mungkin dioptimalkan, cache baca / tulis, readahead, optimisasi aplikasi, dan sebagainya cenderung menyembunyikan banyak hal ini. Sebagian besar orang tidak perlu khawatir tentang hal itu dan hanya khawatir jika mereka benar-benar memiliki masalah serius yang mungkin disebabkan oleh fragmentasi.
jgmjgm