En Linux, ¿cuál es la diferencia entre "buffers" y "cache" informados por el comando free?

74

Esta es una vieja pregunta que he visto de vez en cuando. Mi comprensión de esto es bastante limitada (después de haber leído acerca de las diferencias hace mucho tiempo, pero los factoides involucrados nunca se pegaron realmente).

Según lo entiendo,

  • Tampones

    Son utilizados por programas con operaciones de E / S activas, es decir, datos que esperan ser escritos en el disco

  • Cache

    Es el resultado de operaciones de E / S completadas, es decir, almacenamientos intermedios que se han vaciado o datos leídos del disco para satisfacer una solicitud.

¿Puedo obtener una explicación clara de la posteridad?

Avery Payne
fuente
1
stackoverflow.com/questions/6345020/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Se parece más a los metadatos que se encuentran en los buffers, no está relacionado con los buffers io. Algunos de los almacenamientos intermedios del kernel se contabilizan en el asignador de losas, pero no cuentan en absoluto para los almacenamientos intermedios o la memoria caché.
eckes

Respuestas:

42

El total "en caché" también incluirá algunas 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 por los 100Mb que copió al sistema de archivos basado en ram (suponiendo que haya suficiente RAM libre, puede encontrar que parte de él terminó en intercambio si la máquina ya está comprometida en exceso en términos de uso de 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 buffers de escritura (la sincronización) y borrar todos los bloques de disco en caché / buffer de la memoria, por lo que solo leerá otros asignaciones en el valor "en caché".

La RAM utilizada por las máquinas virtuales (como las que se ejecutan en VMWare) también se puede contar en el valor "en caché" de la libre, al igual que la RAM utilizada por los archivos mapeados en memoria actualmente abiertos (esto variará dependiendo del hipervisor / versión que esté utilizando y posiblemente entre versiones del kernel también).

Por lo tanto, no es tan simple como "los buffers cuentan las escrituras de archivos / redes pendientes y los recuentos en caché de los bloques leídos / escritos recientemente guardados en la RAM para guardar futuras lecturas físicas", aunque para la mayoría de los propósitos esta descripción más simple servirá.

David Spillett
fuente
1
+1 para matices interesantes. Este es el tipo de información que estoy buscando. De hecho, sospecho que las cifras son tan complicadas, tan involucradas en tantas actividades diferentes, que son, en el mejor de los casos, indicadores generales.
Avery Payne
No creo que la RAM utilizada por las máquinas virtuales se cuente como "en caché", al menos para qemu-kvm. Noté que en mi host KVM, el valor de caché no solo es demasiado pequeño para ser correcto (a 1.9 Gig), sino que no cambia si destruyo / inicio una de mis máquinas virtuales. Tampoco cambia si realizo el truco de montaje tmpfs en una de las máquinas virtuales. Creé una partición tmpfs de 800Meg allí y "en caché" mostró los valores adecuados en la máquina virtual, pero no cambió en el host de la máquina virtual. Pero el valor "usado" se redujo / aumentó cuando destruí / comencé mi VM.
Mike S
... Ejecuté pruebas en un host VM Centos 7.2.1511 con kernel 3.10.0-327.
Mike S
@MikeS: la forma en que las diferentes soluciones de virtualización manejan la memoria puede variar, de hecho, la forma en que el kernel mide varios usos de la memoria puede cambiar entre las versiones principales.
David Spillett el
@MikeS: Con respecto a "realizar el truco de montaje tmpfs en una de las máquinas virtuales", eso no afectará las lecturas del host si no muestran otras memorias utilizadas por la máquina virtual. Veo el efecto en una máquina virtual KVM: antes de dd free = 2020, después de dd free = 1899, después de drop fs free = 2001 (la diferencia de 19Mb se debe a otros procesos en la VM, no estaba inactivo cuando ejecuté la prueba). Es posible que el host no vea el cambio: es probable que la memoria todavía esté asignada a la VM, aunque los procesos de la VM la pueden usar libremente.
David Spillett el
5

Estaba buscando una descripción más clara sobre el búfer y encontré en "Professional Linux® Kernel Architecture 2008"

Capítulo 16: Página y caché de búfer

Interacción

Configurar un enlace entre páginas y buffers tiene poco propósito si no hay beneficios para otras partes del núcleo. Como ya se señaló, algunas operaciones de transferencia hacia y desde dispositivos de bloque pueden necesitar realizarse en unidades cuyo tamaño depende del tamaño de bloque de los dispositivos subyacentes, mientras que muchas partes del núcleo prefieren llevar a cabo operaciones de E / S con granularidad de página. hace las cosas mucho más fáciles, especialmente en términos de administración de memoria. En este escenario, los amortiguadores actúan como intermediarios entre los dos mundos.

c4f4t0r
fuente
3

Explicado por RedHat :

Páginas de caché:

Un caché es la parte de la memoria que almacena los datos de forma transparente para que las solicitudes futuras de esos datos puedan ser atendidas más rápido. El kernel utiliza esta memoria 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 usará tanta RAM como sea posible para almacenar en caché la información de sus sistemas de archivos y discos locales y remotos. A medida que pasa el tiempo, se realizan varias lecturas y escrituras en el sistema, el núcleo trata de 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ían en el futuro cercano. La memoria caché no se recupera en el momento en que el proceso se detiene / sale; sin embargo, cuando los otros procesos requieren más memoria que la memoria libre disponible, el núcleo ejecutará heurística para reclamar la memoria almacenando los datos de la memoria caché y asignando esa memoria al nuevo proceso.

Cuando se solicita cualquier tipo de archivo / datos, el núcleo buscará una copia de la parte del archivo en el que está actuando el usuario y, si no existe tal copia, asignará una nueva página de memoria caché y la llenará con los contenidos apropiados leídos del disco.

Los datos que se almacenan en una memoria caché pueden ser valores que se han calculado anteriormente o duplicados de valores originales que se almacenan en otra parte 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 del caché que de su origen de 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.

Tampones:

Los almacenamientos intermedios son la representación del bloque de disco de los datos que se almacenan en los cachés de página. Buffers contiene los metadatos de los archivos / datos que residen en la memoria caché de la página. Ejemplo: cuando hay una solicitud de datos que está presente en la memoria caché de la página, primero el núcleo verifica los datos en los buffers que contienen los metadatos que apuntan a los archivos / datos reales contenidos en las memorias caché de la página. Una vez que los metadatos conocen la dirección de bloqueo real del archivo, el núcleo lo recoge para procesarlo.

Ijaz Ahmad Khan
fuente
2

Liberación de búfer / caché

Advertencia ¡ Esto explica un método fuerte no recomendado en el servidor de producción! Así que estás advertido, no me culpes si algo sale mal.

Para comprenderlo, podría forzar a su sistema a delegar la mayor cantidad de memoria posible para luego cachesoltar el archivo en caché:

Preámbulo

Antes de hacer la prueba, puedes abrir otra ventana y un hit:

$ 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 intercambio en tiempo real.

Nota: Debe disponer de tantos discos libres en el directorio actual, tiene mem + swap

La demo
$ 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 utilizado. Esto será más significativo en una máquina realmente silenciosa.

F. Hauri
fuente
1
-1 si pudiera. Esto es a la vez (A) irrelevante para la pregunta formulada y (B) una forma horriblemente contundente de desencadenar la eliminación de caché. Existen formas directas de hacer esto último, por lo que no es defendible engañar al sistema para que cumpla enviando spam con datos hasta que se descargue como un efecto secundario
underscore_d
¡Oh Dios mío! ¡Por favor, nunca hagas eso en servidores reales!
tamerlaha
@Tamerlaha Estoy de acuerdo, pero por favor relee el primer párrafo: estás advertido, ¡no me culpes ! El objetivo de esto es mostrar la implicación del búfer / caché.
F. Hauri