(Probablemente sea un poco tarde para el OP, pero esto se pregunta con bastante frecuencia, así que lo intentaré)
free
normalmente muestra algo como esto:
total used free shared buffers cached
Mem: 8195284 8137708 57576 0 1232328 2651156
-/+ buffers/cache: 4254224 3941060
Swap: 18892216 759852 18132364
La gente tiende a mirar el Mem:
línea al tratar de averiguar cuánta memoria libre tienen. Desafortunadamente, esa línea es bastante engañosa, porque el kernel de Linux intenta hacer un uso óptimo de la memoria disponible (al menos) de esta manera:
-
Almacenará en caché los datos del subsistema de E/S (por ejemplo, el disco), para que estén disponibles si es necesario.
-
Desalojará activamente los procesos que han estado inactivos durante algún tiempo al espacio de intercambio, a favor de almacenar en caché los datos de los procesos activos. Esto tiende a favorecer el rendimiento sobre la capacidad de respuesta, por lo que algunas personas ajustan su kernel para cambiar este comportamiento.
El primer punto es fuente de confusión con respecto a free
, porque el Mem:
La línea incluye la memoria utilizada para el almacenamiento en caché en la cantidad de memoria utilizada. El núcleo, sin embargo, almacenará en caché tanto como sea posible por motivos de rendimiento. De hecho, en cualquier sistema Linux que haya estado funcionando durante algún tiempo, la memoria libre tiende a ser cercana a cero:la memoria no utilizada es memoria desperdiciada.
Sin embargo, la memoria caché puede ser liberada por el kernel si otro proceso la necesita. Si bien afectará el rendimiento de E/S hasta cierto punto, otros procesos pueden tener más memoria sin usar el espacio de intercambio . Por lo tanto, para la mayoría de los propósitos y propósitos, esa memoria es gratuita .
Por eso free
incluye una segunda línea, donde la memoria caché se considera libre:
-/+ buffers/cache: 4254224 3941060
Esta segunda línea es lo que la gente debería mirar cuando quiere saber si tiene suficiente memoria libre para un propósito determinado.
En el ejemplo anterior, según el Mem:
línea hay ~57 MB de memoria libre. Sin embargo, si uno lee la segunda línea, de hecho hay alrededor de 3,9 GB que se puede usar sin forzar el intercambio de procesos activos. Como nota al margen, también hay alrededor de 760 MB de datos de uso poco frecuente que se han intercambiado para hacer más espacio en la memoria principal para los procesos y el almacenamiento en caché.
Aproximadamente al mismo tiempo, el contenido de /proc/meminfo
:
MemTotal: 8195284 kB
MemFree: 57660 kB
Buffers: 1232352 kB
Cached: 2651156 kB
SwapCached: 119936 kB
.
.
.
MemTotal
:la memoria física disponible detectada por el kernel.
MemFree
:la memoria física no utilizada - la memoria libre que se muestra en el Mem:
línea de free
.
Buffers
:almacenamiento relativamente temporal de bloques de disco sin formato.
Cached
:caché en memoria para archivos leídos desde el disco. No incluye memoria SwapCached.
SwapCached
:memoria que una vez se intercambió, luego se intercambió nuevamente pero todavía está en el espacio de intercambio. Si es necesario, su contenido se puede descartar (¡muy rápido!), sin tener que cambiarlo (más lento).
Entonces, para tener una estimación semiprecisa de la memoria que está realmente disponible
MemFree + Buffers + Cached + SwapCached
es un buen punto de partida, y el free
muestra en esa segunda línea.
Naturalmente, la gestión de la memoria y las estadísticas y medidas relacionadas son más complicadas que esto. Los números mostrados por free
son meras estimaciones en el mejor de los casos, ya que hay muchas otras variables a tener en cuenta si desea profundizar. Para las personas que realizan regularmente la optimización del uso de la memoria, esto es casi una forma de arte.
EDITAR:
Un enlace algo humorístico sobre este "problema":
http://www.linuxatemyram.com/
EDICIÓN 2:
Para confirmar el comentario acerca de que el análisis del uso de la memoria es casi una forma de arte:
Incluso free
pierde una gran parte de los datos almacenados en caché en los sistemas Linux modernos. Desde /proc/meminfo
en mi sistema:
SReclaimable: 2253576 kB
Eso es aproximadamente 2 GB de memoria que utiliza el asignador de losa del sistema para almacenar en caché las entradas del directorio y demás, y es recuperable (es decir, puede ser borrado y utilizado por los procesos si es necesario). Sin embargo, free
no la considera memoria caché y no la ingresa en ninguno de sus cálculos y por lo tanto aparece como memoria usada.
El slabtop
La utilidad, si está disponible, permite que el administrador del sistema averigüe para qué se usa la caché de losa.
Una forma (solo para el usuario root) de tener free
mostrar el uso real de la memoria del sistema es el siguiente:
# swapoff -a
# sync
# echo 3 > /proc/sys/vm/drop_caches
# free
total used free shared buffers cached
Mem: 8195284 3181468 5013816 0 8656 228832
-/+ buffers/cache: 2943980 5251304
Swap: 0 0 0
# swapon -a
El primer comando deshabilita el espacio de intercambio. No debe emitirse si la memoria disponible no es suficiente para almacenar los datos que se han intercambiado; en ese caso, se debe tener en cuenta el Swap:
línea de libre en sus cálculos de uso de memoria.
El segundo comando empuja todos los datos almacenados en el búfer al disco. Permite liberar más memoria caché en el siguiente paso.
El tercer comando es el más importante del conjunto:obliga al kernel a descartar la mayor cantidad posible de datos almacenados en caché (caché de página, entradas de directorio, inodos, etc.).
Entonces free
finalmente muestra lo que los procesos en ejecución realmente usan en su -/+ buffers/cache:
línea. Es bastante notable que incluso después de eliminar todos los datos almacenados en caché, el kernel rápidamente comienza a almacenar en caché nuevamente; en este caso, ya alcanzó casi 250 MB de datos almacenados en caché en unos pocos segundos.
El comando final habilita el espacio de intercambio nuevamente; solo es necesario si también se usó el primer comando.
Cabe señalar que estos comandos deben ser ejecutados por el usuario root para tener los privilegios necesarios.