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

17

Usando o ps, eu posso ver o tamanho, o vsize (igual ao VIRT do topo?) e o rss (igual ao RES do topo?). (Mais uma que eu vejo no topo é SHR.)

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

    
por Jim Hunziker 31.07.2009 / 17:52

2 respostas

34

Resumindo:

  • 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 framebuffer de 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. Quase tudo está no tamanho virtual. Se você somar o tamanho de todos os intervalos de endereços listados em /proc/<pid>/maps , ele deverá retornar aproximadamente o mesmo valor do tamanho virtual.

  • Tamanho de residente: é a quantidade de memória que pertence especificamente àquele processo atualmente residente na memória. Isso significa que 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 puxará essas regiões da troca quando o processo tentar acessá-las. Isso deve incluir o heap, as pilhas de todos os segmentos e outros mapeamentos particulares. Se você procurar em /proc/<pid>/maps , os [stack] , [heap] e outros mapeamentos anônimos (aqueles sem caminhos de arquivo) serão trocados ou contabilizados 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, você terá quatro instâncias do heap e pelo menos quatro pilhas, uma para cada processo (essa é a memória residente), mas você terá apenas uma instância de o código binário do programa e suas bibliotecas. Este é o espaço compartilhado. Não só inclui o código binário do programa e suas bibliotecas, mas também arquivos de localização, dados do programa somente leitura, segmentos de memória compartilhada SysV e POSIX, semáforos, etc ... Se você olhar em /proc/<pid>/maps , a maioria dos mapeamentos é vinculada à biblioteca e os arquivos de programa são compartilhados.

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.

    
por 31.07.2009 / 18:36
5

Em Juliano responda:

Note that RSS + SHR <= VIRT, always.

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.

Assim, toda a memória compartilhada atualmente na RAM é contada tanto em SHR quanto em RSS, portanto, o SHR + RSS não tem significado, pois pode conter contagens de duplicatas.

Para criar um processo com RSS + SHR > VIRT, apenas mmap um arquivo grande (1GB), então leia-o completamente: o arquivo mmaped será carregado na RAM, e VIRT, SHR e RSS serão cada um maior que 1GB, então SHR + RSS > VIRT

    
por 07.10.2013 / 10:05