Como o uso de memória é relatado no Linux?

17

Usando ps, posso ver o tamanho, o vsize (o mesmo que o VIRT do topo?) E o rss (o mesmo que o RES do topo?). (Mais um que vejo no topo é SHR.)

Alguém poderia resumir para mim o que esses diferentes campos significam?

Jim Hunziker
fonte
Prefiro ver um bom resumo nesta página do que um link que pode desaparecer para que essa página possa ser usada como referência.
21711 Jim Hunziker

Respostas:

34

Em resumo:

  • Tamanho virtual: é a quantidade de espaço de endereço que um processo está gerenciando. O espaço de endereço virtual contém tudo o que o processo pode acessar por meio de ponteiros (referências de endereço de memória). Por exemplo, se o seu programa obtiver acesso ao buffer de quadros da sua placa de vídeo, essa memória será mapeada para o espaço virtual do processo e receberá um endereço armazenado em um ponteiro. Arquivos mapeados na memória e mapeamentos anônimos também são contabilizados no tamanho do espaço de endereço virtual. Praticamente tudo está no tamanho virtual. Se você resumir o tamanho de todos os intervalos de endereços listados /proc/<pid>/maps, ele deverá retornar aproximadamente o mesmo valor do tamanho virtual.

  • Tamanho do residente: é a quantidade de memória que pertence especificamente ao processo que atualmente reside na memória. Isso significa a quantidade de memória que não está em troca. Observe que partes do processo podem estar na memória de troca mesmo quando o processo está em execução. O sistema operacional extrairá essas regiões da troca quando o processo tentar acessá-lo. Isso deve incluir a pilha, as pilhas de todos os threads e outros mapeamentos particulares. Se você olhar em /proc/<pid>/maps, as [stack], [heap]e outros mapeamentos anônimos (aqueles sem caminhos de arquivos) ou são trocados ou contabilizada no tamanho residente.

  • Tamanho compartilhado: é a quantidade de memória que pode pertencer a vários processos. Por exemplo, se você tiver quatro instâncias do mesmo aplicativo carregadas na memória, terá quatro instâncias do heap e pelo menos quatro pilhas, uma para cada processo (essa é a memória residente), mas terá apenas uma instância de o código binário do programa e suas bibliotecas. Este é o espaço compartilhado. Não só ele inclui o código do programa binário e suas bibliotecas, mas também arquivos de localização, somente leitura de dados do programa, SysV e POSIX compartilhado segmentos de memória, semáforos, etc ... Se você olhar no /proc/<pid>/maps, a maioria dos mapeamentos vinculados a arquivos de biblioteca e do programa são compartilhado.

Observe que o VIRT contém a união de RSS e SHR e sempre será maior que qualquer um deles. Pode haver regiões contabilizadas como RSS e SHR.

Juliano
fonte
2
Aliás, em versões recentes do linux você pode ver um colapso muito detalhado do uso da memória em / proc / <pid> / smaps
bdonlan
1
Tamanho compartilhado é a memória que pode ser compartilhada. Se um aplicativo for o único usuário da biblioteca, a biblioteca será mantida na memória por um único processo. Dessa forma, mesmo a memória compartilhada pode ser "propriedade do processo".
quer
6

Na resposta de Juliano:

Observe que RSS + SHR <= VIRT, sempre.

Isso é apenas falso. O SHR contém toda a memória virtual que pode ser compartilhada com outros processos, e o RSS contém toda a memória fisicamente na RAM usada pelo processo.

Portanto, toda a memória compartilhada atualmente na RAM é contada no SHR e no RSS, portanto, o SHR + RSS não tem significado, pois pode conter contagens duplicadas.

Para construir um processo com RSS + SHR> VIRT, apenas mapeie um arquivo grande (1 GB) e leia-o completamente: o arquivo mmaped será carregado na RAM, e VIRT, SHR e RSS serão levemente maiores que 1 GB, portanto, SHR + RSS> VIRT.

Anônimo
fonte
Sim, foi mais uma declaração sobre o VIRT do que os outros dois. O que eu tinha em mente era mais sobre a união de RSS e SHR do que a soma deles, ou seja, o VIRT contém RSS e SHR. Má representação matemática.
Juliano