Descripción
Hacemos un free -m y nos encontramos lo siguiente:
$ free -m total used free shared buffers cached Mem: 7971 2217 5754 0 50 766¿Hay alguna forma de saber de dónde sale ese 766?
Sabemos, claro, que estamos hablando de contenido cacheado en memoria (viva!). Más concretamente, estamos entrando en el terreno del pagecache y los dentry + inodos. Si por algún motivo extraño quisiéramos eliminar este contenido (en realidad normalmente nuestro objetivo debería ser tener lo máximo posible ahí, ¿Verdad?), usamos /proc:To free pagecache: echo 1 > /proc/sys/vm/drop_caches To free dentries and inodes: echo 2 > /proc/sys/vm/drop_caches To free pagecache, dentries and inodes: echo 3 > /proc/sys/vm/drop_caches
Hasta aquí hemos hecho lo normal. Vamos a intentar ir un poco más allá, a ver si somos capaces de saber qué ficheros son los responsables de ese uso de memoria. En el 2007, en LISA, uno de los documentos que se presentaron iba en esta línea. En realidad, este Paper iba mucho más lejos, y entraba en otro tipo de optimizaciones, en el uso de posix_fadvise de SUSv3 para pedir al SO que "adelante trabajo", .... No entramos en la utilidad de todo esto. Quien quiera más información que lea el documento, o que use Google y busque "fincore + PostgreSQL", por ejemplo.
Volvamos al tema. A ver si conseguimos saber lo que hay en esta parte de la memoria, sin complicarnos demasiado.
Bueno, en realidad, no vamos a complicamos nada, porque ya hay una pequeña utilidad (en C y Perl, todo disponible en Debian, CPAN, ...) que hace todo el trabajo. Vemos la instalación y un par de ejemplos en otras pestañas.Instalación
La instalación de fincore es sencilla. Además de un compilador, necesitamos una librería perl que no suele estar instalada por defecto, pero que está disponible sin mayores problemas, al menos en los repositorios de debian:
# aptitude install libinline-perl # cd /tmp/ # wget http://net.doit.wisc.edu/~plonka/fincore/fincore
La utilidad es un pequeño script en perl. Si lo ejecutamos sin argumentos vemos lo siguiente:# perl fincore Usage: fincore [options] <-stdin | file [...]> Options: -help - brief help message -man - full documentation -summary - report summary statistics for the files -justsummarize - just report summary statistics for the files -stdin - read file names from standard inputEn el directorio en el que ejecutamos el script deberíamos ver un subdirectorio "_Inline" con el ".so" correspondiente al código compilado que se encuentra en fincore.
Poco más desde el punto de vista de la instalación.Ejemplo de uso
Veamos si un fichero está cacheado en memoria:
# perl ./fincore --summary /home/mensajes/Maildir/cur/1318365085.M826754P16\,S\=16357\,W\=16729\:2\,Se page size: 4096 bytes /home/mensajes/Maildir/cur/1318365085.M826754P16\,S\=16357\,W\=16729\:2\,Se: no incore pages. 0 pages, 0.0 bytes in core for 1 file; 0.00 pages, 0.0 bytes per file.
Que viene a decir que el kernel no ha accedido a este fichero en algo de tiempo. Vamos a leerlo y a probar otra vez:# cat /home/mensajes/Maildir/cur/1318365085.M826754P16\,S\=16357\,W\=16729\:2\,Se >> /dev/null # perl ./fincore --summary /home/mensajes/Maildir/cur/1318365085.M826754P16\,S\=16357\,W\=16729\:2\,Se page size: 4096 bytes /home/mensajes/Maildir/cur/1318365085.M826754P16\,S\=16357\,W\=16729\:2\,Se: 4 incore pages: 0 1 2 3 4 pages, 16.0 kbytes in core for 1 file; 4.00 pages, 16.0 kbytes per file.
Que viene a ser el tamaño del fichero, claro:# ls -lha /home/mensajes/Maildir/cur/1318365085.M826754P16\,S\=16357\,W\=16729\:2\,Se -rw------- 1 user group 16K oct 11 22:31 /home/mensajes/Maildir/cur/1318365085.M826754P16\,S\=16357\,W\=16729\:2\,Se
Veamos un fichero algo mayor# free -m total used free shared buffers cached Mem: 3011 576 2434 0 27 164 -/+ buffers/cache: 384 2626 Swap: 979 0 979 # ls -lha /var/backups/mysql.sql -rw-r----- 1 root root 214M oct 30 11:47 /var/backups/mysql.sql # cat /var/backups/mysql.sql >> /dev/null # free -m total used free shared buffers cached Mem: 3011 790 2221 0 27 377 -/+ buffers/cache: 385 2626 Swap: 979 0 979 # perl ./fincore -justsummarize /var/backups/mysql.sql page size: 4096 bytes 54550 pages, 213.1 Mbytes in core for 1 file; 54550.00 pages, 213.1 Mbytes per file.Básicamente, hemos precargado en memoria todo el fichero. Para vaciarlo, a /proc otra vez:# echo 2 > /proc/sys/vm/drop_caches # free -m total used free shared buffers cached Mem: 3011 474 2537 0 27 64 -/+ buffers/cache: 381 2630 Swap: 979 0 979Esto no es más que un ejemplo, claro. El uso que se de a todo esto ya es cosa de cada uno.