RSS é o tamanho do conjunto residente e é usado para mostrar quanta memória é alocada para esse processo e está na RAM. Não inclui a memória trocada. Ele inclui memória de bibliotecas compartilhadas, desde que as páginas dessas bibliotecas estejam realmente na memória. Inclui toda a pilha e memória de pilha.
VSZ é o tamanho da memória virtual. Inclui toda a memória que o processo pode acessar, incluindo a memória trocada, a memória alocada, mas não usada, e a memória proveniente de bibliotecas compartilhadas.
Portanto, se o processo A tiver um binário de 500K e estiver vinculado a 2500K de bibliotecas compartilhadas, tiver 200K de alocações de pilha / heap, dos quais 100K estão realmente na memória (o restante é trocado ou não utilizado) e, na verdade, apenas 1000K foi carregado nas bibliotecas compartilhadas e 400K de seu próprio binário:
Como parte da memória é compartilhada, muitos processos podem usá-la; portanto, se você adicionar todos os valores de RSS, poderá facilmente ter mais espaço do que o seu sistema.
A memória alocada também pode não estar no RSS até que seja realmente usada pelo programa. Portanto, se seu programa alocou um monte de memória antecipadamente e a utilizou com o tempo, você poderia ver o RSS subindo e o VSZ permanecendo o mesmo.
Há também PSS (tamanho proporcional do conjunto). Essa é uma medida mais recente que rastreia a memória compartilhada como uma proporção usada pelo processo atual. Portanto, se houvesse dois processos usando a mesma biblioteca compartilhada de antes:
Todos os threads compartilham o mesmo espaço de endereço; portanto, o RSS, VSZ e PSS para cada thread são idênticos a todos os outros threads no processo. Use ps ou top para visualizar essas informações em linux / unix.
Há muito mais do que isso: para saber mais, verifique as seguintes referências:
Acredito RSS faz incluir a memória de bibliotecas ligadas dinamicamente. Se houver três processos em uso libxml2.so, a biblioteca compartilhada será contada em cada um de seus RSS, portanto, a soma de seu RSS será mais do que a memória real usada.
Nfm
1
Está correto. Eu corrigi minha resposta, obrigado pelo aviso.
jmh
Estou no ubuntu 16.04, e há um processo java com 1.2G RES e 4.5G VIRT mostrando a partir do topcomando. Este sistema não possui nenhuma troca, swapon --shownão retorna nada. Como você explica isso? Se vsz for swap + bibliotecas compartilhadas, nesse caso, as bibliotecas compartilhadas terão mais de 3.3G? É possível? Apenas realmente confuso ...
Aaron Wang
Eu não tenho certeza. Veja esta resposta sobre o uso da memória virtual Java: stackoverflow.com/a/561450/622115 . Versão curta: O VSZ pode incluir espaço de heap alocado e não usado, além de arquivos mapeados na memória.
jmh
Ótimo. Basta adicionar algo. se você malloc (100 KB), use apenas 1 KB na verdade. O rss é 1K e o vsz é 100K, mesmo se não houver troca aqui.
keniee van
53
RSS é o tamanho do conjunto residente (memória fisicamente residente - atualmente ocupa espaço na memória física da máquina) e VSZ é tamanho da memória virtual (espaço de endereço alocado - isso possui endereços alocados no mapa de memória do processo, mas não há necessariamente nenhum memória real por trás de tudo agora).
Observe que nesses dias de máquinas virtuais comuns, a memória física do ponto de vista da máquina pode não ser realmente a memória física real.
Importa-se de fornecer mais informações do que o que significa a abreviação?
Pithikos
10
Exemplo mínimo executável
Para que isso faça sentido, você precisa entender o básico da paginação: Como funciona a paginação x86? e, em particular, que o sistema operacional possa alocar memória virtual por meio de tabelas de páginas / sua manutenção de livro de memória interna (memória virtual VSZ) antes que ele realmente tenha um armazenamento de backup na RAM ou no disco (memória residente em RSS).
Agora, para observar isso em ação, vamos criar um programa que:
aloca mais RAM do que nossa memória física com mmap
grava um byte em cada página para garantir que cada uma dessas páginas passe da memória virtual apenas (VSZ) para a memória realmente usada (RSS)
0x1000000000 == 64GiB: 2x a RAM física de 32GiB do meu computador
0x200000000 == 8GiB: imprima a memória a cada 8GiB, portanto, devemos obter 4 impressões antes da falha, em torno de 32GiB
echo 1 | sudo tee /proc/sys/vm/overcommit_memory: necessário para o Linux nos permitir fazer uma chamada mmap maior que a RAM física: memória máxima que o malloc pode alocar
A memória virtual VSZ permanece constante em printf '0x%X\n' 0x40009A4 KiB ~= 64GiB(os psvalores estão em KiB) após o mmap.
O "uso de memória real" do RSS aumenta preguiçosamente apenas quando tocamos as páginas. Por exemplo:
na primeira impressão, temos extra_memory_committed 0, o que significa que ainda não tocamos nenhuma página. RSS é um pequeno 1648 KiBque foi alocado para a inicialização normal do programa, como área de texto, globais, etc.
na segunda impressão, escrevemos para o 8388608 KiB == 8GiBvalor de páginas. Como resultado, o RSS aumentou exatamente 8GIB para8390256 KiB == 8388608 KiB + 1648 KiB
O RSS continua a aumentar em incrementos de 8GiB. A última impressão mostra cerca de 24 GiB de memória e, antes que 32 GiB pudessem ser impressos, o assassino da OOM interrompeu o processo.
Portanto, vemos que, curiosamente, foi o daemon MongoDB que sempre é executado no meu laptop em segundo plano, o que desencadeou o assassino do OOM, provavelmente quando o pobre estava tentando alocar alguma memória.
No entanto, o assassino da OOM não mata necessariamente quem o acordou.
Após a chamada, o kernel imprime uma tabela ou processos, incluindo oom_score:
e mais adiante, vemos que nosso pouco main.outfoi morto na invocação anterior:
[ 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
Curiosamente, tudo aparentemente aconteceu tão rápido que, antes que a memória liberada fosse contabilizada, ela oomfoi despertada novamente pelo DeadlineMonitorprocesso:
e desta vez que matou algum processo do Chromium, que geralmente é a memória normal de meus computadores:
[ 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
Acho que já foi dito muito sobre RSS vs VSZ. Do ponto de vista do administrador / programador / usuário, ao projetar / codificar aplicativos, estou mais preocupado com o RSZ (memória residente), pois e quando você continua puxando mais e mais variáveis (amontoadas), esse valor aumenta. Tente um programa simples para criar alocação de espaço com base em malloc em loop e certifique-se de preencher dados nesse espaço. O RSS continua subindo. No que diz respeito ao VSZ, é mais o mapeamento de memória virtual que o linux faz, e um de seus principais recursos derivados dos conceitos convencionais de sistema operacional. O gerenciamento do VSZ é feito pelo gerenciamento de memória virtual do kernel. Para obter mais informações sobre o VSZ, consulte a descrição de Robert Love em mm_struct e vm_struct, que fazem parte da estrutura básica de dados task_struct no kernel.
Você pode consultar o espaço de endereço virtual do processo 1234 usando proc (5) com cat /proc/1234/mapse seu status (incluindo consumo de memória) atravéscat /proc/1234/status
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada. - Da avaliação
Maak
Eu forneci um segundo link. Um deles vai ficar válida
Respostas:
RSS é o tamanho do conjunto residente e é usado para mostrar quanta memória é alocada para esse processo e está na RAM. Não inclui a memória trocada. Ele inclui memória de bibliotecas compartilhadas, desde que as páginas dessas bibliotecas estejam realmente na memória. Inclui toda a pilha e memória de pilha.
VSZ é o tamanho da memória virtual. Inclui toda a memória que o processo pode acessar, incluindo a memória trocada, a memória alocada, mas não usada, e a memória proveniente de bibliotecas compartilhadas.
Portanto, se o processo A tiver um binário de 500K e estiver vinculado a 2500K de bibliotecas compartilhadas, tiver 200K de alocações de pilha / heap, dos quais 100K estão realmente na memória (o restante é trocado ou não utilizado) e, na verdade, apenas 1000K foi carregado nas bibliotecas compartilhadas e 400K de seu próprio binário:
Como parte da memória é compartilhada, muitos processos podem usá-la; portanto, se você adicionar todos os valores de RSS, poderá facilmente ter mais espaço do que o seu sistema.
A memória alocada também pode não estar no RSS até que seja realmente usada pelo programa. Portanto, se seu programa alocou um monte de memória antecipadamente e a utilizou com o tempo, você poderia ver o RSS subindo e o VSZ permanecendo o mesmo.
Há também PSS (tamanho proporcional do conjunto). Essa é uma medida mais recente que rastreia a memória compartilhada como uma proporção usada pelo processo atual. Portanto, se houvesse dois processos usando a mesma biblioteca compartilhada de antes:
Todos os threads compartilham o mesmo espaço de endereço; portanto, o RSS, VSZ e PSS para cada thread são idênticos a todos os outros threads no processo. Use ps ou top para visualizar essas informações em linux / unix.
Há muito mais do que isso: para saber mais, verifique as seguintes referências:
Veja também:
fonte
libxml2.so
, a biblioteca compartilhada será contada em cada um de seus RSS, portanto, a soma de seu RSS será mais do que a memória real usada.top
comando. Este sistema não possui nenhuma troca,swapon --show
não retorna nada. Como você explica isso? Se vsz for swap + bibliotecas compartilhadas, nesse caso, as bibliotecas compartilhadas terão mais de 3.3G? É possível? Apenas realmente confuso ...RSS é o tamanho do conjunto residente (memória fisicamente residente - atualmente ocupa espaço na memória física da máquina) e VSZ é tamanho da memória virtual (espaço de endereço alocado - isso possui endereços alocados no mapa de memória do processo, mas não há necessariamente nenhum memória real por trás de tudo agora).
Observe que nesses dias de máquinas virtuais comuns, a memória física do ponto de vista da máquina pode não ser realmente a memória física real.
fonte
Exemplo mínimo executável
Para que isso faça sentido, você precisa entender o básico da paginação: Como funciona a paginação x86? e, em particular, que o sistema operacional possa alocar memória virtual por meio de tabelas de páginas / sua manutenção de livro de memória interna (memória virtual VSZ) antes que ele realmente tenha um armazenamento de backup na RAM ou no disco (memória residente em RSS).
Agora, para observar isso em ação, vamos criar um programa que:
mmap
main.c
GitHub upstream .
Compile e execute:
Onde:
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
: necessário para o Linux nos permitir fazer uma chamada mmap maior que a RAM física: memória máxima que o malloc pode alocarSaída do programa:
Status de saída:
que pela regra do número de sinal 128 + significa que obtivemos o número do sinal
9
, queman 7 signal
é SIGKILL , enviado pelo assassino de memória insuficiente do Linux .Interpretação de saída:
printf '0x%X\n' 0x40009A4 KiB ~= 64GiB
(osps
valores estão em KiB) após o mmap.extra_memory_committed 0
, o que significa que ainda não tocamos nenhuma página. RSS é um pequeno1648 KiB
que foi alocado para a inicialização normal do programa, como área de texto, globais, etc.8388608 KiB == 8GiB
valor de páginas. Como resultado, o RSS aumentou exatamente 8GIB para8390256 KiB == 8388608 KiB + 1648 KiB
Consulte também: /unix/35129/need-explanation-on-resident-set-size-virtual-size
Logs assassinos de OOM
Nossos
dmesg
comandos mostraram os logs do OOM killer.Uma interpretação exata deles foi solicitada em:
A primeira linha do log foi:
Portanto, vemos que, curiosamente, foi o daemon MongoDB que sempre é executado no meu laptop em segundo plano, o que desencadeou o assassino do OOM, provavelmente quando o pobre estava tentando alocar alguma memória.
No entanto, o assassino da OOM não mata necessariamente quem o acordou.
Após a chamada, o kernel imprime uma tabela ou processos, incluindo
oom_score
:e mais adiante, vemos que nosso pouco
main.out
foi morto na invocação anterior:Esse log menciona o
score 865
que esse processo teve, presumivelmente a maior (pior) pontuação do assassino de OOM, conforme mencionado em: /unix/153585/how-does-the-oom-killer-decide-which- processo para matar primeiroCuriosamente, tudo aparentemente aconteceu tão rápido que, antes que a memória liberada fosse contabilizada, ela
oom
foi despertada novamente peloDeadlineMonitor
processo:e desta vez que matou algum processo do Chromium, que geralmente é a memória normal de meus computadores:
Testado no Ubuntu 19.04, kernel do Linux 5.0.0.
fonte
Acho que já foi dito muito sobre RSS vs VSZ. Do ponto de vista do administrador / programador / usuário, ao projetar / codificar aplicativos, estou mais preocupado com o RSZ (memória residente), pois e quando você continua puxando mais e mais variáveis (amontoadas), esse valor aumenta. Tente um programa simples para criar alocação de espaço com base em malloc em loop e certifique-se de preencher dados nesse espaço. O RSS continua subindo. No que diz respeito ao VSZ, é mais o mapeamento de memória virtual que o linux faz, e um de seus principais recursos derivados dos conceitos convencionais de sistema operacional. O gerenciamento do VSZ é feito pelo gerenciamento de memória virtual do kernel. Para obter mais informações sobre o VSZ, consulte a descrição de Robert Love em mm_struct e vm_struct, que fazem parte da estrutura básica de dados task_struct no kernel.
fonte
Eles não são gerenciados, mas medidos e possivelmente limitados (consulte a
getrlimit
chamada do sistema, também no getrlimit (2) ).RSS significa tamanho do conjunto residente (a parte do seu espaço de endereço virtual localizado na RAM).
Você pode consultar o espaço de endereço virtual do processo 1234 usando proc (5) com
cat /proc/1234/maps
e seu status (incluindo consumo de memória) atravéscat /proc/1234/status
fonte