Como obter o uso de memória real de um processo (incluindo dados no swap)

1

Estou tentando verificar quanta sobrecarga de memória um processo está realmente colocando no sistema, mas ps , top e amigos são quase inúteis para essa finalidade, pois eles relatam apenas três estatísticas:

  • RES - o conjunto de memória residente inclui apenas páginas de dados que na memória física (não incluindo páginas trocadas), mas também inclui bibliotecas compartilhadas carregadas.
  • VIRT - inclui todas as páginas mapeadas na memória pelo kernel, incluindo páginas trocadas, mas também arquivos mapeados na memória, bibliotecas compartilhadas, etc.
  • SHR - possivelmente a mais inútil de todas, inclui apenas a memória usada pelas bibliotecas que podem ser compartilhadas, mas, pelo que entendi, ela não explica a memória usada pelo processo, mas conta todo o tamanho da biblioteca, mesmo se apenas uma parte é realmente residente.

No software de computação de multiprocessos, quero saber quanta memória será usada / liberada executando ou eliminando outro processo com uma memória compartilhada / bibliotecas semelhantes ou idênticas às existentes, o que significa que preciso saber qual é o tamanho o conjunto de dados usado pelo processo - incluindo todas as páginas de dados trocadas, mas excluindo todas as páginas que não são de dados, como bibliotecas compartilhadas, páginas de memória compartilhada, arquivos mapeados na memória, etc.

Não tenho medo de alguma codificação, mas será melhor se já houver uma substituição top que não conheço que mostre essa informação.

    
por Guss 01.10.2014 / 13:05

2 respostas

2

Veja este script link que estamos usando regularmente para depurar aplicações. Não é uma tarefa simples e os métodos diferem do kernel para o kernel, às vezes.

A partir da descrição do script, você pode ler o seguinte.

# Try to determine how much RAM is currently being used per program.
# Note per _program_, not per process. So for example this script
# will report RAM used by all httpd process together. In detail it reports:
# sum(private RAM for program processes) + sum(Shared RAM for program processes)
# The shared RAM is problematic to calculate, and this script automatically
# selects the most accurate method available for your kernel.
    
por 01.10.2014 / 13:14
1

Eu imaginei que você pode analisar o arquivo / proc / ID / maps para cada processo em questão - se você listar todas as páginas mapeadas, descarte todas as páginas executáveis, páginas compartilhadas e páginas que não estão mapeadas para um inode. Se você, então, somar seus tamanhos (que podem ser calculados a partir dos endereços inicial e final), então o resultado é a pressão real da memória do processo.

Eu tenho o seguinte código em Ruby do PoC que faz isso:

sudo ruby -le '
  puts $<.read.split("\n").collect{|l|l.split(/\s+/)}. # create data records
    select{|r|r[4].to_i==0&&r[1]!~/x|s/}. # remove mapped, exec and shared pages
    collect{|r|b,e=r[0].split(/-/,2).collect{|a|a.to_i(16)};r[0]=e-b;r}. # size
    inject(0){|s,r|s+=r[0]} # sum
  ' /proc/17099/maps

é claro que executar isso para análise real será tedioso, na melhor das hipóteses.

    
por 01.10.2014 / 13:05