¿Se guardan los archivos en el disco de forma secuencial?

22

Como entendí, "archivo disperso" significa que el archivo puede tener 'huecos', por lo que los datos utilizados reales pueden ser más pequeños que el tamaño de archivo lógico.

¿Cómo los sistemas de archivos de Linux guardan archivos en el disco? Estoy principalmente interesado en ext4. Pero:

  1. ¿Se puede guardar un archivo no secuencialmente en el disco? Con eso, quiero decir que parte del archivo se encuentra en la dirección física X y la siguiente parte en la dirección física Y, que no está cerca de X + offset).
  2. ¿Puedo de alguna manera controlar la secuencialidad del archivo?
    Quiero asignar un archivo de 10 GB. Quiero que sea secuencial en el disco y no dividido entre diferentes compensaciones.
  3. ¿Actúa de manera diferente entre los diferentes tipos?
hudac
fuente
Es posible que desee leer ext4.wiki.kernel.org/index.php/Main_Page
roaima
1
Quizás, si entiendo su intención correctamente, estaría más interesado en la API de nivel inferior, donde trabaja con dispositivos de almacenamiento sin tener que pasar por la capa del sistema de archivos. Su punto de entrada podría ser el dmsetupprograma, una interfaz para el mapeador de dispositivos. Esta puede ser una buena opción si está planeando un almacenamiento similar a una base de datos.
wvxvw
44
Este es un detalle de implementación del sistema de archivos. Casi todos los sistemas de ficheros hacen archivos de fragmentos de forma predeterminada; solo iso9660y romfsson incapaces de hacerlo y requieren almacenamiento continuo (de estos puedo enumerarlos fuera de la cabeza).
mirabilos
2
si el archivo es contiguo en el disco o no, la lectura / escritura de datos siempre será contigua a menos que haga una búsqueda en otra parte del archivo. Entonces, ¿por qué te importa esto? A menos que la fragmentación sea un problema grave que afecte el rendimiento
phuclv
3
@hudac una cosa a tener en cuenta es que contiguo no es tan útil en la práctica. La fácil es flash, donde la fragmentación no es un gran problema, pero en un plato giratorio aún no puede beneficiarse de los datos contiguos. En una bandeja giratoria, debe pensar en sus patrones de acceso y dónde están los datos. Si necesita el sector que acaba de pasar por debajo de la cabeza, debe esperar a que vuelva a funcionar por completo. Para obtener los mejores resultados, desea escalonar los datos para que estén "cerca" cuando sea necesario leerlos. Aumentar el tamaño del caché es más fácil ;-)
Ukko

Respuestas:

41

¿Se puede guardar un archivo no secuencialmente en el disco? Quiero decir, parte del archivo se encuentra en la dirección física X y la otra parte en la dirección física Y, que no está cerca de X + offset).

Sí; Esto se conoce como fragmentación de archivos y no es raro, especialmente con archivos más grandes. La mayoría de los sistemas de archivos asignan espacio según sea necesario, más o menos secuencialmente, pero no pueden adivinar el comportamiento futuro, por lo que si escribe 200MiB en un archivo y luego agrega otros 100MiB, existe una probabilidad distinta de cero de que ambos conjuntos de datos almacenarse en diferentes áreas del disco (básicamente, cualquier otra escritura que necesite más espacio en el disco, que ocurra después de la primera escritura y antes de la segunda, podría interponerse entre las dos). Si un sistema de archivos está casi lleno, la situación generalmente será peor: puede que no haya un área contigua de espacio libre lo suficientemente grande como para contener un nuevo archivo, por lo que tendrá que estar fragmentado.

¿Puedo controlar de alguna manera la secuencia de archivos? Quiero asignar un archivo grande de 10 GB. Quiero que sea secuencial en el disco y no dividido entre diferentes compensaciones.

Puede informar al sistema de archivos sobre el tamaño de destino de su archivo cuando se crea; esto ayudará al sistema de archivos a almacenarlo de manera óptima. Muchos sistemas de archivos modernos usan una técnica conocida como asignación diferida, donde el diseño en disco de un nuevo archivo se calcula lo más tarde posible, para maximizar la información disponible cuando se realiza el cálculo. Puede ayudar a este proceso utilizando la posix_fallocate(3)función para decirle al sistema de archivos cuánto espacio en disco debe asignarse en total. Los sistemas de archivos modernos intentarán realizar esta asignación secuencialmente.

¿Actúa de manera diferente entre los diferentes tipos?

Los diferentes sistemas de archivos se comportan de manera diferente, sí. Los sistemas de archivos basados ​​en registros como NILFS2 no asignan el almacenamiento de la misma manera que los sistemas de archivos basados ​​en extensión como Ext4, y ese es solo un ejemplo de variación.

Stephen Kitt
fuente
1
¿El uso fallocate(3)garantizará la secuencia de archivos? ¿O solo dará pistas sobre el sistema de archivos? No puedo entenderlo completamente de las páginas del manual.
hudac
66
No puede garantizar la asignación secuencial, es solo una pista. ¡Pero definitivamente deberías usarlo si estás escribiendo archivos de 10GiB!
Stephen Kitt
66
Esencialmente, todos los sistemas de archivos más sofisticados que FAT (esto se remonta al Berkeley UFS original) dividirán intencionalmente archivos grandes y los distribuirán en múltiples "grupos de asignación"; Esto les ayuda a minimizar la fragmentación general del disco. No puede ser una manera de ajustar el funcionamiento de este, pero hay buenas probabilidades que tiene que volver a crear el sistema de archivos desde cero con el fin de hacerlo, y probablemente no es una forma de apagarlo completamente.
zwol
2
@hudac Es imposible garantizar la secuencialidad en todos los casos (vea el caso con una unidad que está cerca de estar llena), y para ser honesto con el aumento de SSD, importa menos de lo que solía (para aquellos que pueden pagarlos al menos )
Muzer
1
También tenga en cuenta que hay situaciones, como los sistemas RAID, donde tener archivos contiguos es menos eficiente, si es posible. Creo que ese es realmente el propósito de un controlador de subsistema de disco / almacenamiento: descargar todo el trabajo de almacenamiento de archivos de la manera más óptima que razonablemente se puede esperar.
jamesqf
17

El comando filefragle dirá cómo se almacena físicamente su archivo en su dispositivo:

# 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

Si escribe su archivo de una sola vez, supongo que su archivo no estará fragmentado.

La página de manual de fallocate(1) es bastante clara:

fallocate se usa para preasignar bloques a un archivo. Para los sistemas de archivos que admiten la fallocatellamada del sistema, esto se realiza rápidamente mediante la asignación de bloques y marcándolos como no inicializados, sin requerir E / S en los bloques de datos. Esto es mucho más rápido que crear un archivo al llenarlo con ceros.

A partir de Linux Kernel v2.6.31, la fallocatellamada al sistema es compatible con los sistemas de archivos btrfs, ext4, ocfs2 y xfs.

¿Es secuencial? El sistema primero intentará asignar los bloques secuencialmente. Si no puede, no te avisará.

Vouze
fuente
¿Qué es el tipo 'ef53'? Lo vi también en mis archivos. Pero mi tipo de FS es ext4.
hudac
2
EF53 es el número "SUPER_MAGIC" de ext2, ext3 y ext4. Busque en "include / uapi / linux / magic.h" en las fuentes del kernel para todos los números mágicos de cada sistema de archivos.
Vouze
En Debian, filefragestá oculto en /usr/sbin. Pero parece funcionar para usuarios comunes (en ext4, al menos). Puede ser instructivo para stracesu funcionamiento ver cómo medir la fragmentación por sí mismo, si la falta de advertencia es un obstáculo para usted.
Toby Speight
6

Menciona archivos dispersos, y ninguna de las otras respuestas los ha mencionado.

La mayoría de los archivos no son escasos. La forma más común de crear un archivo es escribirlo todo de una vez, desde el principio hasta el final. No hay agujeros allí.

Sin embargo, puede decir "muévase a la posición 1,000,000,000,000 y escriba un byte allí". Esto creará un archivo que parece ser un etabyte grande, pero en realidad solo usa (probablemente) 4k en el disco. Este es un archivo escaso.

Puede hacer esto muchas veces para el mismo archivo, dejando pequeñas cantidades de datos dispersos en el vasto vacío.

Si bien esto puede ser útil, hay dos desventajas.

La primera es que el archivo estará fragmentado, que es lo que le preocupaba.

El segundo es que no todos los programas manejan bien estos archivos. Por ejemplo, algunos programas de respaldo intentarán respaldar el vacío y, por lo tanto, crear un respaldo que sea mucho más grande de lo necesario, posiblemente demasiado grande para el medio de respaldo.

Stig Hemmer
fuente
Pero incluso un archivo no disperso a menudo no será contiguo en el disco.
Barmar
2

¿Puedo de alguna manera controlar la secuencialidad del archivo? Quiero asignar un archivo de 10 GB. Quiero que sea secuencial en el disco y no dividido entre diferentes compensaciones.

Hay al menos un par de formas de lograr esto.

  1. Use un sistema de archivos con mucho espacio libre y preasigne el espacio (por ejemplo, use un marcador de fin de datos específico de la aplicación y agregue datos aleatorios hasta que el tamaño del archivo alcance los 10 GB). No se garantiza que esto genere datos no fragmentados.

  2. Use un sistema de archivos sin procesar (sin cocer) en lugar de ext4, etc. Los DBMS a veces lo hacen por razones de rendimiento. La desventaja es que tiene que hacer su propio almacenamiento en caché / diario / recuperación, etc.

Las instancias en las que gana mucho haciendo esto son relativamente raras: primero buscaría en otro lugar para optimizar el rendimiento.


Ver también

¿Es cierto que los sistemas de gestión de bases de datos suelen omitir los sistemas de archivos?

RedGrittyBrick
fuente
-1

Si esto es solo una vez y no es importante cómo se almacena el archivo originalmente, solo importa el resultado, entonces simplemente puede guardar el archivo normalmente y luego ejecutar el desfragmentador de su sistema operativo. Luego puede verificar con esta respuesta si su archivo está en una sola pieza, si no, repita. Esta es la forma más fácil de hacerlo, sin usar comandos o programas externos, pero ciertamente no es el método más rápido, porque desfragmenta todo el disco.

Fabian Röling
fuente
1
"Ejecutar el desfragmentador"? ¿Existe tal programa? Lo único que se encontró cuando buscaba con aptitude search ~ddefragfueron ddrescueviewy el nidssegmento TCP reensamblaje biblioteca. Su respuesta no es muy útil si no dice cómo se llama el programa o qué argumentos deben pasarse.
Toby Speight
1
@TobySpeight: sí, hay un desfragmentador; e4defrag.
ravery