Desfragmentación de archivos

Cuando se escribe un archivo en un disco, a veces el archivo no se puede escribir en clústeres contiguos. Los clústeres no contiguos ralentizan el proceso de lectura y escritura de un archivo. Cuanto más aparte en un disco, los clústeres no contiguos son, peor es el problema, debido al tiempo que se tarda en mover el encabezado de lectura y escritura de una unidad de disco duro. Un archivo con clústeres no contiguos está fragmentado. Para optimizar los archivos para el acceso rápido, se puede desfragmentar un volumen.

La desfragmentación es el proceso de mover partes de archivos alrededor de un disco a archivos de desfragmentación, es decir, el proceso de mover clústeres de archivos en un disco para que sean contiguos. Para obtener más información, consulte las secciones siguientes:

Desfragmentación de un archivo

En un sistema operativo simple de tareas únicas, el software de desfragmentación es la única tarea y no hay ningún otro proceso para leer o escribir en el disco. Sin embargo, en un sistema operativo multitarea, algunos procesos pueden leer y escribir en una unidad de disco duro, mientras que otro proceso está desfragmentando esa unidad de disco duro. El truco es evitar escrituras en un archivo que se desfragmenta sin detener el proceso de escritura durante mucho tiempo. Resolver este problema no es trivial, pero es posible.

Para permitir la desfragmentación sin necesidad de conocimientos detallados de una estructura de disco del sistema de archivos, se proporciona un conjunto de tres códigos de control. Los códigos de control proporcionan la siguiente funcionalidad:

  • Habilitación de aplicaciones para buscar clústeres vacíos
  • Determinación de la ubicación del disco de los clústeres de archivos
  • Traslado de clústeres en un disco

Los códigos de control también controlan de forma transparente el problema de impedir y permitir que otros procesos lean y escriban en archivos durante los movimientos.

Estas operaciones se pueden realizar sin impedir que otros procesos se ejecuten. Sin embargo, los demás procesos tienen tiempos de respuesta más lentos mientras se desfragmenta una unidad de disco.

Para desfragmentar un archivo

  1. Use el código de control FSCTL_GET_VOLUME_BITMAP para buscar un lugar en el volumen lo suficientemente grande como para aceptar un archivo completo.

    Nota

    Si es necesario, mueva otros archivos para hacer un lugar lo suficientemente grande. Idealmente, hay suficientes clústeres sin asignar después de la primera extensión del archivo que puede mover extensiones posteriores al espacio después de la primera extensión.

     

  2. Use el código de control FSCTL_GET_RETRIEVAL_POINTERS para obtener un mapa del diseño actual del archivo en el disco.

  3. Recorre la estructura RETRIEVAL_POINTERS_BUFFER devuelta por FSCTL_GET_RETRIEVAL_POINTERS.

  4. Use el código de control FSCTL_MOVE_FILE para mover cada clúster a medida que recorre la estructura.

    Nota

    Es posible que tenga que renovar el mapa de bits o la estructura de recuperación, o ambos en varias ocasiones a medida que otros procesos escriben en el disco.

     

Dos de las operaciones que se usan en el proceso de desfragmentación requieren un identificador para un volumen. Solo los administradores pueden obtener un identificador de un volumen, por lo que solo los administradores pueden desfragmentar un volumen. Una aplicación debe comprobar los derechos de un usuario que intenta ejecutar software de desfragmentación y no debe permitir que un usuario desfragmente un volumen si el usuario no tiene los derechos adecuados.

Al usar CreateFile para abrir un directorio durante la desfragmentación de un volumen del sistema de archivos FAT o FAT32, especifique el valor de GENERIC_READ máscara de acceso. No especifique el valor de MAXIMUM_ALLOWED máscara de acceso. Se deniega el acceso al directorio si se realiza.

No intente mover clústeres asignados en un sistema de archivos NTFS que se extienda más allá del tamaño de archivo redondeado del clúster, ya que el resultado es un error.

Se pueden desfragmentar puntos, mapas de bits y listas de atributos en volúmenes del sistema de archivos NTFS, abrirse para lectura y sincronización, y asignar nombres mediante la sintaxis file:name:type ; por ejemplo, dirname:$i 30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT y mrp::$ATTRIBUTE_LIST.

Al desfragmentar volúmenes del sistema de archivos NTFS, se permite desfragmentar un clúster virtual más allá del tamaño de asignación de un archivo.

Minimizar las interacciones entre la desfragmentación y las instantáneas

Cuando sea posible, mueva los datos en bloques alineados entre sí en incrementos de 16 kilobytes (KB). Esto reduce la sobrecarga de copia en escritura cuando se habilitan las instantáneas, ya que aumenta el espacio de instantáneas y se reduce el rendimiento cuando se producen las condiciones siguientes:

  • El tamaño del bloque de solicitud de movimiento es menor o igual que 16 KB.
  • La diferencia de movimiento no está en incrementos de 16 KB.

La diferencia de movimiento es el número de bytes entre el inicio del bloque de origen y el inicio del bloque de destino. En otras palabras, un bloque que comienza en el desplazamiento X (en disco) se puede mover a un desplazamiento inicial Y si el valor absoluto de X menos Y es un múltiplo par de 16 KB. Por lo tanto, suponiendo que los clústeres de 4 KB, se optimizará un traslado del clúster 3 al clúster 27, pero no se moverá del clúster 18 al clúster 24. Tenga en cuenta que mod(3,4) = 3 = mod(27,4). Mod 4 se elige porque cuatro clústeres a 4 KB cada uno equivalen a 16 KB. Por lo tanto, un volumen con formato a un tamaño de clúster de 16 KB dará lugar a que se optimicen todos los archivos de movimiento.

Para obtener más información sobre las instantáneas, vea Servicio de instantáneas de volumen.

Archivos, secuencias y tipos de flujo admitidos para la desfragmentación

Aunque la mayoría de los archivos se pueden mover mediante el código de control FSCTL_MOVE_FILE , no todos se pueden mover. A continuación se muestra la lista de archivos, secuencias y tipos de flujo (también denominados códigos de tipo de atributo) admitidos por FSCTL_MOVE_FILE. Otros archivos, secuencias y tipos de secuencia no son compatibles con FSCTL_MOVE_FILE.

Tipos de secuencia admitidos para cualquier archivo o directorio.

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

**Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 y Windows XP: **::$EA y ::$LOGGED_UTILITY_STREAM no se admiten antes de Windows 8 y Windows Server 2012

Tipos de flujo admitidos para cualquier directorio.

  • ::$BITMAP
  • ::$INDEX_ALLOCATION

A continuación se muestran los tipos de archivo, secuencia y secuencia del sistema admitidos por FSCTL_MOVE_FILE en formato "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