tutorial solucion memoria maquina aumentar java linux unix memory-management

java - solucion - visualvm download



Quiere saber si hay suficiente memoria libre en una máquina Linux para implementar una nueva aplicación (1)

(Es probable que 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 la línea Mem: cuando intentan 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 en (al menos) estas formas:

  • Cacheará los datos del subsistema de E / S (por ejemplo, el disco), de modo que estará disponible si es necesario.

  • Desalojará activamente los procesos que han estado inactivos durante un tiempo en el espacio de intercambio, a favor de almacenar datos en caché para 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 la fuente de confusión con respecto a la free , porque la línea Mem: incluye la memoria utilizada para el almacenamiento en memoria caché en la cantidad de memoria utilizada. El kernel, sin embargo, guardará la mayor cantidad de memoria posible por razones de rendimiento. De hecho, en cualquier sistema Linux que haya estado activo durante algún tiempo, la memoria libre tiende a ser cercana a cero: la memoria no utilizada es memoria desperdiciada.

La memoria caché, sin embargo, puede ser liberada por el núcleo si es necesario por otro proceso. Si bien tendrá un impacto en 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, esa memoria es gratuita .

Es por eso que free incluye una segunda línea, donde la memoria caché se considera libre:

-/+ buffers/cache: 4254224 3941060

Esta segunda línea es lo que las personas deberían estar mirando cuando quieren saber si tienen suficiente memoria libre para un determinado propósito.

En el ejemplo anterior, de acuerdo con la línea Mem: hay ~ 57 MB de memoria libre. Sin embargo, si uno lee la segunda línea, hay aproximadamente 3,9 GB que se pueden usar sin forzar a los procesos activos a intercambiar. Como nota al margen, también hay cerca de 760 MB de datos poco utilizados que se han intercambiado, para tener más espacio en la memoria principal para los procesos y el almacenamiento en caché.

Casi al mismo tiempo, los contenidos 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 la línea Mem: free .

Buffers : almacenamiento relativamente temporal de bloques de disco sin formato.

Cached : memoria caché en memoria para archivos leídos desde el disco. No incluye la memoria SwapCached.

SwapCached : memoria que se intercambió una vez, luego se cambió nuevamente pero aún está en el espacio de intercambio. Si es necesario, sus contenidos pueden descartarse (¡muy rápido!), Sin tener que cambiarlos (más despacio).

Por lo tanto, para tener una estimación semi-precisa de la memoria que está realmente disponible

MemFree + Buffers + Cached + SwapCached

es un buen punto de partida, y el que se muestra free en esa segunda línea.

Naturalmente, la administración de memoria y las estadísticas y mediciones relacionadas son más complicadas que esto. Las cifras que se muestran de forma 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 cómico sobre este "problema":

http://www.linuxatemyram.com/

EDICION 2:

Para confirmar el comentario sobre el uso de la memoria, el análisis es casi una forma de arte:

Incluso free errores se pierde una gran parte de los datos en caché en los sistemas Linux modernos. De /proc/meminfo en mi sistema:

SReclaimable: 2253576 kB

Eso es aproximadamente 2 GB de memoria que utiliza el asignador de slab sistema para el almacenamiento en caché de las entradas de directorio y demás, y es recuperable (es decir, los procesos lo pueden borrar y usar si es necesario). Sin embargo, free no lo considera memoria caché y no lo ingresa en ninguno de sus cálculos y, por lo tanto, aparece como memoria utilizada.

La utilidad de slabtop , si está disponible, permite que el administrador del sistema descubra para qué se utiliza la memoria caché de slab .

Una forma (para el usuario root solamente) de mostrar free el uso real de la memoria del sistema es la 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 desactiva el espacio de intercambio. No debe emitirse si la memoria disponible puede no ser suficiente para contener los datos que se han intercambiado; en ese caso, hay que tener en cuenta la línea Swap: gratuita en sus cálculos de uso de memoria.

El segundo comando empuja todos los datos almacenados en el 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 de datos almacenados en caché (caché de página, entradas de directorio, inodos, etc.).

Then free muestra finalmente lo que los procesos en ejecución realmente usan en su línea -/+ buffers/cache: . Es bastante notorio que incluso después de descartar todos los datos almacenados en caché, el kernel comienza a almacenar en caché rápidamente; en este caso, ya alcanzó casi 250 MB de datos almacenados en caché en pocos segundos.

El comando final habilita nuevamente el espacio de intercambio; solo es necesario si también se utilizó el primer comando.

Debe tenerse en cuenta que estos comandos deben ser ejecutados por el usuario raíz para tener los privilegios necesarios.

Tengo una máquina Linux cuya instantánea de memoria cuando hago / proc / meminfo es:

MemTotal: 16413388 kB **MemFree: 48296 kB** Buffers: 193600 kB Cached: 1986448 kB SwapCached: 874512 kB Active: 15034264 kB Inactive: 713672 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 16413388 kB LowFree: 48296 kB SwapTotal: 8385920 kB SwapFree: 4682408 kB Dirty: 3124 kB Writeback: 0 kB Mapped: 13005560 kB Slab: 257784 kB CommitLimit: 16592612 kB Committed_AS: 59624324 kB PageTables: 233748 kB VmallocTotal: 536870911 kB VmallocUsed: 267064 kB VmallocChunk: 536603555 kB HugePages_Total: 0 HugePages_Free: 0 Hugepagesize: 2048 kB

Esta es una máquina de 16 GB y tengo una aplicación Java para implementar en este que tendrá 3 instancias de jvm y el requisito de memoria típica combinada para ellos será cercana a 1 GB.

Quería saber si será seguro implementar esa aplicación sin afectar otras aplicaciones que se ejecutan actualmente en esa máquina. Al mirar la instantánea de memoria anterior, ¿podemos averiguarlo?

¿Qué otras estadísticas me ayudarán a decidir eso y cómo recopilar esas estadísticas?