Pergunta

Estou trabalhando em um programa de fundo que estará em execução por um longo tempo e tenho um programa de registro externo (SmartInspec) que eu quero alimentar com alguns valores periodicamente, para monitorá -lo em tempo real ao depurar.

Eu sei que posso simplesmente iniciar vários programas, como o gerente de tarefas ou o iarsn taskinfo, mas gostaria de manter tudo em meu próprio programa para isso, pois também quero adicionar algumas regras simples, como se o programa use mais do que X% CPU, sinalize isso no log.

Eu tenho um tópico em segundo plano que alimenta periodicamente algumas estatísticas ao SmartInspec, como consumo de memória, conjunto de trabalho, etc.

É possível que este tópico obtenha uma medida razoavelmente precisa de quanto dos recursos da CPU do computador consome? O programa principal é um aplicativo de thread único (além do tópico do watchdog que registra estatísticas), portanto, se uma técnica for limitada a quanto usa um único fio Então isso seria bom também.

Encontrei algumas entradas relacionadas a algo chamado rusage Para Linux e C. Existe algo semelhante que eu possa usar para isso?


Editar: OK, eu tentei o The Performance Counter Way, mas ele adicionou bastante GC-Data cada vez chamado, então o gráfico para uso de memória e coleta de lixo disparou. Acho que vou deixar essa parte por enquanto.

Foi útil?

Solução

Você também pode usar Diagnóstico do sistema.Process.TotalProcessorTime e Diagnóstico do sistema.ProcessThread.TotalProcessorTime propriedades para calcular o uso do seu processador como este artigo descreve.

Outras dicas

Dê uma olhada em System.Diagnostics.PerformanceCounter. Se você correr para cima perfmon.exe, você verá a gama de contadores de desempenho disponíveis para você (defina o 'objeto de desempenho' como 'Process'), um dos quais é '% de tempo do processador'.

Você pode através da classe System.Diagnostic.PerformAncecounter. Aqui está um exemplo de alguém que monitorou o uso da CPU:

http://blogs.msdn.com/dotnetinterop/archive/2007/02/02/system-diagnostics-performanCounter-and-processor-time-on-multi-core-or-cpu-cpu.aspx

Observe que isso requer privilégios elevados. E pode haver um desempenho de desempenho usando -o.

É bom que você esteja registrando para monitores como o SmartInspec. Mas o próprio Windows reúne os dados para cada recurso, neste caso, seu programa (ou processo). O WMI é o padrão para o monitoramento de aplicativos. Podemos visualizar os dados capturados pelo WMI. Muitas ferramentas de gerenciamento de aplicativos, monitoramento da saúde ou monitoramento de aplicativos suportam o WMI fora da caixa.

Portanto, eu não recomendaria que você registre seu uso da CPU no aplicativo em um arquivo de log.

Se você acha que a disponibilidade e o desempenho são críticos, opte por soluções como a solução do Microsoft Operations Manager.

Para ter uma idéia sobre o WMI e obter a lista de processos, veja abaixo: - Win32_PerfFormattedData_PerfProc_Process Para obter o tempo da CPU, o filtro é ProcessIdVeja este artigo- Você pode obter o ProcessID da classe Win32_Process.

WMI facilitado para C# Por Kevin Matthew Goss

oConn.Username = "JohnDoe";
oConn.Password = "JohnsPass";

System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);    

//get Fixed disk stats
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

//Execute the query 
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery);

//Get the results
ManagementObjectCollection oReturnCollection = oSearcher.Get();   

//loop through found drives and write out info
foreach( ManagementObject oReturn in oReturnCollection )
{
    // Disk name
    Console.WriteLine("Name : " + oReturn["Name"].ToString());
    // Free Space in bytes
    Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString());
    // Size in bytes
    Console.WriteLine("Size: " + oReturn["Size"].ToString());
} 

Você também pode monitorar o processo do sistema remoto.

Este artigo do projeto de código descreve como usar o timer de alto desempenho:

http://www.codeproject.com/kb/cs/highperformancetimercshar.aspx

Você pode usá -lo para cronometrar a execução do seu código.

Aqui você pode encontrar vários perfils de código aberto C#:

http://csharp-source.net/open-source/profile

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top