Compartir a través de


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 separados estén en un disco los clústeres no contiguos, peor será 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 se fragmenta. 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:

  • Habilitar aplicaciones para buscar clústeres vacíos
  • Determinar la ubicación del disco de los clústeres de archivos
  • Mover 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 se ejecuten otros procesos. 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 que quede un espacio lo suficientemente grande. Lo ideal es que haya suficientes clústeres sin asignar después de la primera extensión del archivo para que pueda mover las extensiones posteriores al espacio después de la primera extensión.

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

  2. Recorra la estructura RETRIEVAL_POINTERS_BUFFER devuelta por FSCTL_GET_RETRIEVAL_POINTERS.

  3. 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 mientras 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 para 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 este no tiene los derechos adecuados.

Al usar CreateFile para abrir un directorio durante la desfragmentación de un volumen de sistema de archivos FAT o FAT32, especifique el valor de máscara de acceso GENERIC_READ. No especifique el valor de máscara de acceso MAXIMUM_ALLOWED. Si lo hace, se denegará el acceso al directorio.

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.

Los puntos de nuevo análisis, los mapas de bits y las listas de atributos de los volúmenes del sistema de archivos NTFS se pueden desfragmentar, abrir para lectura y sincronización, y nombrar utilizando la sintaxis file:name:type syntax; for example, dirname:$i30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT, and 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.

Minimización de las interacciones entre la desfragmentación y las instantáneas

Siempre que 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 se 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 inferior a 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 se trate de clústeres de 4 KB, se optimizará un movimiento 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). Se elige Mod 4 porque cuatro clusters de 4 KB cada uno equivalen a 16 KB. Por lo tanto, un volumen formateado con un tamaño de clúster de 16 KB hará que se optimicen todos los archivos de movimiento.

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

Archivos, flujos 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, flujos y tipos de flujo (también denominados códigos de tipo de atributo) que admite FSCTL_MOVE_FILE. No se admiten otros archivos, flujos ni tipos de flujo en FSCTL_MOVE_FILE.

Tipos de flujo 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 archivos del sistema, flujos y tipos de flujo que se admiten con el formato FSCTL_MOVE_FILE in "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