Defragmentasi File

Ketika file ditulis ke disk, kadang-kadang file tidak dapat ditulis dalam kluster yang berdingin. Kluster yang tidak berdamai memperlambat proses membaca dan menulis file. Semakin jauh terpisah pada disk, kluster yang tidak berdekatan adalah, semakin buruk masalahnya, karena waktu yang diperlukan untuk memindahkan kepala baca/tulis hard disk drive. File dengan kluster yang tidak berdamai terfragmentasi. Untuk mengoptimalkan file untuk akses cepat, volume dapat didefragmentasi.

Defragmentasi adalah proses memindahkan bagian file pada disk ke file defragmentasi, yaitu, proses pemindahan kluster file pada disk untuk membuatnya bersebelahan. Untuk informasi selengkapnya, lihat bagian berikut ini:

Mendefragmentasi file

Dalam sistem operasi tugas tunggal sederhana, perangkat lunak defragmentasi adalah satu-satunya tugas, dan tidak ada proses lain untuk membaca dari atau menulis ke disk. Namun, dalam sistem operasi multitugas, beberapa proses dapat membaca dari dan menulis ke hard disk drive sementara proses lain mendefinisikan hard disk drive tersebut. Caranya adalah menghindari penulisan ke file yang sedang didefragmentasi tanpa menghentikan proses penulisan sangat lama. Memecahkan masalah ini tidak sepele, tetapi itu mungkin.

Untuk memungkinkan defragmentasi tanpa memerlukan pengetahuan terperinci tentang struktur disk sistem file, sekumpulan tiga kode kontrol disediakan. Kode kontrol menyediakan fungsionalitas berikut:

  • Mengaktifkan aplikasi untuk menemukan kluster kosong
  • Menentukan lokasi disk kluster file
  • Memindahkan kluster pada disk

Kode kontrol juga secara transparan menangani masalah penghambatan dan memungkinkan proses lain membaca dari dan menulis ke file selama pemindahan.

Operasi ini dapat dilakukan tanpa menghambat proses lain agar tidak berjalan. Namun, proses lain memiliki waktu respons yang lebih lambat saat drive disk sedang didefragmentasi.

Untuk mendefragmentasi file

  1. Gunakan kode kontrol FSCTL_GET_VOLUME_BITMAP untuk menemukan tempat pada volume yang cukup besar untuk menerima seluruh file.

    Catatan

    Jika perlu, pindahkan file lain untuk membuat tempat yang cukup besar. Idealnya, ada cukup kluster yang tidak dialokasikan setelah jangkauan pertama file yang dapat Anda pindahkan jangkauan berikutnya ke ruang setelah jangkauan pertama.

     

  2. Gunakan kode kontrol FSCTL_GET_RETRIEVAL_POINTERS untuk mendapatkan peta tata letak file saat ini pada disk.

  3. Jalankan struktur RETRIEVAL_POINTERS_BUFFER yang dikembalikan oleh FSCTL_GET_RETRIEVAL_POINTERS.

  4. Gunakan kode kontrol FSCTL_MOVE_FILE untuk memindahkan setiap kluster saat Anda menjalankan struktur.

    Catatan

    Anda mungkin perlu memperbarui bitmap atau struktur pengambilan, atau keduanya pada berbagai waktu saat proses lain menulis ke disk.

     

Dua operasi yang digunakan dalam proses defragmentasi memerlukan handel ke volume. Hanya administrator yang dapat memperoleh handel ke volume, sehingga hanya administrator yang dapat mendefragmentasi volume. Aplikasi harus memeriksa hak pengguna yang mencoba menjalankan perangkat lunak defragmentasi, dan tidak boleh mengizinkan pengguna untuk men-defragmentasi volume jika pengguna tidak memiliki hak yang sesuai.

Saat menggunakan CreateFile untuk membuka direktori selama defragmentasi volume sistem file FAT atau FAT32, tentukan nilai masker akses GENERIC_READ . Jangan tentukan nilai masker akses MAXIMUM_ALLOWED . Akses ke direktori ditolak jika itu dilakukan.

Jangan mencoba memindahkan kluster yang dialokasikan dalam sistem file NTFS yang melampaui ukuran file yang dibulatkan kluster, karena hasilnya adalah kesalahan.

Mengurai ulang titik, bitmap, dan daftar atribut dalam volume sistem file NTFS dapat didefragmentasi, dibuka untuk membaca dan menyinkronkan, dan dinamai menggunakan sintaks file:name:type ; misalnya, dirname:$i 30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT, dan mrp::$ATTRIBUTE_LIST.

Saat mendefinisikan volume sistem file NTFS, defragmentasi kluster virtual di luar ukuran alokasi file diizinkan.

Meminimalkan interaksi antara defragmentasi dan salinan bayangan

Jika memungkinkan, pindahkan data dalam blok yang selaras relatif satu sama lain dalam kenaikan 16 kilobyte (KB). Ini mengurangi overhead copy-on-write ketika salinan bayangan diaktifkan, karena ruang salinan bayangan ditingkatkan dan performa berkurang ketika kondisi berikut terjadi:

  • Ukuran blok permintaan pemindahan kurang dari atau sama dengan 16 KB.
  • Delta pemindahan tidak dalam kenaikan 16 KB.

Delta pemindahan adalah jumlah byte antara awal blok sumber dan awal blok target. Dengan kata lain, blok yang dimulai dari offset X (on-disk) dapat dipindahkan ke offset awal Y jika nilai absolut X minus Y bahkan kelipatan 16 KB. Jadi, dengan asumsi kluster 4 KB, perpindahan dari kluster 3 ke kluster 27 akan dioptimalkan, tetapi perpindahan dari kluster 18 ke kluster 24 tidak akan. Perhatikan bahwa mod(3,4) = 3 = mod(27,4). Mod 4 dipilih karena empat kluster pada 4 KB masing-masing setara dengan 16 KB. Oleh karena itu, volume yang diformat ke ukuran kluster 16 KB akan mengakibatkan semua file pemindahan dioptimalkan.

Untuk informasi selengkapnya tentang salinan bayangan, lihat Layanan Menyalin Bayangan Volume.

File, aliran, dan jenis aliran yang didukung untuk defragmentasi

Meskipun sebagian besar file dapat dipindahkan menggunakan kode kontrol FSCTL_MOVE_FILE , tidak semua dapat dipindahkan. Di bawah ini adalah daftar file, aliran, dan jenis aliran (juga disebut kode jenis atribut) yang didukung oleh FSCTL_MOVE_FILE. File, aliran, dan jenis aliran lainnya tidak didukung oleh FSCTL_MOVE_FILE.

Jenis aliran yang didukung untuk file atau direktori apa pun.

  • ::$DATA
  • ::$ATTRIBUTE_LIST
  • ::$REPARSE_POINT
  • ::$EA
  • ::$LOGGED_UTILITY_STREAM

**Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 dan Windows XP: **::$EA dan ::$LOGGED_UTILITY_STREAM tidak didukung sebelum Windows 8 dan Windows Server 2012

Jenis aliran yang didukung untuk direktori apa pun.

  • ::$BITMAP
  • ::$INDEX_ALLOCATION

Berikut ini adalah jenis file sistem, aliran, dan aliran yang didukung oleh FSCTL_MOVE_FILE dalam format "filename:streamname:$typename".

  • $MFT::$DATA
  • $MFT::$ATTRIBUTE_LIST
  • $MFT::$BITMAP
  • $AttrDef::$DATA
  • $AttrDef::$ATTRIBUTE_LIST
  • $Secure:$SDS:$DATA
  • $Secure::$ATTRIBUTE_LIST
  • $Secure:$SDH:$INDEX_ALLOCATION
  • $Secure:$SDH:$BITMAP
  • $Secure:$SII:$INDEX_ALLOCATION
  • $Secure:$SII:$BITMAP
  • $UpCase::$DATA
  • $UpCase::$ATTRIBUTE_LIST
  • $Extend:$I 30:$INDEX_ALLOCATION
  • $Extend::$ATTRIBUTE_LIST
  • $Extend:$I 30:$BITMAP
  • $Extend\$UsnJrnl:$J:$DATA
  • $Extend\$UsnJrnl::$ATTRIBUTE_LIST
  • $Extend\$UsnJrnl:$Max:$DATA
  • $Extend\$Quota:$Q:$INDEX_ALLOCATION
  • $Extend\$Quota::$ATTRIBUTE_LIST
  • $Extend\$Quota:$Q:$BITMAP
  • $Extend\$Quota:$O:$INDEX_ALLOCATION
  • $Extend\$Quota:$O:$BITMAP
  • $Extend\$ObjId:$O:$INDEX_ALLOCATION
  • $Extend\$ObjId::$ATTRIBUTE_LIST
  • $Extend\$ObjId:$O:$BITMAP
  • $Extend\$Reparse:$R:$INDEX_ALLOCATION
  • $Extend\$Reparse::$ATTRIBUTE_LIST
  • $Extend\$Reparse:$R:$BITMAP
  • $Extend\$RmMetadata:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata:$I 30:$BITMAP
  • $Extend\$RmMetadata::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair::$DATA
  • $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair:$Config:$DATA
  • $Extend\$RmMetadata\$Txf:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Txf:$I 30:$BITMAP
  • $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
  • $Extend\$RmMetadata\$TxfLog:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog:$I 30:$BITMAP
  • $Extend\$RmMetadata\$TxfLog\$Tops::$DATA
  • $Extend\$RmMetadata\$TxfLog\$Tops::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog\$Tops:$T:$DATA
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$DATA
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$ATTRIBUTE_LIST