RSS es el tamaño de conjunto residente y se utiliza para mostrar cuánta memoria se asigna a ese proceso y está en la RAM. No incluye la memoria que se intercambia. Incluye memoria de bibliotecas compartidas siempre que las páginas de esas bibliotecas estén realmente en memoria. Incluye toda la memoria de pila y montón.
VSZ es el tamaño de la memoria virtual. Incluye toda la memoria a la que puede acceder el proceso, incluida la memoria intercambiada, la memoria asignada pero no utilizada y la memoria que proviene de bibliotecas compartidas.
Entonces, si el proceso A tiene un binario de 500K y está vinculado a 2500K de bibliotecas compartidas, tiene 200K de asignaciones de pila / montón de las cuales 100K está realmente en la memoria (el resto está intercambiado o sin usar), y solo ha cargado 1000K de las bibliotecas compartidas y 400K de su propio binario entonces:
Dado que parte de la memoria se comparte, muchos procesos pueden usarla, por lo que si suma todos los valores RSS, puede terminar fácilmente con más espacio del que tiene su sistema.
La memoria asignada también puede no estar en RSS hasta que el programa la use realmente. Entonces, si su programa asignó una gran cantidad de memoria por adelantado, luego la usa con el tiempo, podría ver que RSS sube y VSZ se mantiene igual.
También hay PSS (tamaño de conjunto proporcional). Esta es una medida más nueva que rastrea la memoria compartida como una proporción utilizada por el proceso actual. Entonces, si hubo dos procesos que usaban la misma biblioteca compartida de antes:
Todos los subprocesos comparten el mismo espacio de direcciones, por lo que RSS, VSZ y PSS para cada subproceso son idénticos a todos los otros subprocesos en el proceso. Use ps o top para ver esta información en linux / unix.
Hay mucho más que esto, para obtener más información, consulte las siguientes referencias:
Creo RSS hace incluir una memoria de las bibliotecas de enlace dinámico. Si se utilizan 3 procesos libxml2.so, la biblioteca compartida se contará en cada uno de sus RSS, por lo que la suma de sus RSS será mayor que la memoria real utilizada.
nfm
1
Eso es correcto. He arreglado mi respuesta, gracias por el aviso.
jmh
Estoy en ubuntu 16.04, y hay un proceso java que tiene 1.2G RES y 4.5G VIRT mostrando desde el topcomando. Este sistema no tiene ningún intercambio, swapon --showno devuelve nada. ¿Cómo explicas esto? Si vsz es intercambio + bibliotecas compartidas, en este caso, ¿las bibliotecas compartidas tienen más de 3.3G? ¿Es posible? Realmente confundido ...
Aaron Wang
No estoy realmente seguro. Eche un vistazo a esta respuesta sobre el uso de la memoria virtual Java: stackoverflow.com/a/561450/622115 . Versión corta: VSZ puede incluir espacio de almacenamiento dinámico asignado y no utilizado, así como archivos asignados a memoria.
jmh
Excelente. Solo agrega algo. si usa malloc (100 KB), solo use 1 KB en realidad. El rss es 1K y vsz es 100K, incluso si no hay intercambio aquí.
keniee van
53
RSS es Tamaño de conjunto residente (memoria físicamente residente; actualmente está ocupando espacio en la memoria física de la máquina), y VSZ es Tamaño de memoria virtual (espacio de direcciones asignado: tiene direcciones asignadas en el mapa de memoria del proceso, pero no necesariamente hay ninguna memoria real detrás de todo ahora mismo).
Tenga en cuenta que en estos días de máquinas virtuales comunes, la memoria física desde el punto de vista de la máquina puede no ser realmente memoria física real.
¿Le importaría proporcionar más información de lo que significa la abreviatura?
Pithikos
10
Ejemplo ejecutable mínimo
Para que esto tenga sentido, debe comprender los conceptos básicos de la paginación: ¿cómo funciona la paginación x86? y en particular que el sistema operativo puede asignar memoria virtual a través de tablas de páginas / su contabilidad interna (memoria virtual VSZ) antes de que realmente tenga un almacenamiento de respaldo en RAM o disco (memoria residente RSS).
Ahora para observar esto en acción, creemos un programa que:
asigna más RAM que nuestra memoria física con mmap
escribe un byte en cada página para garantizar que cada una de esas páginas pase de la memoria solo virtual (VSZ) a la memoria realmente utilizada (RSS)
0x1000000000 == 64GiB: 2x RAM física de mi computadora de 32GiB
0x200000000 == 8GiB: imprime la memoria cada 8GiB, por lo que deberíamos obtener 4 impresiones antes del bloqueo a aproximadamente 32GiB
echo 1 | sudo tee /proc/sys/vm/overcommit_memory: requerido para Linux para permitirnos hacer una llamada mmap más grande que la RAM física: memoria máxima que malloc puede asignar
La memoria virtual VSZ permanece constante en printf '0x%X\n' 0x40009A4 KiB ~= 64GiB(los psvalores están en KiB) después del mmap.
El "uso de memoria real" de RSS aumenta perezosamente solo cuando tocamos las páginas. Por ejemplo:
en la primera impresión, tenemos extra_memory_committed 0, lo que significa que todavía no hemos tocado ninguna página. RSS es un pequeño 1648 KiBque se ha asignado para el inicio normal del programa, como área de texto, globales, etc.
En la segunda impresión, hemos escrito 8388608 KiB == 8GiBpáginas por valor. Como resultado, RSS aumentó exactamente 8GIB a8390256 KiB == 8388608 KiB + 1648 KiB
RSS continúa aumentando en incrementos de 8GiB. La última impresión muestra aproximadamente 24 GiB de memoria, y antes de que se pudieran imprimir 32 GiB, el asesino de OOM mató el proceso
Así que vemos que, curiosamente, fue el demonio MongoDB que siempre se ejecuta en mi computadora portátil en segundo plano lo que activó por primera vez al asesino OOM, presumiblemente cuando el pobre estaba tratando de asignar algo de memoria.
Sin embargo, el asesino de OOM no necesariamente mata al que lo despertó.
Después de la invocación, el núcleo imprime una tabla o procesos que incluyen oom_score:
y más adelante vemos que nuestro propio pequeño main.outfue asesinado en la invocación previa:
[ 7283.479871] Out of memory: Kill process 15665 (main.out) score 865 or sacrifice child
[ 7283.479879] Killed process 15665 (main.out) total-vm:67111332kB, anon-rss:92kB, file-rss:4kB, shmem-rss:30080832kB
[ 7283.479951] oom_reaper: reaped process 15665 (main.out), now anon-rss:0kB, file-rss:0kB, shmem-rss:30080832kB
También es interesante que aparentemente todo sucedió tan rápido que antes de que se contara la memoria liberada, el proceso oomdespertó nuevamente DeadlineMonitor:
y esta vez que mató algunos procesos de Chromium, que generalmente es la memoria normal de mi computadora:
[ 7283.481773] Out of memory: Kill process 11786 (chromium-browse) score 306 or sacrifice child
[ 7283.481833] Killed process 11786 (chromium-browse) total-vm:1813576kB, anon-rss:208804kB, file-rss:0kB, shmem-rss:8380kB
[ 7283.497847] oom_reaper: reaped process 11786 (chromium-browse), now anon-rss:0kB, file-rss:0kB, shmem-rss:8044kB
Creo que ya se ha dicho mucho sobre RSS vs VSZ. Desde la perspectiva del administrador / programador / usuario, cuando diseño / codifico aplicaciones, me preocupa más la RSZ, (memoria residente), ya que cada vez que extrae más y más variables (colmadas) verá que este valor se dispara. Pruebe un programa simple para construir una asignación de espacio basada en malloc en bucle y asegúrese de completar los datos en ese espacio malloc'd. RSS sigue subiendo. En lo que respecta a VSZ, es más un mapeo de memoria virtual que Linux, y una de sus características principales derivadas de los conceptos convencionales del sistema operativo. La gestión de VSZ se realiza mediante la gestión de memoria virtual del núcleo. Para obtener más información sobre VSZ, consulte la descripción de Robert Love en mm_struct y vm_struct, que forman parte de la estructura de datos básica de task_struct en el núcleo.
Puede consultar el espacio de direcciones virtuales del proceso 1234 usando proc (5) con cat /proc/1234/mapsy su estado (incluido el consumo de memoria) a través decat /proc/1234/status
Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - De la opinión
Maak
Proporcioné un segundo enlace. Uno de ellos seguirá siendo válido
Respuestas:
RSS es el tamaño de conjunto residente y se utiliza para mostrar cuánta memoria se asigna a ese proceso y está en la RAM. No incluye la memoria que se intercambia. Incluye memoria de bibliotecas compartidas siempre que las páginas de esas bibliotecas estén realmente en memoria. Incluye toda la memoria de pila y montón.
VSZ es el tamaño de la memoria virtual. Incluye toda la memoria a la que puede acceder el proceso, incluida la memoria intercambiada, la memoria asignada pero no utilizada y la memoria que proviene de bibliotecas compartidas.
Entonces, si el proceso A tiene un binario de 500K y está vinculado a 2500K de bibliotecas compartidas, tiene 200K de asignaciones de pila / montón de las cuales 100K está realmente en la memoria (el resto está intercambiado o sin usar), y solo ha cargado 1000K de las bibliotecas compartidas y 400K de su propio binario entonces:
Dado que parte de la memoria se comparte, muchos procesos pueden usarla, por lo que si suma todos los valores RSS, puede terminar fácilmente con más espacio del que tiene su sistema.
La memoria asignada también puede no estar en RSS hasta que el programa la use realmente. Entonces, si su programa asignó una gran cantidad de memoria por adelantado, luego la usa con el tiempo, podría ver que RSS sube y VSZ se mantiene igual.
También hay PSS (tamaño de conjunto proporcional). Esta es una medida más nueva que rastrea la memoria compartida como una proporción utilizada por el proceso actual. Entonces, si hubo dos procesos que usaban la misma biblioteca compartida de antes:
Todos los subprocesos comparten el mismo espacio de direcciones, por lo que RSS, VSZ y PSS para cada subproceso son idénticos a todos los otros subprocesos en el proceso. Use ps o top para ver esta información en linux / unix.
Hay mucho más que esto, para obtener más información, consulte las siguientes referencias:
Ver también:
fuente
libxml2.so
, la biblioteca compartida se contará en cada uno de sus RSS, por lo que la suma de sus RSS será mayor que la memoria real utilizada.top
comando. Este sistema no tiene ningún intercambio,swapon --show
no devuelve nada. ¿Cómo explicas esto? Si vsz es intercambio + bibliotecas compartidas, en este caso, ¿las bibliotecas compartidas tienen más de 3.3G? ¿Es posible? Realmente confundido ...RSS es Tamaño de conjunto residente (memoria físicamente residente; actualmente está ocupando espacio en la memoria física de la máquina), y VSZ es Tamaño de memoria virtual (espacio de direcciones asignado: tiene direcciones asignadas en el mapa de memoria del proceso, pero no necesariamente hay ninguna memoria real detrás de todo ahora mismo).
Tenga en cuenta que en estos días de máquinas virtuales comunes, la memoria física desde el punto de vista de la máquina puede no ser realmente memoria física real.
fuente
Ejemplo ejecutable mínimo
Para que esto tenga sentido, debe comprender los conceptos básicos de la paginación: ¿cómo funciona la paginación x86? y en particular que el sistema operativo puede asignar memoria virtual a través de tablas de páginas / su contabilidad interna (memoria virtual VSZ) antes de que realmente tenga un almacenamiento de respaldo en RAM o disco (memoria residente RSS).
Ahora para observar esto en acción, creemos un programa que:
mmap
C Principal
GitHub aguas arriba .
Compilar y ejecutar:
dónde:
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
: requerido para Linux para permitirnos hacer una llamada mmap más grande que la RAM física: memoria máxima que malloc puede asignarSalida del programa:
Estado de salida:
que según la regla del número de señal 128+ significa que obtuvimos el número de señal
9
, queman 7 signal
dice SIGKILL , que es enviado por el asesino de memoria insuficiente de Linux .Interpretación de salida:
printf '0x%X\n' 0x40009A4 KiB ~= 64GiB
(losps
valores están en KiB) después del mmap.extra_memory_committed 0
, lo que significa que todavía no hemos tocado ninguna página. RSS es un pequeño1648 KiB
que se ha asignado para el inicio normal del programa, como área de texto, globales, etc.8388608 KiB == 8GiB
páginas por valor. Como resultado, RSS aumentó exactamente 8GIB a8390256 KiB == 8388608 KiB + 1648 KiB
Ver también: /unix/35129/need-explanation-on-resident-set-size-virtual-size
OOM troncos asesinos
Nuestros
dmesg
comandos han mostrado los registros asesinos de OOM.Se ha pedido una interpretación exacta de estos en:
La primera línea del registro fue:
Así que vemos que, curiosamente, fue el demonio MongoDB que siempre se ejecuta en mi computadora portátil en segundo plano lo que activó por primera vez al asesino OOM, presumiblemente cuando el pobre estaba tratando de asignar algo de memoria.
Sin embargo, el asesino de OOM no necesariamente mata al que lo despertó.
Después de la invocación, el núcleo imprime una tabla o procesos que incluyen
oom_score
:y más adelante vemos que nuestro propio pequeño
main.out
fue asesinado en la invocación previa:Este registro menciona lo
score 865
que ese proceso tuvo, presumiblemente el puntaje asesino OOM más alto (peor) como se menciona en: /unix/153585/how-does-the-oom-killer-decide-which- proceso para matar primeroTambién es interesante que aparentemente todo sucedió tan rápido que antes de que se contara la memoria liberada, el proceso
oom
despertó nuevamenteDeadlineMonitor
:y esta vez que mató algunos procesos de Chromium, que generalmente es la memoria normal de mi computadora:
Probado en Ubuntu 19.04, kernel de Linux 5.0.0.
fuente
Creo que ya se ha dicho mucho sobre RSS vs VSZ. Desde la perspectiva del administrador / programador / usuario, cuando diseño / codifico aplicaciones, me preocupa más la RSZ, (memoria residente), ya que cada vez que extrae más y más variables (colmadas) verá que este valor se dispara. Pruebe un programa simple para construir una asignación de espacio basada en malloc en bucle y asegúrese de completar los datos en ese espacio malloc'd. RSS sigue subiendo. En lo que respecta a VSZ, es más un mapeo de memoria virtual que Linux, y una de sus características principales derivadas de los conceptos convencionales del sistema operativo. La gestión de VSZ se realiza mediante la gestión de memoria virtual del núcleo. Para obtener más información sobre VSZ, consulte la descripción de Robert Love en mm_struct y vm_struct, que forman parte de la estructura de datos básica de task_struct en el núcleo.
fuente
No se gestionan, sino que se miden y posiblemente son limitadas (consulte la
getrlimit
llamada al sistema, también en getrlimit (2) ).RSS significa tamaño de conjunto residente (la parte de su espacio de direcciones virtuales en RAM).
Puede consultar el espacio de direcciones virtuales del proceso 1234 usando proc (5) con
cat /proc/1234/maps
y su estado (incluido el consumo de memoria) a través decat /proc/1234/status
fuente