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í?
fuente
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.
fuente
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/
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.
fuente
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.
fuente
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.
http://www.linuxjournal.com/article/10678
fuente