¿Qué significa el tamaño de la memoria virtual en la parte superior?

124

Estoy corriendo toppara monitorear el rendimiento de mi servidor y 2 de mis procesos java muestran una memoria virtual de hasta 800MB-1GB. ¿Es eso algo malo?

¿Qué significa la memoria virtual?

Y, por cierto, tengo un intercambio de 1 GB y muestra un 0% de uso. Entonces estoy confundido.

Proceso Java = 1 servidor Tomcat + mi propio servidor java daemon = Ubuntu 9.10 (kármico)

kapso
fuente

Respuestas:

142

La memoria virtual ni siquiera es necesariamente memoria. Por ejemplo, si una memoria de proceso asigna un archivo grande, el archivo se almacena realmente en el disco, pero aún ocupa "espacio de direcciones" en el proceso.

El espacio de direcciones (es decir, memoria virtual en la lista de procesos) no cuesta nada; No es real. Lo que es real es la columna RSS (RES), que es la memoria residente. Esa es la cantidad de memoria real que ocupa un proceso.

Pero incluso esa no es la respuesta completa. Si un proceso llama a fork (), se divide en dos partes, y ambas inicialmente comparten todos sus RSS. Entonces, incluso si RSS era inicialmente de 1 GB, el resultado después de la bifurcación sería dos procesos, cada uno con un RSS de 1 GB, pero aún estaría usando 1 GB de memoria.

Confundido todavía? Esto es lo que realmente necesita saber: use el freecomando y verifique los resultados antes y después de iniciar su programa (en +/- buffers/cachelínea). Esa diferencia es la cantidad de nueva memoria utiliza su programa iniciado recientemente.

Apenwarr
fuente
2
"Verifique los resultados antes y después de iniciar su programa", alternativamente, use USS (Tamaño de conjunto único) tal como lo devuelve smem.
Hubert Kario
Entonces, ¿existe una herramienta que proporcione la verdadera cantidad de memoria utilizada, herramientas que no son de terceros?
CMCDragonkai
@CMCDragonkai Sí, gratis.
deviantfan
1
Si inicio un proceso de Java a través de java -Xmx16g RunLong, que reservaría 16Gb de memoria para el proceso de Java, entonces, en la VIRTparte superior, parece que se cuentan los 16Gb. En este caso, ¿cuál es el tipo de esta memoria de 16 Gb, es esa memoria asignada o ...?
Eric Wang
1
@EricWang, esa memoria no está asignada. Es solo una solicitud al sistema operativo para reservar memoria que puede ser necesaria más tarde (tal vez nunca). (Al menos) en Linux, esta es una llamada mmap con los indicadores MAP_NORESERVE y PROT_NONE (vea os :: pd_reserve_memory llama a anon_mmap: github.com/AdoptOpenJDK/openjdk-jdk11u/blob/… ); en realidad no se asigna memoria por defecto, eso solo se hace más tarde en el momento en que el programa realmente necesita la memoria para satisfacer las solicitudes de asignación de objetos.
Juraj Martinka
23

Desde la página de manual superior (1):

o: VIRT  --  Virtual Image (kb)
      The  total  amount  of  virtual  memory  used  by the task.  It
      includes all code, data and shared libraries  plus  pages  that
      have been swapped out.

      VIRT = SWAP + RES.

Donde RES significa memoria RESIDENTE (memoria física utilizada).

En realidad eso no es correcto (más). Cuando dice "swap", eso también incluye archivos que el programa ha asignado a su espacio de direcciones, que pueden o no estar consumiendo RAM real todavía. Esta memoria está respaldada por archivos pero no es realmente intercambiable.

VIRT también incluye páginas que se han asignado pero que aún no se han utilizado para nada. Cualquier página en este estado está asignada a la página cero del núcleo (concepto brillante, debe buscarla) para que aparezca en VIRT pero en realidad no consume memoria.

anfetamaquina
fuente
2
bueno, eso es interesante, también lo es VIRT = SWAP + RES, ¿cómo es que mi uso de SWAP es cero, mientras que la memoria virtual para los 2 procesos de Java está cerca de 1GB?
kapso
básicamente Top shows .... Intercambio: 1048568k total, 0k usado, 1048568k gratis, 505728k en caché
kapso
15
@ user42159 ¡Esta respuesta es INCORRECTA! ¡NO hay 'VIRT = SWAP + RES' en man top! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT. Es una pena que no pueda rechazar esta respuesta.
duleshi el
3
Esta respuesta es incorrecta. USED ​​= Res + Swap Size (desde la parte superior Administración de campos, al que se accede presionando la tecla f cuando está en la parte superior. También desde la página de manual superior).
Jason S
15

Esta explicación de Mugurel Sumanariu me pareció muy clara:

VIRTrepresenta el tamaño virtual de un proceso, que es la suma de la memoria que realmente está usando, la memoria que se ha asignado a sí misma (por ejemplo, la RAM de la tarjeta de video para el servidor X), los archivos en el disco que se han asignado a ella (la mayoría especialmente bibliotecas compartidas) y memoria compartida con otros procesos. VIRT representa la cantidad de memoria que el programa puede acceder en el momento presente.

RESrepresenta el tamaño del residente, que es una representación precisa de la cantidad de memoria física real que consume un proceso. (Esto también corresponde directamente a la columna% MEM.) Esto prácticamente siempre será menor que el tamaño VIRT, ya que la mayoría de los programas dependen de la biblioteca C.

SHRindica cuánto del tamaño de VIRT es realmente compartible (memoria o bibliotecas). En el caso de las bibliotecas, no significa necesariamente que toda la biblioteca sea residente. Por ejemplo, si un programa solo usa algunas funciones en una biblioteca, toda la biblioteca se asigna y se contará en VIRT y SHR, pero solo las partes del archivo de biblioteca que contiene las funciones que se están utilizando se cargarán y se contarán bajo RES.

Franck Dernoncourt
fuente
Tal vez solo volvería a redactar "VIRT representa la cantidad de memoria a la que el programa puede acceder en este momento". a algo como "VIRT representa el tamaño de todo el espacio direccionable del programa en el momento actual". OK, eso todavía podría usar esmalte. Pero el punto es, "cuánta memoria" aún puede dar la impresión de que estamos discutiendo RAM, cuando VIRT no tiene nada que ver con el espacio RAM. De hecho, los programas grandes a menudo tendrán un tamaño de VIRT que es MÚLTIPLES del tamaño total de RAM del sistema, porque ese VIRT es casi completamente regiones de direcciones respaldadas por archivos (también conocido como "disco no RAM").
FeRD
5

La columna VIRT en la salida ps / top es casi irrelevante para medir el uso de memoria. No te preocupes por eso. Apache VIRT de carga pesada vs memoria RES

https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

leonbloy
fuente
Gracias, me preocupé y confundí, porque si bien el uso de intercambio fue del 0%, la columna de memoria virtual es muy alta. ¿Y también tengo solo 1.7GB de la memoria física total de 2.7GB utilizada, mientras que la memoria virtual es alta?
kapso
2

Linux admite memoria virtual, es decir, usar un disco como una extensión de RAM para que el tamaño efectivo de la memoria utilizable crezca de manera correspondiente. El kernel escribirá el contenido de un bloque de memoria no utilizado actualmente en el disco duro para que la memoria pueda usarse para otro propósito. Cuando los contenidos originales se necesitan nuevamente, se vuelven a leer en la memoria. Todo esto se hace completamente transparente para el usuario; los programas que se ejecutan en Linux solo ven la mayor cantidad de memoria disponible y no notan que partes de ellos residen en el disco de vez en cuando. Por supuesto, leer y escribir el disco duro es más lento (del orden de mil veces más lento) que usar memoria real, por lo que los programas no se ejecutan tan rápido. La parte del disco duro que se utiliza como memoria virtual se denomina espacio de intercambio.

Linux puede usar un archivo normal en el sistema de archivos o una partición separada para el espacio de intercambio. Una partición de intercambio es más rápida, pero es más fácil cambiar el tamaño de un archivo de intercambio (no es necesario volver a particionar todo el disco duro y posiblemente instalar todo desde cero). Cuando sepa cuánto espacio de intercambio necesita, debe optar por una partición de intercambio, pero si no está seguro, puede usar primero un archivo de intercambio, use el sistema por un tiempo para que pueda tener una idea de cuánto intercambio necesita, y luego haga una partición de intercambio cuando esté seguro de su tamaño.

También debe saber que Linux le permite a uno usar varias particiones de intercambio y / o archivos de intercambio al mismo tiempo. Esto significa que si solo ocasionalmente necesita una cantidad inusual de espacio de intercambio, puede configurar un archivo de intercambio adicional en esos momentos, en lugar de mantener la cantidad total asignada todo el tiempo.

Una nota sobre la terminología del sistema operativo: la informática generalmente distingue entre el intercambio (escribir todo el proceso en el espacio de intercambio) y la paginación (escribir solo partes de tamaño fijo, generalmente unos pocos kilobytes, a la vez). La paginación suele ser más eficiente, y eso es lo que hace Linux, pero la terminología tradicional de Linux habla sobre el intercambio de todos modos.

Fuente: http://www.faqs.org/docs/linux_admin/x1752.html

usuario42198
fuente
1
Esta respuesta difunde la idea errónea de que la memoria virtual es lo mismo que el intercambio o la paginación. Usar el disco como una extensión de RAM es anterior a la memoria virtual. Y hay muchos sistemas (como la mayoría de los enrutadores SoHo) que tienen memoria virtual pero no usan el disco como una extensión de RAM. (Y esta tampoco es la respuesta a la pregunta del OP, ya que no está usando ningún intercambio).
David Schwartz
2

VIRtualcolumna de la parte superior, se refiere al súper espacio (espacio de súper consumo) del proceso, que el proceso podría no estar realmente tomando en el tiempo de ejecución. Hay otra columna RESident, que se refiere a la memoria física / espacio real asignado por el proceso, en el tiempo de ejecución.

El motivo de la diferencia, entre los dos, puede entenderse con el ejemplo: si el proceso está utilizando cierta biblioteca, entonces el tamaño de la biblioteca también ayudará a la virtual-size. sin embargo, dado que solo se usaría una parte de la biblioteca (es decir, algunos métodos en uso), por lo que ayudará resident-size.

Consulte para más información

parasitar
fuente
0

"VIRT" solo direcciona el espacio, RES es la memoria "real", pero la cantidad "SHR" (= compartida) de "RES" es la parte de RES que se comparte con otros procesos. Entonces, para la mayoría de los procesos, creo que restando SHR de RES le da la cantidad de memoria que realmente es atribuible a este proceso en particular.

Max
fuente