Comprender el uso de memoria virtual> intercambio + físico en Linux

9

Tengo un proceso que informa en la parte superior que tiene 6 GB de memoria residente y 70 GB de memoria virtual asignada. Lo extraño es que este servidor en particular solo tiene 8 GB físicos y 35 GB de espacio de intercambio disponible.

Del manual 'superior':

   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. (Note: you can define the STATSIZE=1 environment  vari-
      able  and  the VIRT will be calculated from the /proc/#/state VmSize
      field.)

      VIRT = SWAP + RES.

Dada esta explicación, esperaría que la asignación de memoria virutal para un proceso se limite a mi intercambio + memoria física disponible.

Según 'pmap', el código, la biblioteca compartida y las secciones de memoria compartida de este proceso son mínimas, no más de 300M más o menos.

Obviamente, la máquina y el proceso siguen funcionando correctamente (aunque lentamente), entonces, ¿qué me estoy perdiendo aquí?

Barriga
fuente

Respuestas:

9

Puede ser demanda cero memoria que no está en RAM física, o en el archivo de paginación.

Algunos recursos que quizás desee ver:

¿Su aplicación crea muchas páginas de memoria vacía? Si es así, su aplicación podría beneficiarse enormemente de:

Le permite comprimir y descomprimir en páginas de memoria en tiempo real. A su vez, puede mantener todo en la RAM en lugar de cambiarlo al disco ( muy lento ).

El conserje de Unix
fuente
Sí, la aplicación está haciendo muchas correlaciones en el espacio IPV4, por lo que podría tener muchas páginas vacías dependiendo de la distribución del tráfico. Tendremos que tener cuidado con eso. ¡Gracias!
Vientre
encantado de ayudar, espero que algún otro usuario me marque. Me encontrar respuestas asesinas pero tengo una calificación de 1.266 :-( No creo que los usuarios de errores del servidor como yo hahhah.
El conserje Unix
1
Pocas razones por las cuales la gente no puede votar por usted: 1. Formateo de su respuesta --- use marcado. 2. Su nombre de usuario parece genérico. 3. Lo más importante: el hecho de que lo encuentra lo suficientemente importante como para comentar al respecto. Deja un sabor agrio en la boca de las personas.
Belmin Fernández
@ user37899 Los votos a favor tienden a clasificarse en 3 categorías: qué tan informativa es la respuesta, qué tan bien formateada y fácil de leer es, y qué tan popular es la pregunta. Trabajaría en su formateo, pero también debe tener un poco de zen y darse cuenta de que algunas respuestas fantásticas se encuentran en el sitio con solo un voto positivo: la popularidad de una pregunta es el factor con mayor efecto.
Jeff Ferland
1
Hice un poco de formateo. Espero que ayude je.
Belmin Fernández
2

Aquí hay una discusión de virt vs. memoria residente:

/programming/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

La discusión se refiere a los procesos de Java, pero es aplicable a cualquier cosa que se ejecute en Linux. El punto principal con respecto a virt es que el total incluye un montón de cosas que nunca se pueden usar. Virt es algo a tener en cuenta para los sistemas operativos de 32 bits (ya que los procesos alcanzarán límites en el espacio direccionable), pero de otra manera no es útil. Como se señaló, lo que debe prestarse atención es la memoria residente, que se limitará a la RAM física disponible y su intercambio.

cjc
fuente
en realidad preguntó por qué la memoria virtual asignada era más grande que su memoria física + espacio de intercambio ...
The Unix Janitor
Sí, y la discusión en Stackoverflow habla sobre cómo es posible.
cjc
1

Esto es probable porque el espacio de direcciones del proceso es del tamaño que usted indicó, pero el sistema operativo no lo asigna realmente.

De: http://lwn.net/Articles/428100/

En el proceso de tratar de alcanzar ese objetivo de "sobrecarga lo suficientemente baja y sin latencia significativa", los desarrolladores de Go han hecho algunas suposiciones simplificadoras, una de las cuales es que la memoria que se administra para una aplicación en ejecución proviene de una sola, prácticamente contigua rango de direcciones Tales suposiciones pueden encontrarse con el mismo problema que su editor encontró con vi: otro código puede asignar piezas en el medio del rango, por lo que los desarrolladores de Go adoptaron la misma solución: simplemente asignan toda la memoria que creen que podrían necesitar (pensaron, razonablemente, que 16 GB deberían ser suficientes en un sistema de 64 bits) en el momento del inicio.

Entonces, esa es la manera poco elegante de administrar la memoria a veces: tener un espacio de direcciones continuo simplifica la liberación de mem no utilizados.

MichaelS
fuente
0

La respuesta es probablemente MMAP: los datos están en el disco, pero están "fuera" del intercambio y no se pueden ver con el comando "libre" o "superior".

Si el proceso de Java no es demasiado complicado, puedes intentar jugar con "lsof" para encontrar dónde está el archivo MMAP. Sin embargo, si este proceso de Java es complicado, será difícil ser visto.

Mella
fuente
-1

También me sorprendió que Linux le permita asignar más memoria virtual de la que hay memoria física + espacio de intercambio, pero aparentemente ayuda al rendimiento en situaciones típicas.

Afortunadamente, hay un parámetro de ajuste del núcleo que se puede usar para cambiar el modo de contabilidad de memoria. Este parámetro es vm.overcommit_memory e indica qué algoritmo se usa para rastrear la memoria disponible. El valor predeterminado (0) usa el método heurístico y sobrecompite el sistema de memoria virtual. Si desea que sus programas reciban los errores apropiados de falta de memoria en la asignación en lugar de someter sus procesos a ejecuciones aleatorias, debe establecer este parámetro en 2.

http://www.linuxjournal.com/article/10678

John Velonis
fuente
Esto es totalmente confuso. El exceso de compromiso no es lo que le permite asignar más memoria virtual que memoria física más espacio de intercambio. Podrías hacerlo incluso sin comprometerte demasiado. (Por ejemplo, en una máquina con 2 GB de RAM, sin intercambio, y sin overcommit, todavía se puede asignar una memoria de 4 GB de archivos de sólo lectura, el uso de 4 GB de memoria virtual.)
David Schwartz