72 votos

En Linux, ¿cuál es la diferencia entre "buffers" y "caché" informado por el comando free?

Esta es una vieja cuestión que he visto de vez en cuando. Mi comprensión de la misma es bastante limitado (después de haber leído acerca de las diferencias hace mucho tiempo, pero la leyenda(s) involucrados en realidad nunca pegado).

Como yo lo entiendo,

  • Los búferes

    Son utilizados por los programas con activos operaciones de e/S, es decir, datos esperando a ser escrito en el disco

  • Caché

    Es el resultado de la completa de las operaciones de e/S, es decir, búferes que han salido o lectura de datos desde el disco a satisfacer una petición.

Puedo obtener una explicación clara para la posteridad?

42voto

David Spillett Puntos 18934

El "caché" total también incluirá algunas otras asignaciones de memoria, tales como tmpfs filesytems. Para ver esto en efecto trate de:

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á el "caché" valor de abandono de los 100Mb que copiado a la memoria ram basado en el sistema de ficheros (suponiendo que no fue suficiente RAM libre, usted puede encontrar que algunos de los que terminaron en el swap si la máquina ya está sobrecargado en términos de uso de memoria). El "sync; echo 3 > /proc/sys/vm/drop_caches" antes de cada llamada a free debe escribir nada pendiente en todos los buffers de escritura (sincronización) y borrar todos los caché/buffer de los bloques de disco de memoria libre así que sólo será la lectura de otras asignaciones en el "caché" de valor.

La memoria RAM utilizada por las máquinas virtuales (tales como las que se ejecutan en VMWare) también se cuentan en gratis "en caché" valor", como la memoria RAM utilizada actualmente por abrir archivos asignados en memoria.

Por lo que no es tan simple como "buffers cuenta pendiente archivo/red escribe y caché de cuenta recientemente de lectura/escrita bloques que se celebró en la RAM para salvar a las futuras lecturas físicas", aunque para la mayoría de los efectos de esta simple descripción va a hacer.

8voto

viky Puntos 343

Pregunta Difícil. Al calcular el espacio libre que realmente necesitan sumar de búfer de caché y tanto. Esto es lo que Pude encontrar

Un buffer es algo que aún no se ha "escrito" en el disco. Una caché es algo que ha sido "leer" desde el disco y se almacena para su uso posterior.

http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135

5voto

c4f4t0r Puntos 1749

Yo estaba buscando más la descripción clara acerca de búfer y me he encontrado en "Professional Linux® Kernel Architecture 2008"

Chapter 16: Page and Buffer Cache

Interaction
Setting up a link between pages and buffers serves little purpose if there are no benefits for other parts
of the kernel. As already noted, some transfer operations to and from block devices may need to be
performed in units whose size depends on the block size of the underlying devices, whereas many
parts of the kernel prefer to carry out I/O operations with page granularity as this makes things much
easier - especially in terms of memory management. 11 In this scenario, buffers act as intermediaries
between the two worlds.

2voto

F. Hauri Puntos 663

Liberar buffer/cache

Advertencia Este a explicar un fuerte método no se recomienda en el servidor de producción! Así que estás advertido, no me eches la culpa si algo sale mal.

Para la comprensión, la cosa, podría forzar su sistema para delegar como muchos memoria como sea posible a cache de soltar el archivo en caché:

Preámbulo

Antes de hacer la prueba, se puede abrir otra ventana de un golpe:

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

Nota: Se debe disponer de tantos libre en disco en el directorio actual, usted 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 esta es fuertemente utilizado. Esto será más importante en una muy tranquila de la máquina.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: