Certa vez, tive a tarefa de determinar os seguintes parâmetros de desempenho de dentro de um aplicativo em execução:
- Memória virtual total disponível
- Memória virtual usada atualmente
- Memória virtual usada atualmente pelo meu processo
- RAM total disponível
- RAM usada atualmente
- RAM atualmente usada pelo meu processo
- % De CPU atualmente usada
- % De CPU atualmente usada pelo meu processo
O código teve que ser executado no Windows e Linux. Mesmo que isso pareça uma tarefa padrão, encontrar as informações necessárias nos manuais (API do WIN32, GNU docs) e na Internet levou vários dias, porque existem muitas informações incompletas / incorretas / desatualizadas sobre esse tópico. encontrado lá fora.
Para evitar que outras pessoas passem pelo mesmo problema, pensei que seria uma boa ideia coletar todas as informações dispersas, além do que encontrei por tentativa e erro aqui em um só lugar.
Respostas:
janelas
Alguns dos valores acima estão facilmente disponíveis na API WIN32 apropriada, basta listá-los aqui para garantir a integridade. Outros, no entanto, precisam ser obtidos na biblioteca Performance Data Helper (PDH), que é um pouco "pouco intuitiva" e requer muitas tentativas e erros dolorosos para chegar ao trabalho. (Pelo menos demorei um pouco, talvez eu tenha sido apenas um pouco estúpido ...)
Nota: para maior clareza, toda a verificação de erros foi omitida no código a seguir. Verifique os códigos de retorno ...!
Memória virtual total:
Nota: O nome "TotalPageFile" é um pouco enganador aqui. Na realidade, este parâmetro fornece o "Tamanho da memória virtual", que é o tamanho do arquivo de troca mais a RAM instalada.
Memória virtual usada atualmente:
O mesmo código que em "Memória virtual total" e depois
Memória virtual atualmente usada pelo processo atual:
Memória física total (RAM):
O mesmo código que em "Memória virtual total" e depois
Memória física atualmente usada:
Memória física atualmente usada pelo processo atual:
O mesmo código que em "Memória virtual atualmente usada pelo processo atual" e depois
CPU usada atualmente:
CPU atualmente usada pelo processo atual:
Linux
No Linux, a escolha que parecia óbvia a princípio foi usar as APIs do POSIX como
getrusage()
etc. Passei algum tempo tentando fazer com que isso funcionasse, mas nunca obtive valores significativos. Quando finalmente chequei as fontes do kernel, descobri que aparentemente essas APIs ainda não estão completamente implementadas no kernel 2.6 do Linux !?No final, obtive todos os valores através de uma combinação de leitura do pseudo-sistema de arquivos
/proc
e chamadas do kernel.Memória virtual total:
Memória virtual usada atualmente:
O mesmo código que em "Memória virtual total" e depois
Memória virtual atualmente usada pelo processo atual:
Memória física total (RAM):
O mesmo código que em "Memória virtual total" e depois
Memória física atualmente usada:
O mesmo código que em "Memória virtual total" e depois
Memória física atualmente usada pelo processo atual:
Altere getValue () em "Memória virtual usada atualmente pelo processo atual" da seguinte maneira:
CPU usada atualmente:
CPU atualmente usada pelo processo atual:
TODO: Outras plataformas
Eu diria que parte do código do Linux também funciona para os Unixes, exceto as partes que lêem o pseudo-sistema de arquivos / proc. Talvez no Unix essas partes possam ser substituídas por
getrusage()
funções semelhantes? Se alguém com o conhecimento do Unix puder editar esta resposta e preencher os detalhes ?!fonte
PROCESS_MEMORY_COUNTERS
, como você está buscando a "Memória virtual atualmente usada pelo processo atual"?PrivateUsage
não é membro dePROCESS_MEMORY_COUNTERS
é o erro do compilador que recebo!"quotes like these"
para incluir cabeçalhos do sistema?GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
porGetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&pmc, sizeof(pmc));
Mac OS X
Eu esperava encontrar informações semelhantes para o Mac OS X também. Como não estava aqui, eu saí e as desenterrei. Aqui estão algumas das coisas que encontrei. Se alguém tiver outras sugestões, eu adoraria ouvi-las.
Memória virtual total
Essa é complicada no Mac OS X porque não usa uma partição de troca predefinida ou arquivo como o Linux. Aqui está uma entrada da documentação da Apple:
Portanto, se você quiser saber quanta memória virtual ainda está disponível, é necessário obter o tamanho da partição raiz. Você pode fazer isso assim:
Total virtual usado atualmente
Chamar systcl com a chave "vm.swapusage" fornece informações interessantes sobre o uso de swap:
Não que o uso total da troca exibido aqui possa mudar se mais troca for necessária, conforme explicado na seção acima. Portanto, o total é realmente o total do swap atual . No C ++, esses dados podem ser consultados desta maneira:
Observe que o "xsw_usage", declarado em sysctl.h, não parece documentado e eu suspeito que exista uma maneira mais portátil de acessar esses valores.
Memória virtual atualmente usada pelo meu processo
Você pode obter estatísticas sobre seu processo atual usando a
task_info
função Isso inclui o tamanho atual do residente do seu processo e o tamanho virtual atual.RAM total disponível
A quantidade de RAM física disponível em seu sistema está disponível usando a
sysctl
função do sistema da seguinte maneira:RAM usada atualmente
Você pode obter estatísticas gerais da memória a partir da
host_statistics
função do sistema.Uma coisa a observar aqui é que existem cinco tipos de páginas de memória no Mac OS X. São as seguintes:
É bom observar que, apenas porque o Mac OS X pode mostrar muito pouca memória livre real às vezes, pode não ser uma boa indicação de quanto está pronto para ser usado em pouco tempo.
RAM atualmente usada pelo meu processo
Consulte a "Memória virtual atualmente usada pelo meu processo" acima. O mesmo código se aplica.
fonte
Linux
No Linux, essas informações estão disponíveis no sistema de arquivos / proc. Não sou muito fã do formato de arquivo de texto usado, pois cada distribuição Linux parece personalizar pelo menos um arquivo importante. Uma rápida olhada na fonte do 'ps' revela a bagunça.
Mas aqui é onde encontrar as informações que você procura:
/ proc / meminfo contém a maioria das informações de todo o sistema que você procura. Aqui parece no meu sistema; Acho que você está interessado em MemTotal , MemFree , SwapTotal e SwapFree :
Para utilização da CPU, você precisa fazer um pouco de trabalho. O Linux disponibiliza a utilização geral da CPU desde o início do sistema; provavelmente não é disso que você está interessado. Se você quiser saber qual foi a utilização da CPU nos últimos segundos ou 10 segundos, precisará consultar as informações e calculá-las.
A informação está disponível em / proc / stat , que está bem documentada em http://www.linuxhowtos.org/System/procstat.htm ; aqui está o que parece na minha caixa de 4 núcleos:
Primeiro, você precisa determinar quantas CPUs (ou processadores ou núcleos de processamento) estão disponíveis no sistema. Para fazer isso, conte o número de entradas 'cpuN', em que N começa em 0 e incrementa. Não conte a linha 'cpu', que é uma combinação das linhas cpuN. No meu exemplo, você pode ver cpu0 a cpu3, para um total de 4 processadores. A partir de agora, você pode ignorar cpu0..cpu3 e focar apenas na linha 'cpu'.
Em seguida, você precisa saber que o quarto número nessas linhas é uma medida do tempo ocioso e, portanto, o quarto número na linha 'cpu' é o tempo total ocioso de todos os processadores desde o tempo de inicialização. Esse tempo é medido nos "jiffies" do Linux, que são 1/100 de segundo cada.
Mas você não se importa com o tempo total ocioso; você se importa com o tempo ocioso em um determinado período, por exemplo, o último segundo. Calcule isso, você precisará ler este arquivo duas vezes, com um segundo de diferença. Então, você pode fazer uma comparação do quarto valor da linha. Por exemplo, se você pegar uma amostra e obter:
Então, um segundo depois, você obtém esta amostra:
Subtraia os dois números e você obterá um diff de 396, o que significa que sua CPU ficou inativa por 3,96 segundos nos últimos 1,00 segundo. O truque, é claro, é que você precisa dividir pelo número de processadores. 3,96 / 4 = 0,99 e há sua porcentagem de inatividade; 99% ocioso e 1% ocupado.
No meu código, tenho um buffer de anel de 360 entradas e leio esse arquivo a cada segundo. Isso permite calcular rapidamente a utilização da CPU por 1 segundo, 10 segundos etc., até 1 hora.
Para informações específicas do processo, você deve procurar em / proc / pid ; se você não se importa com o seu pid, pode procurar em / proc / self.
A CPU usada pelo seu processo está disponível em / proc / self / stat . Este é um arquivo de aparência estranha, composto por uma única linha; por exemplo:
Os dados importantes aqui são os 13º e 14º tokens (0 e 770 aqui). O 13º token é o número de jiffies que o processo executou no modo de usuário e o 14º é o número de jiffies que o processo executou no modo de kernel. Adicione os dois juntos e você terá sua utilização total da CPU.
Novamente, você terá que amostrar esse arquivo periodicamente e calcular o diff, a fim de determinar o uso da CPU do processo ao longo do tempo.
Editar: lembre-se de que, ao calcular a utilização da CPU do seu processo, é necessário levar em consideração 1) o número de threads no processo e 2) o número de processadores no sistema. Por exemplo, se seu processo de thread único estiver usando apenas 25% da CPU, isso poderá ser bom ou ruim. Bom em um sistema de processador único, mas ruim em um sistema de 4 processadores; isso significa que seu processo está em execução constante e usando 100% dos ciclos de CPU disponíveis.
Para as informações de memória específicas do processo, é necessário examinar / proc / self / status, que se parece com isso:
As entradas que começam com 'Vm' são as interessantes:
O único item que não tenho certeza é o Swapspace atualmente usado pelo meu processo . Não sei se isso está disponível.
fonte
No Windows, você pode obter o uso da CPU pelo código abaixo:
fonte
usage =
é a coisa mais criativa que eu já vi em um tempo, não é legível em todos, mas criativoULONGLONG
para VS em vez deULARGE_INTEGER
. 2) Você está complicando demais as ligaçõesCopyMemory()
, basta fazer issoULONGLONG ul_sys_idle = *(ULONGLONG*)&ft_sys_idle;
. Será traduzido em uma única instrução de CPUmov
(oulea
).Linux
Uma maneira portátil de ler números de memória e carregar é a
sysinfo
chamadaUso
DESCRIÇÃO
fonte
QNX
Como isso é como uma "wikipage of code", quero adicionar algum código da base de dados de conhecimento do QNX (nota: este não é o meu trabalho, mas verifiquei-o e funciona bem no meu sistema):
Como obter o uso da CPU em%: http://www.qnx.com/support/knowledgebase.html?id=50130000000P9b5
Como obter a memória livre (!): Http://www.qnx.com/support/knowledgebase.html?id=50130000000mlbx
fonte
Mac OS X - CPU
Uso geral da CPU:
Em Recuperar informações do sistema no MacOS X? :
fonte
Para Linux Você também pode usar / proc / self / statm para obter uma única linha de números contendo informações importantes sobre a memória do processo, o que é uma coisa mais rápida de processar do que passar por uma longa lista de informações relatadas conforme você obtém do proc / self / status
Veja http://man7.org/linux/man-pages/man5/proc.5.html
fonte
Eu usei este código a seguir no meu projeto C ++ e funcionou bem:
fonte