¿Cuál es la diferencia entre el búfer y la memoria caché en Linux?

179

Para mí no está claro cuál es la diferencia entre los dos conceptos de memoria de Linux: buffery cache. He leído esta publicación y me parece que la diferencia entre ellos es la política de vencimiento:

  1. la política del búfer es primero en entrar, primero en salir
  2. La política de caché es la menos utilizada recientemente.

Estoy en lo cierto?

En particular, estoy mirando los dos comandos: freeyvmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859
James.Xu
fuente
Debería darnos más contexto, ambos términos se usan con diferentes significados. ¿Te refieres a la freesalida del comando?
leonbloy
3
tienes razón, estoy mirando los dos comandos: gratis, vmstat. ver mis actualizaciones
James.Xu
1
También puede visitar unix.stackexchange.com
leonbloy

Respuestas:

69

Los "buffers" representan la cantidad de RAM dedicada a los bloques de disco de caché. "En caché" es similar a "Buffers", solo que esta vez almacena en caché páginas de la lectura de archivos.

cita de:

Seth Robertson
fuente
3
He probado esto usando un programa simple de Python que escribe grandes cantidades de bloques. Lo que sucede es que cachese llena como se informa free -w -h, no la bufferscolumna. Creo que la cachecolumna cuenta tanto las escrituras de disco como las lecturas de disco y buffersse usa para otra cosa.
CMCDragonkai
@CMCDragonkai gracias por la evidencia experimental. La pregunta interesante es si estaba escribiendo más rápido de lo que el disco podría vaciar. (p. ej., la sincronización llevaría mucho tiempo), lo que nos indicaría si los bloques sucios se cuentan de manera diferente a los limpios. Linux ciertamente almacenará en caché ambos tipos (lru como se menciona en la pregunta), pero uno es mucho más serio en términos de presión de memoria.
Seth Robertson
179

Los buffers están asociados con un dispositivo de bloque específico y cubren el almacenamiento en caché de los metadatos del sistema de archivos, así como el seguimiento de las páginas en vuelo. El caché solo contiene datos de archivos estacionados. Es decir, los búferes recuerdan qué hay en los directorios, qué permisos de archivo tienen y realizan un seguimiento de qué memoria se está escribiendo o leyendo para un dispositivo de bloque en particular. El caché solo contiene el contenido de los propios archivos.

enlace de cita

xoy
fuente
1
Corto y bien explicado. Gracias.
curioso
84

Respuesta citada (para referencia):

Respuesta corta: en caché es el tamaño del caché de la página. Buffers es el tamaño de los buffers de E / S de bloque en memoria. Asuntos en caché; Buffers es en gran medida irrelevante.

Respuesta larga: en caché es el tamaño de la memoria caché de la página de Linux, menos la memoria en la memoria caché de intercambio, que está representada por SwapCached (por lo tanto, el tamaño total de la memoria caché de la página es en caché + SwapCached). Linux realiza todas las E / S de archivos a través de la memoria caché de la página. Las escrituras se implementan simplemente marcando como sucias las páginas correspondientes en el caché de páginas; los hilos del enjuagador luego vuelven a escribir periódicamente en el disco las páginas sucias. Las lecturas se implementan devolviendo los datos del caché de la página; Si los datos aún no están en el caché, primero se rellenan. En un sistema Linux moderno, el almacenamiento en caché puede ser fácilmente de varios gigabytes. Se reducirá solo en respuesta a la presión de la memoria. El sistema purgará la memoria caché de la página junto con el intercambio de datos en el disco para que haya más memoria disponible según sea necesario.

Las memorias intermedias son memorias intermedias de bloque de E / S en memoria. Son relativamente de corta duración. Antes de la versión 2.4 del kernel de Linux, Linux tenía cachés de página y búfer separados. Desde 2.4, la página y la memoria caché del búfer están unificadas y las memorias intermedias son bloques de disco sin procesar no representados en la memoria caché de la página, es decir, no datos de archivo. La métrica Buffers es, por lo tanto, de importancia mínima. En la mayoría de los sistemas, Buffers es a menudo solo decenas de megabytes.

socketpair
fuente
77
"Buffers es en gran medida irrelevante" - No. Hay muchos casos en los que el almacenamiento en caché de contenido de archivos es irrelevante, pero mantener los metadatos en caché acelera las cosas. Un servidor NAS de transmisión de video, por ejemplo.
Gunther Piez
Cualquier sistema que realice muchas E / S utilizará mucha memoria para los buffers. Estoy cargando en masa una base de datos MySQL / InnoDB de 100 GB y los búferes superan los 2 GB todo el tiempo.
Marcelo Pacheco
21

No es "tan simple" como esto, pero podría ayudar a entender:

Buffer es para almacenar metadatos de archivos (permisos, ubicación, etc.). Cada página de memoria se mantiene aquí.

La memoria caché es para almacenar el contenido real del archivo.

n00ber
fuente
55
IOW, Buffer = Metadata; Caché = Datos;
Freedom_Ben
13

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 utilizará 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 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ían en el futuro cercano. El 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 disponible libre, el núcleo ejecutará heurística para reclamar la memoria almacenando los datos del 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
12

búfer y caché.

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.

ChaiZhi
fuente
2
nuevo consejo para el usuario: haga que su respuesta se relacione lo más claramente posible con la pregunta. Si yo fuera usted, agregaría a su respuesta una sección que comienza con "Entonces, con su ejemplo ..." y profundizaría un poco en eso.
Piotr Wadas
25
No creo que esta respuesta sea verdadera en el mismo contexto que el de la pregunta (a saber, qué quiere decir el núcleo de Linux con "búfer" y "caché"
Freedom_Ben
8

Creo que esta página ayudará a comprender profundamente la diferencia entre el búfer y el caché. http://www.tldp.org/LDP/sag/html/buffer-cache.html

La lectura desde un disco es muy lenta en comparación con el acceso a la memoria (real). Además, es común leer la misma parte de un disco varias veces durante períodos de tiempo relativamente cortos. Por ejemplo, primero se puede leer un mensaje de correo electrónico, luego leer la carta en un editor al responder, y luego hacer que el programa de correo lo lea nuevamente al copiarlo en una carpeta. O considere con qué frecuencia el comando lsse puede ejecutar en un sistema con muchos usuarios. Al leer la información del disco solo una vez y luego guardarla en la memoria hasta que ya no sea necesaria, se puede acelerar todo menos la primera lectura. Esto se denomina almacenamiento en búfer de disco, y la memoria utilizada para este fin se denomina caché de almacenamiento intermedio.

Dado que, desafortunadamente, la memoria es un recurso limitado, es decir, escaso, la memoria caché del búfer generalmente no puede ser lo suficientemente grande (no puede contener todos los datos que uno quiera usar). Cuando el caché se llena, los datos que no se han utilizado durante más tiempo se descartan y la memoria liberada se usa para los nuevos datos.

El almacenamiento en búfer de disco también funciona para escrituras. Por un lado, los datos que se escriben a menudo se vuelven a leer pronto (por ejemplo, un archivo de código fuente se guarda en un archivo, luego el compilador lo lee), por lo que es una buena idea poner los datos que se escriben en el caché. Por otro lado, al solo poner los datos en la memoria caché, no escribirlos en el disco a la vez, el programa que escribe se ejecuta más rápido. Las escrituras se pueden hacer en segundo plano, sin ralentizar los otros programas.

Eric
fuente
Esto explica qué es el caché del búfer, pero no cuál es la diferencia entre el búfer y el caché en las salidas de vmstat y los comandos libres.
Roel Schroeven
4

Link 2 de Seth Robertson dijo "Para una comprensión profunda de esos términos, consulte el libro del kernel de Linux como Linux Kernel Development de Robert M. Love".

Encontré algunos contenidos sobre 'buffer' en la segunda edición del libro.

Aunque el dispositivo físico en sí es direccionable a nivel de sector, el núcleo realiza todas las operaciones de disco en términos de bloques.

Cuando un bloque se almacena en la memoria (por ejemplo, después de una lectura o una escritura pendiente), se almacena en un "búfer". Cada 'buffer' está asociado con exactamente un bloque. El 'buffer' sirve como el objeto que representa un bloque de disco en la memoria.

Un 'buffer' es la representación en memoria de un solo bloque de disco físico.

Las operaciones de bloque de E / S manipulan un solo bloque de disco a la vez. Una operación de E / S de bloque común es leer y escribir inodos. El núcleo proporciona la función bread () para realizar una lectura de bajo nivel de un solo bloque del disco. A través de 'buffers', los bloques de disco se asignan a sus páginas en memoria asociadas. "

Chao Yin
fuente
2

Buffer contiene metadatos que ayudan a mejorar el rendimiento de escritura

La memoria caché contiene el contenido del archivo en sí (a veces aún no se ha escrito en el disco) que mejora el rendimiento de lectura

karthik
fuente
1

Cita del libro: Introducción a la recuperación de información

Cache

Queremos mantener tantos datos como sea posible en la memoria, especialmente aquellos datos a los que necesitamos acceder con frecuencia. Llamamos a la técnica de mantener datos de disco de uso frecuente en la memoria caché principal.

Buffer

Los sistemas operativos generalmente leen y escriben bloques enteros. Por lo tanto, leer un solo byte del disco puede llevar tanto tiempo como leer todo el bloque. Los tamaños de bloque de 8, 16, 32 y 64 kilobytes (KB) son comunes. Llamamos a la parte de la memoria principal donde un bloque que se lee o escribe se almacena un búfer.

yantaq
fuente
0

Un búfer es una región de la memoria que se usa para retener temporalmente los datos mientras se mueve de un lugar a otro dentro de una computadora. Mientras que un caché es un área de almacenamiento temporal donde los datos a los que se accede con frecuencia se pueden almacenar para un acceso rápido. Una vez que los datos se almacenan en la memoria caché, se puede hacer un uso futuro accediendo a la copia en caché en lugar de recuperar los datos originales, de modo que el tiempo de acceso promedio sea más corto.

Abigail
fuente