Solución 1:
El total "almacenado en caché" también incluirá otras asignaciones de memoria, como cualquier sistema de archivos tmpfs. Para ver esto en efecto, intente:
mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
y verá que el valor de "caché" cae en los 100 Mb que copió en el sistema de archivos basado en ram (suponiendo que hubiera suficiente RAM libre, es posible que parte de ella termine en intercambio si la máquina ya está comprometida en exceso en términos de uso de la memoria). El "sync; echo 3> /proc/sys/vm/drop_caches" antes de cada llamada a free debería escribir cualquier cosa pendiente en todos los búferes de escritura (la sincronización) y borrar todos los bloques de disco almacenados en caché/en búfer de la memoria para que free solo lea otros asignaciones en el valor "almacenado".
La RAM utilizada por las máquinas virtuales (como las que se ejecutan bajo VMWare) también puede contarse en el valor "almacenado en caché" gratuito, al igual que la RAM utilizada por los archivos asignados en memoria actualmente abiertos (esto variará según el hipervisor/versión que esté utilizando y posiblemente también entre versiones del kernel).
Por lo tanto, no es tan simple como "recuentos de búfer pendientes de escrituras de archivos/redes y recuentos en caché de bloques leídos/escritos recientemente guardados en RAM para guardar futuras lecturas físicas", aunque para la mayoría de los propósitos esta descripción más simple servirá.
Solución 2:
Pregunta capciosa. Cuando calcula el espacio libre, en realidad necesita sumar el búfer y el caché. Esto es lo que pude encontrar
Un búfer es algo que aún no se ha "escrito" en el disco. Un caché es algo que ha sido "leído" del disco y almacenado para su uso posterior.
http://visualbasic.ittoolbox.com/documents/difference- between-buffer-and-cache-12135
Solución 3:
Estaba buscando una descripción más clara sobre el búfer y la encontré en "Professional Linux® Kernel Architecture 2008"
Capítulo 16:Página y caché de búfer
Interacción
Establecer un vínculo entre las páginas y los búfers sirve de poco si no hay beneficios para otras partes del núcleo. Como ya se señaló, es posible que algunas operaciones de transferencia hacia y desde dispositivos de bloque deban realizarse en unidades cuyo tamaño depende del tamaño del bloque de los dispositivos subyacentes, mientras que muchas partes del núcleo prefieren realizar operaciones de E/S con granularidad de página, ya que esto facilita mucho las cosas. — especialmente en términos de gestión de memoria. En este escenario, los amortiguadores actúan como intermediarios entre los dos mundos.
Solución 4:
Explicado por RedHat :
Páginas de caché:
Un caché es la parte de la memoria que almacena datos de manera transparente para que las futuras solicitudes de esos datos se puedan atender más rápido. Esta memoria es utilizada por el núcleo para almacenar en caché los datos del disco y mejorar el rendimiento de E/S.
El kernel de Linux está construido de tal manera que utilizará la mayor cantidad de RAM posible para almacenar en caché la información de sus sistemas de archivos y discos locales y remotos. A medida que pasa el tiempo y se realizan varias lecturas y escrituras en el sistema, el kernel intenta mantener los datos almacenados en la memoria para los diversos procesos que se ejecutan en el sistema o los datos de los procesos relevantes que se utilizarán en un futuro próximo. El caché no se recupera en el momento en que el proceso se detiene o sale; sin embargo, cuando los otros procesos requieren más memoria que la memoria libre disponible, el kernel ejecutará la heurística para recuperar la memoria almacenando los datos del caché y asignando esa memoria al nuevo proceso.
Cuando se solicita cualquier tipo de archivo/datos, el kernel buscará una copia de la parte del archivo en la que el usuario está actuando y, si no existe tal copia, asignará una nueva página de memoria caché y la llenará con el contenido apropiado leído del disco.
Los datos que se almacenan dentro de un caché pueden ser valores que se han calculado anteriormente o duplicados de valores originales que se almacenan en otro lugar del disco. Cuando se solicitan algunos datos, primero se verifica el caché para ver si contiene esos datos. Los datos se pueden recuperar más rápidamente desde el caché que desde su origen.
Los segmentos de memoria compartida de SysV también se contabilizan como caché, aunque no representan ningún dato en los discos. Se puede verificar el tamaño de los segmentos de memoria compartida usando el comando ipcs -m y verificando la columna de bytes.
Búferes:
Los búferes son la representación de bloque de disco de los datos que se almacenan en las cachés de página. Los búferes contienen los metadatos de los archivos/datos que residen en la caché de la página. Ejemplo:cuando hay una solicitud de cualquier dato que esté presente en la caché de la página, primero el núcleo verifica los datos en los búferes que contienen los metadatos que apuntan a los archivos/datos reales contenidos en los cachés de la página. Una vez que se conoce la dirección de bloque real del archivo a partir de los metadatos, el kernel lo recoge para procesarlo.
Solución 5:
Liberar búfer/caché
Advertencia ¡Esto explica un método fuerte que no se recomienda en el servidor de producción! Así que estás advertido, no me culpes si algo sale mal.
Para entender, la cosa, podrías forzar su sistema para delegar tanta memoria como sea posible a cache
que soltar el archivo en caché:
Antes de hacer la prueba, puede abrir otra ventana y hacer clic:
$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 1 39132 59740 39892 1038820 0 0 1 0 3 3 5 13 81 1
1 0 39132 59140 40076 1038812 0 0 184 0 10566 2157 27 15 48 11
...
para seguir la evolución del swap en tiempo real.
Nota: Debe deshacerse de tantos discos libres en el directorio actual, tiene mem+swap
La demostración$ free
total used free shared buffers cached
Mem: 2064396 2004320 60076 0 90740 945964
-/+ buffers/cache: 967616 1096780
Swap: 3145720 38812 3106908
$ tot=0
$ while read -a line;do
[[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
done </proc/meminfo
$ echo $tot
10420232
$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s
$ cat >/dev/null veryBigFile
$ free
total used free shared buffers cached
Mem: 2064396 2010160 54236 0 41568 1039636
-/+ buffers/cache: 928956 1135440
Swap: 3145720 39132 3106588
$ rm veryBigFile
$ free
total used free shared buffers cached
Mem: 2064396 1005104 1059292 0 41840 48124
-/+ buffers/cache: 915140 1149256
Swap: 3145720 39132 3106588
Nota, el host en el que he hecho esto es muy usado. Esto será más significativo en una máquina realmente silenciosa.