Skip to content

Instantly share code, notes, and snippets.

@mgarciaisaia
Created October 13, 2016 04:11
Show Gist options
  • Save mgarciaisaia/34b6b3d7c87667caba91e488a182353b to your computer and use it in GitHub Desktop.
Save mgarciaisaia/34b6b3d7c87667caba91e488a182353b to your computer and use it in GitHub Desktop.
Divagando un poco sobre el diseño de los inodos, y los archivos "chicos" y "grandes" en un Sistema Operativo

df es un comando que muestra el espacio libre en cada partición montada en el sistema. Por defecto muestra bloques totales, usados y disponibles de cada partición, pero también soporta una opción --inodes que muestra la cantidad de inodos en lugar de cantidad de bloques.

En mi VM, que está instalada hace un par de años (desde que la publicamos, je), aunque con no demasiado uso, veo lo siguiente:

$ df
S.ficheros     blocks de 1K  Usados Disponibles Uso% Montado en
/dev/sda1          50959004 4709416    43637980  10% /
none                      4       0           4   0% /sys/fs/cgroup
udev                 243936       4      243932   1% /dev
tmpfs                 50720     908       49812   2% /run
none                   5120       0        5120   0% /run/lock
none                 253596   50640      202956  20% /run/shm
none                 102400      32      102368   1% /run/user

$ df --inodes 
S.ficheros     Nodos-i NUsados NLibres NUso% Montado en
/dev/sda1      3244032  213480 3030552    7% /
none             63399       2   63397    1% /sys/fs/cgroup
udev             60984     457   60527    1% /dev
tmpfs            63399     417   62982    1% /run
none             63399       3   63396    1% /run/lock
none             63399     249   63150    1% /run/shm
none             63399      26   63373    1% /run/user

Básicamente, en mi FS raíz (/dev/sda1, el montado en /) tengo 213.480 inodos usados (aka, "213 mil archivos").

Hoy en clase Adro nombró la utilidad de los punteros directos, que hacen que, teniendo 12 punteros directos a bloques de 4kb, los archivos de menos de 48K puedan grabarse sin indirecciones.

Al entender que hablábamos de 48kb me imaginé a algunos de ustedes, jóvenes millenials, pensando que deben mandarse emojis más pesados que eso cuando chatean cons sus clientes de chat de jovencitos (?). No, en serio - más allá del chiste, en 2016 suena un poco irrisorio hablar de 48kb como un tamaño "considerable".

Así que, con alguna conjetura en la cabeza, quise tener una aproximación de qué cantidad de archivos de una instalación de Linux tendrán más de 48k, y cuántos menos.

En mi VM, estos son los números:

$ sudo find / -size -48k 2>/dev/null | grep -v /proc/ | wc -l
227588
$ sudo find / -size +48k 2>/dev/null | grep -v /proc/ | wc -l
7638

La suma da 230.000 archivos, y dije que tenía 213.000 inodos. La diferencia está, en parte, porque el find es sobre todo el sistema de archivos (contando todos los FS extra que tenga montados), mientras que el df es sólo sobre la partición /dev/sda1 (el FS raíz), y en parte por los hardlinks que puedan existir (muchas rutas para un mismo inodo). Pero no están tan lejos, tampoco, como para descartar el experimento: 200.000 contra 10.000, exagerando los datos a favor de los archivos grandes.

Es decir, tengo 20 veces más archivos direccionados sólo con los punteros directos que los que usan indirecciones (los números "posta" de find dan 30x, pero aproximé a 20). Parece que Juan José Extended tuvo una gran idea el día que diseñó los inodos.

Ahora, volviendo a los millenials, ¿qué son esos archivos de menos de 48k? ¿Qué guardan en un disco, si no son fotos y MP3?

Bueno... ¡Archivos de configuración! En Linux, la mayoría de los programas se configuran mediante archivos. Muchos archivos, porque en general hay un archivo de configuración global al sistema (en el que los admins ponen defaults), más un archivo de configuración por cada usuario (para poder tunear cada uno sus opciones sin molestar a los demás).

Además, si somos desarrolladores - ¡lo somos! -, los archivos fuente suelen pesar mucho menos que 48k (y, si los tuyos no lo hacen, te invito a que los pongas a dieta). Y usamos git, que por cada versión de cada archivo en cada commit guarda un archivo con su contenido comprimido.

Y así con mil cosas más. Si te intriga mucho, corré ese comando en la VM, pero reemplazá el wc -l del final por un less, para poder ver la lista de archivos. Y fijate qué onda - ¡y contame!

Por último, y sólo para comparar, corrí los mismos comandos en la compu que uso todos los días tanto para trabajar como para cualquier otra cosa desde hace aproximadamente 3 años. Dejé el 48k sólo para tener alguna mínima noción, aunque el asunto se pone menos representativo, ya que es otro sistema operativo (MacOS X), y que no tengo en claro cómo está diseñado su FS - no sería raro que, por decir algo, el FS pueda tener buena performance con archivos más grandes, y por eso todo el sistema tienda a usar archivos más grandes que 48k. Pero como no perdía mucho más que un ratito de CPU hacer la prueba, ahí fue:

$ sudo find / -size -48k 2>/dev/null | wc -l
 3683340
$ sudo find / -size +48k 2>/dev/null | wc -l
  163493

Si bien tengo muchísimos archivos más (¿ya dije que son 3 años de usarla mucho a diario?), la proporción sigue dando alta (22.5x, más o menos), aunque bajó respecto a la proporción que dieron los find en Linux (era 29.5, aprox).

Nada, jugando un poco :)

@afilgueira
Copy link

👏 👏 👏 👏 👏 👏

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment