Compara (por ejemplo) du -bm
a du -m
.
El -b
establece --apparent-size --block-size=1
,pero luego el m
anula el tamaño del bloque para que sea 1M
.
Similar para -bh
contra -h
:el -bh
significa --apparent-size --block-size=1 --human-readable
, y de nuevo el h
anula ese tamaño de bloque.
Tamaño aparente es el número de bytes que sus aplicaciones creen que hay en el archivo. Es la cantidad de datos que se transferirían a través de la red (sin contar los encabezados de protocolo) si decidiera enviar el archivo a través de FTP o HTTP. También es el resultado de cat theFile | wc -c
y la cantidad de espacio de direcciones que ocuparía el archivo si carga todo usando mmap
.
Uso de disco es la cantidad de espacio que no se puede usar para otra cosa porque su archivo está ocupando ese espacio.
En la mayoría de los casos, el tamaño aparente es más pequeño que el uso del disco porque el uso del disco cuenta el tamaño completo del último bloque (parcial) del archivo, y el tamaño aparente solo cuenta los datos que están en ese último bloque. Sin embargo, el tamaño aparente es mayor cuando tiene un archivo disperso (los archivos dispersos se crean cuando busca en algún lugar más allá del final del archivo y luego escribe algo allí; el sistema operativo no se molesta en crear muchos bloques llenos de ceros). - solo crea un bloque para la parte del archivo que decidiste escribir).
Ejemplo de granularidad de bloque mínimo
Juguemos un poco para ver qué está pasando.
mount
me dice que estoy en una partición ext4 montada en /
.
Encuentro su tamaño de bloque con:
stat -fc %s .
que da:
4096
Ahora vamos a crear algunos archivos con tamaños 1 4095 4096 4097
:
#!/usr/bin/env bash
for size in 1 4095 4096 4097; do
dd if=/dev/zero of=f bs=1 count="${size}" status=none
echo "size ${size}"
echo "real $(du --block-size=1 f)"
echo "apparent $(du --block-size=1 --apparent-size f)"
echo
done
y los resultados son:
size 1
real 4096 f
apparent 1 f
size 4095
real 4096 f
apparent 4095 f
size 4096
real 4096 f
apparent 4096 f
size 4097
real 8192 f
apparent 4097 f
Entonces vemos que cualquier cosa por debajo o igual a 4096
ocupa 4096
bytes de hecho.
Entonces, tan pronto como crucemos 4097
, sube a 8192
que es 2 * 4096
.
Está claro entonces que el disco siempre almacena datos en un límite de bloque de 4096
bytes.
¿Qué ocurre con los archivos dispersos?
No he investigado cuál es la representación exacta, pero está claro que --apparent
lo tiene en cuenta.
Esto puede llevar a que los tamaños aparentes sean mayores que el uso real del disco.
Por ejemplo:
dd seek=1G if=/dev/zero of=f bs=1 count=1 status=none
du --block-size=1 f
du --block-size=1 --apparent f
da:
8192 f
1073741825 f
Relacionado:Cómo probar si se admite un archivo disperso
¿Qué debo hacer si quiero almacenar un montón de archivos pequeños?
Algunas posibilidades son:
- usar una base de datos en lugar de un sistema de archivos:base de datos frente a almacenamiento en el sistema de archivos
- usar un sistema de archivos que admita la subasignación de bloques
Bibliografía:
- https://serverfault.com/questions/565966/cuáles-tamaños-de-bloque-para-millones-de-archivos-pequeños
- https://askubuntu.com/questions/641900/how-file-system-block-size-works
Probado en Ubuntu 16.04.