Esta questão é abordada aqui em grandes detalhes.
Como você mede o uso de memória de um aplicativo ou processo no Linux?
No artigo do blog Noções básicas sobre o uso da memória no Linux , ps
não é uma ferramenta precisa a ser usada para esse objetivo.
Por que
ps
está "errado"Dependendo de como você olha para ele,
ps
não está relatando o uso real da memória dos processos. O que realmente está fazendo é mostrar quanta memória real cada processo consumiria se fosse o único processo em execução . Obviamente, uma máquina Linux típica possui várias dezenas de processos em execução a qualquer momento, o que significa que os números VSZ e RSS relatados porps
estão quase definitivamente errados .
ps
, nem mostra isso - mostra números de memória virtual e residente, onde virtual é a quantidade máxima de memória que o processo poderia teoricamente usá-lo, pois era o único processo (nunca), usado em todas as páginas alocadas (nunca acontece) e não mapeou ou remove o mapeamento de nenhuma página (improvável). Enquanto residente mostra quanta memória virtual está mapeada para física no momento. Normalmente,virt > usage > res
porém, em um sistema de 64 bitsvirt ~= res*10
, é uma gama muito ampla.Respostas:
Com
ps
ou ferramentas semelhantes, você obterá apenas a quantidade de páginas de memória alocada por esse processo. Este número está correto, mas:não reflete a quantidade real de memória usada pelo aplicativo, apenas a quantidade de memória reservada para ele
pode ser enganoso se as páginas forem compartilhadas, por exemplo, por vários encadeamentos ou usando bibliotecas vinculadas dinamicamente
Se você realmente deseja saber a quantidade de memória que seu aplicativo realmente usa, é necessário executá-lo em um criador de perfil. Por exemplo,
valgrind
você pode obter informações sobre a quantidade de memória usada e, mais importante, sobre possíveis vazamentos de memória em seu programa. A ferramenta heap profiler do valgrind é chamada 'massif':Conforme explicado na documentação do valgrind , você precisa executar o programa através do valgrind:
O Massif grava um despejo de instantâneos de uso de memória (por exemplo
massif.out.12345
). Eles fornecem, (1) uma linha do tempo de uso da memória, (2) para cada instantâneo, um registro de onde a memória do programa foi alocada. Uma ótima ferramenta gráfica para analisar esses arquivos é o massif-visualizer . Mas descobri quems_print
uma ferramenta simples baseada em texto enviada com o valgrind já é de grande ajuda.Para encontrar vazamentos de memória, use a
memcheck
ferramenta (padrão) do valgrind.fonte
Experimente o comando pmap :
fonte
gnome-system-monitor
Difícil dizer com certeza, mas aqui estão duas coisas "próximas" que podem ajudar.
lhe dará tamanho virtual (VSZ)
Você também pode obter estatísticas detalhadas do sistema de arquivos / proc, acessando
/proc/$pid/status
O mais importante é o VmSize, que deve estar próximo do que
ps aux
dá.fonte
gnome-system-monitor
Nas versões recentes do linux, use o subsistema smaps . Por exemplo, para um processo com um PID de 1234:
Ele lhe dirá exatamente quanta memória está usando naquele momento. Mais importante, ele dividirá a memória em privada e compartilhada, para que você possa saber quanta memória sua instância do programa está usando, sem incluir a memória compartilhada entre várias instâncias do programa.
fonte
pmap
é uma interface mais simples para ele.Não há uma maneira fácil de calcular isso. Mas algumas pessoas tentaram obter boas respostas:
fonte
ps_mem
esmem
muito útil para medidas do usuário final, enquanto por exemplo.pmap
A saída muito detalhada é voltada para desenvolvedores ... permite recuperar o uso de memória do Firefox para cada fonte, complementos, bibliotecas por ex. Obrigado a todos exp. @Bash, @thomasruther.gnome-system-monitor
Use smem , que é uma alternativa ao ps que calcula o USS e o PSS por processo. O que você quer é provavelmente o PSS.
USS - tamanho único do conjunto. Essa é a quantidade de memória não compartilhada exclusiva para esse processo (pense nela como U para memória exclusiva ). Não inclui memória compartilhada. Assim, esta vontade sob -report a quantidade de memória que um processo usos, mas é útil quando você quer ignorar memória compartilhada.
PSS - tamanho proporcional do conjunto. Isso é o que você quer. Ele adiciona a memória exclusiva (USS), juntamente com uma proporção de sua memória compartilhada dividida pelo número de processos que compartilham essa memória. Assim, ele fornecerá uma representação precisa de quanta memória física real está sendo usada por processo - com a memória compartilhada realmente representada como compartilhada. Pense no P sendo a memória física .
Como isso se compara ao RSS, conforme relatado por ps e outros utilitários:
Nota: o smem também pode (opcionalmente) gerar gráficos como gráficos de pizza e similares. OMI, você não precisa disso. Se você quiser apenas usá-lo na linha de comando como se estivesse usando o ps -A v, não precisará instalar a dependência recomendada pelo python-matplotlib.
fonte
Use isso como root e você poderá obter uma saída clara para o uso da memória em cada processo.
EXEMPLO DE SAÍDA:
fonte
x=2
também para gerar pid e user.Que tal
time
?Não o Bash embutido,
time
mas o que você pode encontrarwhich time
, por exemplo/usr/bin/time
Aqui está o que ele cobre, de maneira simples
ls
:fonte
brew install gnu-time
então usegtime
se você estiver no macOS.Este é um excelente resumo das ferramentas e problemas: archive.org link
Vou citar, para que mais desenvolvedores o leiam.
fonte
Além das soluções listadas em tuas respostas, você pode usar o comando Linux "top"; Ele fornece uma visualização dinâmica em tempo real do sistema em execução, fornece o uso da CPU e da memória, para todo o sistema e para todos os programas, em porcentagem:
filtrar por um programa pid:
para filtrar por um nome de programa:
"top" também fornece alguns campos como:
VIRT - Imagem virtual (kb): a quantidade total de memória virtual usada pela tarefa
RES - Tamanho do residente (kb): a memória física não trocada que uma tarefa usou; RES = CÓDIGO + DADOS.
DADOS - Tamanho dos dados + da pilha (kb): a quantidade de memória física dedicada a outro código que não o executável, também conhecido como tamanho do 'conjunto de residentes de dados' ou DRS.
SHR - Tamanho da memória compartilhada (kb): a quantidade de memória compartilhada usada por uma tarefa. Simplesmente reflete a memória que poderia ser potencialmente compartilhada com outros processos.
Referência aqui .
fonte
Não existe uma única resposta para isso, porque você não pode apontar com precisão a quantidade de memória que um processo usa. A maioria dos processos no linux usa bibliotecas compartilhadas. Por exemplo, digamos que você queira calcular o uso de memória para o processo 'ls'. Você conta apenas a memória usada pelo executável 'ls' (se você puder isolá-lo)? E a libc? Ou todas essas outras bibliotecas necessárias para executar 'ls'?
Você pode argumentar que eles são compartilhados por outros processos, mas 'ls' não podem ser executados no sistema sem que eles sejam carregados.
Além disso, se você precisar saber quanta memória um processo precisa para fazer o planejamento da capacidade, será necessário calcular quanto cada cópia adicional do processo usa. Eu acho que / proc / PID / status pode fornecer informações suficientes sobre o uso da memória em uma única vez. Por outro lado, o valgrind fornecerá um perfil melhor do uso da memória durante toda a vida útil do programa
fonte
pmap
Se o seu código estiver em C ou C ++, você poderá usá-
getrusage()
lo, retornando várias estatísticas sobre o uso da memória e do tempo do seu processo.Porém, nem todas as plataformas suportam isso e retornarão 0 valores para as opções de uso de memória.
Em vez disso, você pode ver o arquivo virtual criado em
/proc/[pid]/statm
(onde[pid]
é substituído pelo seu ID do processo. Você pode obtê-lo emgetpid()
).Este arquivo será semelhante a um arquivo de texto com 7 números inteiros. Você provavelmente está mais interessado nos números primeiro (todo o uso de memória) e sexto (uso de memória de dados) neste arquivo.
fonte
getpid()
, porque não conheço umagetprocessid()
função em C / C ++ no Linux.O Valgrind pode mostrar informações detalhadas, mas diminui significativamente o aplicativo de destino e, na maioria das vezes, altera o comportamento do aplicativo.
O Exmap era algo que eu ainda não sabia, mas parece que você precisa de um módulo do kernel para obter as informações, o que pode ser um obstáculo.
Suponho que o que todos querem saber o "uso da memória" do WRT é o seguinte ...
No linux, a quantidade de memória física que um único processo pode usar pode ser dividida em categorias a seguir.
Ma memória mapeada anônima
Mn nomeado memória mapeada
O utilitário incluído no Android chamado showmap é bastante útil
fonte
Mais três métodos para tentar:
ps aux --sort pmem
Classifica a saída por
%MEM
.ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
Classifica usando tubos.
top -a
Inicia a classificação superior por
%MEM
(Extraído daqui )
fonte
top
e provavelmente os outros não dão uma representação precisa da memória realmente usada pelo processo. Por exemplo, tenho 64GiB de RAM e 10postgres
processos, cada um relatando 16GiB RES e 25% MEM. É claro que nem todos podem usar 25% ... Cada um também possui 15GiB SHR, e parece que eles estão compartilhando isso.fonte
sed | awk
e funciona no Busybox v1.23.2:sed -n 's/^Size:\s\+\(\S\+\) .*/\1/p' /proc/$1/smaps | awk '{s+=$1} END {print s}'
Estou usando
htop
; é um programa de console muito bom, semelhante ao Windows Task Manager.fonte
htop
e é melhor que o top, mas ainda assim ele mostra todos os tópicos de aplicativos diferentes sem agrupá-los, tornando-o quase tão inútil quanto o top.Se o processo não estiver consumindo muita memória (porque você espera que seja esse o caso, ou algum outro comando tenha fornecido essa indicação inicial), e o processo possa suportar a interrupção por um curto período de tempo, tente use o comando gcore.
Verifique o tamanho do arquivo principal gerado para ter uma boa idéia de quanta memória um determinado processo está usando.
Isso não funcionará muito bem se o processo estiver usando centenas de megas ou shows, pois a geração do núcleo pode levar vários segundos ou minutos para ser criada, dependendo do desempenho de E / S. Durante a criação do núcleo, o processo é interrompido (ou "congelado") para evitar alterações de memória. Por isso tem cuidado.
Verifique também se o ponto de montagem em que o núcleo é gerado possui bastante espaço em disco e se o sistema não reagirá negativamente ao arquivo principal que está sendo criado nesse diretório específico.
fonte
Estou usando o Arch Linux e existe um pacote maravilhoso chamado
ps_mem
Saída de exemplo
fonte
Abaixo da linha de comando, você terá a memória total usada pelos vários processos em execução na máquina Linux em MB
fonte
Um bom teste para o uso mais "real" é abrir o aplicativo, executar
vmstat -s
e verificar a estatística "memória ativa". Feche o aplicativo, aguarde alguns segundos e executevmstat -s
novamente. No entanto, muita memória ativa foi liberada estava evidentemente em uso pelo aplicativo.fonte
Obter valgrind. dê a ele seu programa para ser executado e ele informará bastante sobre o uso de memória.
Isso se aplica apenas ao caso de um programa que é executado por algum tempo e para. Não sei se o valgrind pode colocar as mãos em um processo já em execução ou não deve parar processos como daemons.
fonte
Edit: isso funciona 100% bem apenas quando o consumo de memória aumenta
Se você deseja monitorar o uso da memória por determinado processo (ou grupo de nomes comuns de compartilhamento processados, por exemplo
google-chrome
, você pode usar meu script bash:isso procurará continuamente as alterações e as imprimirá.
fonte
Se você deseja algo mais rápido que criar um perfil com o Valgrind e seu kernel é mais antigo e não pode usar smaps, um ps com as opções para mostrar o conjunto residente do processo (com
ps -o rss,command
) pode fornecer uma rápida e razoável_aproximation_
quantidade real de memória não trocada em uso.fonte
Eu sugiro que você use no topo. Você pode encontrar tudo sobre isso nesta página . Ele é capaz de fornecer todo o KPI necessário para seus processos e também pode capturar em um arquivo.
fonte
atop -R
. Para mostrar um resumo por push do usuáriop
, para classificar por uso de memória, pressione 'M' de dentro para cima. Isso fornece números semelhantes ao smem.Verifique o shell script para verificar o uso de memória por aplicativo no linux . Também disponível no github e em uma versão sem pasta e bc .
fonte
Outro voto para valgrindaqui, mas gostaria de acrescentar que você pode usar uma ferramenta como o Alleyoop para ajudá-lo a interpretar os resultados gerados pelo valgrind.
Eu uso as duas ferramentas o tempo todo e sempre tenho código enxuto e sem vazamentos para mostrar com orgulho;)
fonte
Embora essa pergunta pareça ser sobre o exame dos processos em execução no momento, eu queria ver o pico de memória usado por um aplicativo do início ao fim. Além do valgrind, você pode usar o tstime , que é muito mais simples. Ele mede o uso de memória "highwater" (RSS e virtual). A partir desta resposta .
fonte
Com base na resposta a uma pergunta relacionada .
Você pode usar o SNMP para obter a memória e o uso da CPU de um processo em um dispositivo específico da rede :)
Requisitos:
Notas:
HOST-RESOURCES-MIB :: hrSWRunPerfCPU é o número de centi-segundos dos recursos de CPU do sistema total consumidos por esse processo. Observe que, em um sistema com vários processadores, esse valor pode aumentar em mais de um centi-segundo em um centi-segundo do tempo real (relógio de parede).
HOST-RESOURCES-MIB :: hrSWRunPerfMem é a quantidade total de memória real do sistema alocada para esse processo.
**
Script de monitoramento de processo:
**
fonte
/ prox / xxx / numa_maps fornece algumas informações lá: N0 = ??? N1 = ??? Mas esse resultado pode ser menor que o resultado real, pois conta apenas os que foram tocados.
fonte
Use a ferramenta GUI embutida ' monitor do sistema ' disponível no ubuntu
fonte