Pregunta Arriba - ¿Qué significa el tamaño de la memoria virtual? … Linux / ubuntu


Estoy corriendo top para 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 memoria virtual?

Y oh por cierto, tengo un intercambio de 1GB y muestra el 0% utilizado. Así que estoy confundido.

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


99
2018-05-04 15:37


origen


Ver: serverfault.com/questions/48582/… - Juliano


Respuestas:


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

El espacio de direcciones (es decir, la 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 que ocupa un proceso.

Pero incluso eso no es toda la respuesta. Si un proceso llama a fork (), se divide en dos partes, y ambas comparten inicialmente todo su RSS. Por lo tanto, incluso si RSS inicialmente era de 1 GB, el resultado después de la bifurcación serían dos procesos, cada uno con un RSS de 1 GB, pero solo estaría usando 1 GB de memoria.

Confundido ya? Esto es lo que realmente necesita saber: use el free ordene y verifique los resultados antes y después de iniciar su programa (en el +/- buffers/cache línea). Esa diferencia es cuanto nuevo la memoria de su programa recién iniciado utilizado.


119
2018-05-05 01:17



"Verifique los resultados antes y después de iniciar su programa", alternativamente, use USS (tamaño de conjunto único) tal como lo devolvió smem. - Hubert Kario
Entonces, ¿existe una herramienta que proporcione la verdadera cantidad de memoria que se está utilizando, herramientas que no son de terceros? - CMCDragonkai
@CMCDragonkai Sí, gratis. - deviantfan
Si empiezo un proceso java via java -Xmx16g RunLong, que reservaría 16Gb de memoria para el proceso java, luego en VIRT De arriba, parece que se cuenta el 16Gb. En este caso, ¿cuál es el tipo de esta memoria de 16 Gb, es esa memoria asignada o ...? - Eric Wang


Desde la página del manual de arriba (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 RESident (memoria física utilizada).

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

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 se asigna a la página Cero del kernel (concepto brillante, debe buscarla) para que aparezca en VIRT pero en realidad no consume memoria.


22
2018-05-04 15:43



Bueno, eso es interesante, también lo es VIRT = SWAP + RES, ¿por qué mi uso de SWAP es cero, mientras que la memoria virtual para los procesos de 2 java está cerca de 1 GB? - kapso
básicamente Top shows .... Swap: 1048568k total, 0k utilizado, 1048568k gratis, 505728k en caché - kapso
@ user42159 ¡Esta respuesta es INCORRECTA! ¡NO hay 'VIRT = SWAP + RES' en la parte superior del hombre! -m : VIRT/USED toggle Reports USED (sum of process rss and swap total count) instead of VIRT. Es una pena que no pueda bajar esta respuesta. - duleshi
Esta respuesta es incorrecta. USED ​​= Res + Swap Size (desde la parte superior de Fields Management, se accede presionando la tecla f cuando se encuentra en la parte superior. También desde la página principal). - Jason S


encontré esto explicación de Mugurel Sumanariu muy claro:

VIRT representa el tamaño virtual de un proceso, que es la suma de   memoria que realmente está usando, memoria que se ha mapeado en sí misma (para   En la memoria RAM de la tarjeta de video para el servidor X), los archivos en el disco   se han asignado en él (sobre todo bibliotecas compartidas), y la memoria   Compartido con otros procesos. VIRT representa la cantidad de memoria que   El programa es capaz de acceder en el momento presente.

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

SHR indica 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 es residente. Por ejemplo, si solo un programa   utiliza algunas funciones en una biblioteca, toda la biblioteca está asignada y   se contabilizarán en VIRT y SHR, pero solo en las partes de la biblioteca   El archivo que contiene las funciones que se están utilizando se cargará en realidad.   y ser contabilizado bajo RES.


8
2018-01-27 17:53





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

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


5
2018-05-04 15:41



Gracias, me preocupé y me confundí, porque mientras el uso del intercambio era del 0%, la columna de memoria virtual es muy alta. ¿Y también tengo solo 1,7 GB del total de 2,7 GB de memoria física utilizada, mientras que la memoria virtual es alta? - kapso


Linux admite memoria virtual, es decir, utiliza 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 se pueda utilizar para otro propósito. Cuando se necesitan nuevamente los contenidos originales, se vuelven a leer en la memoria. Todo esto se hace completamente transparente para el usuario; los programas que se ejecutan bajo Linux solo ven la mayor cantidad de memoria disponible y no se dan cuenta de que parte de ellos residen en el disco de vez en cuando. Por supuesto, leer y escribir en el disco duro es más lento (del orden de mil veces más lento) que usar la 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, debería ir a una partición de intercambio, pero si no está seguro, puede usar un archivo de intercambio primero, use el sistema por un tiempo para poder 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 extra 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 suele distinguir entre el intercambio (escribir todo el proceso para intercambiar espacio) 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 de intercambio de todos modos.

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


2
2018-05-04 15:43



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 swap). - David Schwartz


VIRtual La columna de la parte superior, se refiere al superespacio (espacio de superconsumo) del proceso, que tal vez el proceso no se esté realizando en el tiempo de ejecución. Hay otra columna RESident, que se refiere a la memoria / espacio físico real asignado por el proceso, en el tiempo de ejecución.

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

Referir para Más información


2
2018-02-26 14:27





"VIRT" solo espacio de direcciones, 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 al restar SHR de RES se obtiene la cantidad de memoria que realmente se puede atribuir a este proceso en particular.


0
2018-04-18 23:03