¿Cómo produzco "escasez" de un archivo?

15

¿Cómo saco cuánto tamaño nominal del archivo está realmente lleno de datos? Como vmtouchmuestra la cantidad de archivo que hay actualmente en la memoria ...

Espero que el flujo de trabajo sea así:

$ fallocate -l 1000000 data 
$ measure_sparseness data
100%
$ fallocate -p -o 250000 -l 500000  data
$ measure_sparseness
50%

Solución: el uso du -bshy el du -shy los comparan.

Vi.
fuente
1
relacionado: filefragpara cualquier sistema de archivos y xfs_bmap -vplpara XFS son herramientas clave para mostrar dónde están los datos (y dónde están las extensiones no escritas preasignadas) cuando se juega con archivos dispersos y perforaciones.
Peter Cordes
filefrag data-> múltiple FIBMAP: Invalid argument-> data: 1 extent found...
Vi.
en que sistema de archivos? filefrag -efunciona perfectamente en XFS y ext4 al menos. No he probado en otros. Utiliza FIEMAP (extensión-mapa), con un respaldo a FIBMAP. Si esos ioctls no funcionan, entonces no será útil.
Peter Cordes
En tmpfs. Mi filefragno tiene -eopción.
Vi.
¿Qué edad tiene tu e2fsprogs? Estoy bastante seguro de que no es una característica reciente. También hay una -vopción que imprime la misma información detallada (más algunas líneas de encabezado adicionales). Quizás tu filefragtengas eso. Sin xfs_bmapembargo, a diferencia de esto, no indica explícitamente agujeros con líneas separadas, solo tiene discontinuidades en la posición del archivo. De todos modos, no me sorprende que tmpfsno sea compatible con FIEMAP, porque no hay un dispositivo de bloque como almacén de respaldo, por lo que no hay un valor razonable para la ubicación de las extensiones.
Peter Cordes

Respuestas:

19

findtiene un %Sespecificador de formato que incluso se llama "escasez"

         %S     File's  sparseness.   This  is  calculated as (BLOCKSIZE*st_blocks / st_size).  The exact value you will get for an ordinary file of a certain
                 length is system-dependent.  However, normally sparse files will have values less than 1.0, and files which use indirect  blocks  may  have  a
                 value which is greater than 1.0.   The value used for BLOCKSIZE is system-dependent, but is usually 512 bytes.   If the file size is zero, the
                 value printed is undefined.  On systems which lack support for st_blocks, a file's sparseness is assumed to be 1.0.
$ fallocate -l 1000000 data
$ find data -printf '%S\n'
1.00352
$ fallocate -p -o 250000 -l 500000  data
$ find data -printf '%S\n'
0.507904
Vi.
fuente
Interesante. La mayoría de los archivos regulares en un sistema tendrán una dispersión superior a 1.0, los directorios, enlaces y sockets siempre tendrán exactamente 1.0.
grochmal
¿Algunos sistemas no guardaron el enlace simbólico (corto) directamente en el inodo, sin usar bloques de datos? Me pregunto cuál debería ser la escasez de eso. Además, ¿no es esa definición al revés, seguramente un archivo normal (es decir, no disperso) debería tener dispersión cero? :)
ilkkachu
@grochmal, en ext4 (Linux):, ln -s foo link"escasez" de link: 0. Los zócalos y FIFO tienen longitud cero, por lo que findmuestra la escasez 1.
ilkkachu
1

Si findno tiene esa opción, un método que funciona en UNIX desde los años 70 es:

ls -ls file

Que imprimirá el número real de bloques utilizados y el byte más alto jamás escrito. A partir de eso, puede calcular fácilmente cuántos bloques realmente no se han asignado.

MAPA
fuente
0

Mientras que find's %Simprimirá una breve salida, para más detalles puede que desee ver sparsetestlo que escribí - código abierto, y en github aquí . Siéntase libre de modificarlo si desea imprimir (por ejemplo) cada hoyo.

Artículo de blog mostrando problemas con las asignaciones dispersas aquí utilizando sparsetestpara depurar el problema.

abligh
fuente
¿Puede imprimir un "mapa" de extensiones en un archivo, como vmtouch -vimprime el mapa de las áreas en caché en el archivo?
Vi.
@Vi. Lo escribí hace un buen rato y olvidé algunos detalles: lo que en realidad está haciendo es crear un archivo escaso, escribir datos en él y luego imprimir estadísticas. Solo quieres la estadística creando bit. Para imprimir agujeros necesitará lseekcon SEEK_HOLEy SEEK_DATA. Fácil de hacer.
Abligh