Bagikan melalui


Mendefragmentasi File

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

Defragmentasi adalah proses pemindahan bagian-bagian file pada disk agar file-file tersebut menjadi terfragmentasi ulang dan menyatu, yaitu, proses pemindahan kluster file pada disk untuk menjadikannya 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 adalah mendefrragmentasi hard disk drive tersebut. Caranya adalah menghindari penulisan ke file yang sedang didefragmentasi tanpa menghentikan proses penulisan untuk waktu yang lama. Memecahkan masalah ini tidak sepele, tetapi itu mungkin.

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

  • Mengaktifkan aplikasi untuk menemukan kluster kosong
  • Menentukan lokasi kluster file pada disk
  • 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 keluasan pertama file supaya Anda dapat memindahkan keluasan berikutnya ke ruang setelah keluasan pertama.

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

  2. Telusuri struktur RETRIEVAL_POINTERS_BUFFER yang dikembalikan oleh FSCTL_GET_RETRIEVAL_POINTERS.

  3. Gunakan kode kontrol FSCTL_MOVE_FILE untuk memindahkan setiap kluster saat Anda berjalan di 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 handle ke volume. Hanya administrator yang dapat memperoleh pegangan 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 hal itu dilakukan.

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

Penguraian ulang titik, bitmap, dan daftar atribut dalam volume sistem file NTFS dapat didefragmentasi, dibuka untuk pembacaan dan sinkronisasi, dan diberi nama menggunakan sintaks file:name:type ; misalnya, dirname:$i 30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT, dan mrp::$ATTRIBUTE_LIST.

Saat mendefragmentasi 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 sejajar satu sama lain dengan kelipatan 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 16 KB.
  • Delta perubahan tidak dalam kelipatan 16 KB.

Delta pemindahan adalah jumlah byte antara awal blok sumber dan awal blok target. Dengan kata lain, blok yang dimulai dari offset X (pada disk) dapat dipindahkan ke offset awal Y jika nilai absolut dari X minus Y merupakan kelipatan genap 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 Volume Shadow Copy Service.

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:$I30:$INDEX_ALLOCATION
  • $Extend::$ATTRIBUTE_LIST
  • $Extend:$I30:$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:$I30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata:$I30:$BITMAP
  • $Extend\$RmMetadata::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair::$DATA
  • $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair:$Config:$DATA
  • $Extend\$RmMetadata\$Txf:$I30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Txf:$I30:$BITMAP
  • $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
  • $Extend\$RmMetadata\$TxfLog:$I30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog:$I30:$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