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?
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?
Respostas:
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.
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.