Apakah file disimpan di disk secara berurutan?

22

Seperti yang saya mengerti, "file jarang" berarti bahwa file tersebut mungkin memiliki 'kesenjangan' sehingga data yang digunakan sebenarnya mungkin lebih kecil dari ukuran file logis.

Bagaimana sistem file Linux menyimpan file pada disk? Saya terutama tertarik pada ext4. Tapi:

  1. Bisakah file disimpan tidak secara berurutan pada disk? Maksud saya, bagian dari file tersebut terletak di alamat fisik X dan bagian berikutnya di alamat fisik Y yang tidak dekat dengan X + offset).
  2. Bisakah saya entah bagaimana mengontrol urutan file?
    Saya ingin mengalokasikan file 10GB. Saya ingin berurutan pada disk dan tidak terbagi antara offset yang berbeda.
  3. Apakah itu bertindak secara berbeda antara berbagai jenis?
hudac
sumber
Anda mungkin ingin membaca ext4.wiki.kernel.org/index.php/Main_Page
roaima
1
Mungkin, jika saya memahami maksud Anda dengan benar, Anda akan lebih tertarik pada API tingkat rendah, di mana Anda bekerja dengan perangkat penyimpanan tanpa harus melalui lapisan sistem file. Titik masuk Anda kemudian bisa berupa dmsetupprogram, antarmuka ke perangkat mapper. Ini mungkin merupakan pilihan yang baik jika Anda merencanakan penyimpanan seperti basis data.
wvxvw
4
Ini adalah detail implementasi sistem file. Hampir semua sistem file melakukan fragmen file secara default; hanya iso9660dan romfstidak mampu melakukan itu dan memerlukan penyimpanan terus menerus (dari ini saya bisa daftar off-head).
mirabilos
2
apakah file tersebut bersebelahan pada disk atau tidak, data baca / tulis akan selalu bersebelahan kecuali jika Anda mencari bagian lain dari file tersebut. Jadi mengapa Anda peduli tentang ini? Kecuali jika fragmentasi adalah masalah serius yang memengaruhi kinerja
phuclv
3
@Hudac satu hal yang perlu diingat adalah bahwa bersebelahan tidak terlalu berguna dalam praktek. Yang mudah adalah flash di mana fragmentasi bukan masalah besar, tetapi pada piring berputar Anda masih mungkin tidak mendapat manfaat dari data yang berdekatan. Pada piring berputar Anda perlu memikirkan pola akses Anda dan di mana data berada. Jika Anda membutuhkan sektor yang baru saja lewat di bawah kepala Anda harus menunggu untuk datang sepenuhnya lagi. Untuk mendapatkan hasil terbaik, Anda ingin membuat data terhuyung-huyung sehingga "menutup" saat harus dibaca. Meningkatkan ukuran cache lebih mudah ;-)
Ukko

Jawaban:

41

Bisakah file disimpan tidak secara berurutan pada disk? Maksud saya, bagian dari file terletak di bawah alamat fisik X dan bagian lainnya di bawah alamat fisik Y yang tidak dekat dengan X + offset).

Iya nih; ini dikenal sebagai fragmentasi file dan tidak jarang, terutama dengan file yang lebih besar. Sebagian besar sistem file mengalokasikan ruang sesuai kebutuhan, lebih atau kurang secara berurutan, tetapi mereka tidak dapat menebak perilaku di masa mendatang - jadi jika Anda menulis 200MiB ke file, kemudian menambahkan 100MiB lebih lanjut, ada peluang bukan-nol bahwa kedua set data akan disimpan di area disk yang berbeda (pada dasarnya, penulisan lain yang membutuhkan lebih banyak ruang pada disk, yang terjadi setelah penulisan pertama dan sebelum yang kedua, dapat dilakukan di antara keduanya). Jika sistem file hampir penuh, situasinya biasanya akan menjadi lebih buruk: mungkin tidak ada area bersebelahan dari ruang kosong yang cukup besar untuk menampung file baru, sehingga harus dipecah-pecah.

Dapatkah saya entah bagaimana mengontrol urutan file? Saya ingin mengalokasikan file besar 10GB. Saya ingin berurutan dalam disk dan tidak dibagi di antara berbagai offset.

Anda bisa memberi tahu filesystem tentang ukuran target file Anda ketika itu dibuat; ini akan membantu sistem file menyimpannya secara optimal. Banyak sistem file modern menggunakan teknik yang dikenal sebagai alokasi tertunda, di mana tata letak pada-disk dari file baru dihitung selambat mungkin, untuk memaksimalkan informasi yang tersedia ketika perhitungan dilakukan. Anda dapat membantu proses ini dengan menggunakan posix_fallocate(3)fungsi untuk memberi tahu sistem file berapa banyak ruang disk yang harus dialokasikan secara total. Sistem file modern akan mencoba melakukan alokasi ini secara berurutan.

Apakah itu bertindak secara berbeda antara berbagai jenis?

Sistem file yang berbeda berperilaku berbeda, ya. Filesystem berbasis log seperti NILFS2 tidak mengalokasikan penyimpanan dengan cara yang sama seperti filesystem berbasis luas seperti Ext4, dan itu hanya satu contoh variasi.

Stephen Kitt
sumber
1
Apakah menggunakan fallocate(3)sekuensialitas file terjamin? atau hanya akan mengisyaratkan sistem file? Saya tidak bisa sepenuhnya memahaminya dari halaman manual.
hudac
6
Itu tidak dapat memastikan alokasi berurutan, itu hanya sebuah petunjuk. Tetapi Anda harus menggunakannya jika Anda menulis file 10GiB!
Stephen Kitt
6
Pada dasarnya semua sistem file lebih canggih daripada FAT - ini kembali ke Berkeley UFS yang asli - dengan sengaja akan memecah file besar dan menyebarkannya ke beberapa "grup alokasi"; ini membantu mereka meminimalkan fragmentasi keseluruhan disk. Ada mungkin menjadi cara untuk menyesuaikan cara kerja ini, tapi ada peluang baik Anda harus menciptakan filesystem dari awal untuk melakukannya, dan mungkin tidak ada cara untuk mengubahnya benar-benar off.
zwol
2
@hudac Tidak mungkin untuk menjamin berurutan dalam semua kasus (lihat kasus dengan drive yang hampir penuh), dan jujur ​​dengan munculnya SSD itu lebih penting daripada dulu (bagi mereka yang mampu membelinya setidaknya ).
Muzer
1
Juga perhatikan bahwa ada situasi, seperti sistem RAID, di mana memiliki file yang berdekatan kurang efisien, jika itu mungkin. Saya pikir itu benar-benar tujuan dari pengontrol subsistem disk / penyimpanan: untuk membongkar semua pekerjaan menyimpan file seoptimal mungkin yang diharapkan.
jamesqf
17

Perintah ini filefragakan memberi tahu Anda bagaimana file Anda secara fisik disimpan di perangkat Anda:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

Jika Anda menulis file Anda dalam satu pass, tebakan saya adalah file Anda tidak akan terfragmentasi.

Halaman manual dari fallocate (1) cukup jelas:

fallocate digunakan untuk mengalokasikan blok ke file. Untuk sistem file yang mendukungfallocate pemanggilan sistem, ini dilakukan dengan cepat dengan mengalokasikan blok dan menandainya sebagai tidak diinisialisasi, tidak memerlukan IO ke blok data. Ini jauh lebih cepat daripada membuat file dengan mengisinya dengan nol.

Pada Linux Kernel v2.6.31, itu fallocate panggilan sistem didukung oleh sistem file btrfs, ext4, ocfs2, dan xfs.

Apakah ini berurutan? Sistem pertama-tama akan mencoba mengalokasikan blok secara berurutan. Jika tidak bisa, itu tidak akan memperingatkan Anda.

Vouze
sumber
Apa itu tipe 'ef53'. Saya melihatnya juga di file saya. Tapi tipe FS saya adalah ext4.
hudac
2
EF53 adalah nomor "SUPER_MAGIC" dari ext2, ext3 dan ext4. Lihat di "include / uapi / linux / magic.h" di sumber kernel untuk semua angka ajaib dari setiap sistem file.
Vouze
Di Debian, filefragdisembunyikan di /usr/sbin. Tetapi tampaknya berfungsi untuk pengguna biasa (pada ext4, setidaknya). Mungkin bermanfaat bagi straceoperasinya untuk melihat bagaimana mengukur fragmentasi untuk diri Anda sendiri, jika kurangnya peringatan merupakan penghalang bagi Anda.
Toby Speight
6

Anda menyebutkan file jarang, dan tidak ada jawaban lain yang menyebutkannya.

Sebagian besar file tidak jarang. Cara paling umum untuk membuat file adalah menulis semuanya dalam sekali jalan, dari awal hingga akhir. Tidak ada lubang di sana.

Namun, Anda diizinkan untuk mengatakan "pindah ke posisi 1.000.000.000.000 dan tulis satu byte di sana." Ini akan membuat file yang terlihat seperti etabyte besar, tetapi sebenarnya hanya menggunakan (mungkin) 4k pada disk. Ini adalah file yang jarang.

Anda dapat melakukan ini berkali-kali untuk file yang sama, meninggalkan sejumlah kecil data yang tersebar di kehampaan yang luas.

Meskipun ini bisa bermanfaat, ada dua kelemahan.

Yang pertama adalah bahwa file tersebut akan terfragmentasi, yang Anda khawatirkan.

Yang kedua adalah tidak semua program menangani file-file ini dengan baik. Misalnya beberapa perangkat lunak cadangan akan mencoba untuk membuat cadangan kekosongan dan dengan demikian membuat cadangan yang jauh lebih besar dari yang diperlukan, mungkin terlalu besar untuk media cadangan.

Stig Hemmer
sumber
Tetapi bahkan file non-jarang akan sering tidak berdekatan pada disk.
Barmar
2

Bisakah saya entah bagaimana mengontrol urutan file? Saya ingin mengalokasikan file 10GB. Saya ingin berurutan pada disk dan tidak terbagi antara offset yang berbeda.

Setidaknya ada beberapa cara untuk mencapai ini.

  1. Gunakan sistem file dengan banyak ruang kosong dan pralokasi ruang (mis. Gunakan penanda akhir data khusus aplikasi dan tambahkan data acak hingga ukuran file mencapai 10GB). Ini tidak dijamin untuk menghasilkan data yang tidak terfragmentasi.

  2. Gunakan filesystem mentah (tidak dimasak) daripada ext4 dll. DBMSs kadang-kadang melakukan ini untuk alasan kinerja. Imbalannya adalah Anda harus melakukan caching / penjurnalan / pemulihan, dll, jika perlu.

Contoh di mana Anda mendapatkan banyak dari melakukan ini relatif jarang - saya pertama kali mencari di tempat lain untuk mengoptimalkan kinerja.


Lihat juga

Benarkah sistem manajemen basis data biasanya memotong sistem file?

RedGrittyBrick
sumber
-1

Jika ini hanya satu kali dan tidak penting bagaimana file disimpan awalnya, hanya hasilnya penting, maka Anda bisa menyimpan file secara normal dan kemudian menjalankan defragmenter dari sistem operasi Anda. Kemudian Anda dapat memeriksa dengan jawaban ini jika file Anda utuh, jika tidak, ulangi. Ini adalah cara termudah untuk melakukannya, tanpa menggunakan perintah atau program eksternal, tetapi ini jelas bukan metode tercepat, karena akan mendefrag seluruh disk Anda.

Fabian Röling
sumber
1
"Jalankan defragmenter"? Apakah ada program seperti itu? Satu-satunya hal yang ditemukan ketika saya mencari aptitude search ~ddefragadalah ddrescueviewdan nidssegmen TCP menyusun kembali perpustakaan. Jawaban Anda tidak terlalu membantu jika Anda tidak mengatakan program apa yang dipanggil, atau argumen apa yang perlu disampaikan.
Toby Speight
1
@TobySpeight - ya ada defragmenter; e4defrag.
Ravery