determina o uso de memória real de vários processos que compartilham um grande segmento de memória

1

Eu apenas dei uma olhada na saída do top e ele me mostrou (entre outros processos) o seguinte:

Como uma vez pode ver, eu tenho dez processos consumindo aproximadamente 10GB cada para 100GB no total. O computador, no entanto, tem apenas 64 GB de memória, como pode ser visto na segunda linha a partir do topo. Dos quais atualmente cerca de 22 GB são usados.

Agora, a solução para este quebra-cabeça: Os processos test_mpi.out usam uma grande quantidade de memória compartilhada entre si. Desde que eu tenho o código fonte, eu sei que o consumo de memória real é de cerca de 10GB.

O computador consome cerca de 12 GB de memória quando está ocioso, portanto, isso equivale aos 22 GB relatados.

O que eu não entendo é como o top sabe que apenas 22 GB de memória são realmente usados. Com base em todas as colunas exibidas (VIRT, RES e SHR), a parte superior não deve ser capaz de descobrir isso. Seria incrível se alguém pudesse lançar alguma luz sobre isso.

EDIT: rodando no redhat linux

EDIT: Graças a Michael Homer eu sei agora que top leva esta informação de / proc / meminfo. Mas eu estava esperando uma resposta que explicasse como eu posso determinar que todos os processos test_mpi.out consomem apenas 10GB no total (em vez dos 100gb sugeridos por ingenuamente adicionar a saída do topo). Eu tentei olhar / proc / PID / status, mas eu não encontrei nenhuma pista sobre como eu poderia determinar o uso de memória real de vários processos que compartilham um grande segmento de memória (se eu não tivesse o código-fonte).

    
por ftiaronsem 12.01.2016 / 01:15

1 resposta

2

Você pode ver que a coluna SHR está exibindo a mesma quantidade de memória que RES - isso significa que praticamente 100% da memória residente dessa tarefa em particular consiste em segmentos de memória compartilhada. Mesmo isso não está dando a você uma percepção completa, já que RES é apenas a quantidade de memória que não é paginada.

Para descobrir qual é o consumo real de memória de um processo, tente usar um método mais inteligente como ps(1) com campos selecionados (veja a opção -o e a seção STANDARD FORMAT SPECIFIERS do manual). / p>

Observe que, além do campo size (que é uma estimativa muito aproximada), o tamanho total de um processo em termos de memória é difícil de avaliar pelo seu valor de face precisamente porque parte de sua memória pode ser compartilhada com outros processos e não podemos dizer imediatamente quantas dessas páginas estão sujas (veja o parágrafo da seção NOTES em SIZE e RSS na página de manual).

Para saber que esses processos estão realmente usando os segmentos de memória compartilhada same , você precisa examinar a saída do comando ipcs(1) e examinar os segmentos de memória compartilhada que possuem um número suspeito de nattch processa.

Depois, você precisa examinar as informações detalhadas desses segmentos usando ipcs -m -i <id> , que exibirá os processos reais anexados.

Se isso soa muito complicado, olhe para ele como um exercício de desafio - escreva um script que, dada uma ID de processo, imprima a lista de IDs de SHM a que este processo está anexado e uma lista de PIDs que compartilhe esses SHM IDs com. ;)

    
por 12.01.2016 / 02:39