Share via


Monitoramento de recursos do domínio de aplicativo

Recurso do domínio de aplicativo de monitoramento (ARM) permite que os hosts monitorar o uso de CPU e memória por domínio de aplicativo. Isso é útil para hosts como o ASP.NET que usam muitos domínios de aplicativo em um processo de execução demorada. O host pode descarregar o domínio de aplicativo de um aplicativo que está afetando negativamente o desempenho de todo o processo, mas somente se ele pode identificar o aplicativo problemático. BRAÇO fornece informações que podem ser usadas para ajudar na criação de tais decisões.

Por exemplo, um serviço de hospedagem pode ter muitos aplicativos em execução em um aplicativo ASP.NET server. Se um aplicativo no processo de começar a consumir muita memória ou muito tempo do processador, o serviço de hospedagem pode usar o BRAÇO para identificar o domínio de aplicativo que está causando o problema.

BRAÇO é suficientemente leve para usar em aplicativos em tempo real. Você pode acessar as informações usando o rastreamento de eventos do Windows (ETW) ou diretamente por meio de APIs gerenciadas ou nativas.

Ativando o recurso de monitoramento

Pode ser habilitado o BRAÇO de quatro maneiras: fornecendo um arquivo de configuração quando o common language runtime (CLR) é iniciado, usando um gerenciado API de hospedagem, usando código gerenciado, ou ouvir eventos ETW do BRAÇO.

Assim que o BRAÇO estiver habilitado, ele começa a coleta de dados em todos os domínios de aplicativo no processo. Se um domínio de aplicativo foi criado antes de BRAÇO está ativado, dados cumulativos inicia quando o BRAÇO é habilitado, não quando o domínio de aplicativo foi criado.Quando estiver habilitado, o BRAÇO não pode ser desativado.

  • Você pode ativar o BRAÇO na inicialização do CLR, adicionando a <appDomainResourceMonitoring> elemento para o arquivo de configuração e a configuração do enabled atributo para true. Um valor de false (padrão) significa apenas que o BRAÇO não está ativado na inicialização; Você pode ativá-lo mais tarde, usando um dos mecanismos de ativação.

  • O host pode habilitar o BRAÇO solicitando a ICLRAppDomainResourceMonitor interface de hospedagem. Depois que esta interface é obtida com êxito, o BRAÇO é ativado.

  • Código gerenciado pode habilitar o BRAÇO definindo estática (Shared em Visual Basic) AppDomain.MonitoringIsEnabled propriedade para true. Assim que a propriedade é definida, o BRAÇO está habilitado.

  • Você pode ativar o BRAÇO após a inicialização, ouvindo eventos ETW. BRAÇO está ativado e começa a geração de eventos para todos os domínios de aplicativo quando você habilita o provedor público Microsoft-Windows-DotNETRuntime usando o AppDomainResourceManagementKeyword palavra-chave. Para correlacionar dados com domínios de aplicativos e segmentos, você deve habilitar também o Microsoft-Windows-DotNETRuntimeRundown provedor com o ThreadingKeyword palavra-chave.

Usando ARM

BRAÇO fornece o tempo total do processador usado por um domínio de aplicativo e os três tipos de informações sobre o uso de memória.

  • Total de tempo do processador para um domínio de aplicativo, em segundos: Isso é calculado somando-se os tempos de thread informados pelo sistema operacional para todos os segmentos gasto em tempo de execução no domínio do aplicativo durante seu ciclo de vida. Bloqueado ou threads em suspensão não usam o tempo do processador. Quando um thread chama-se em código nativo, o tempo que o thread gasta em código nativo está incluído na contagem para o domínio de aplicativo onde a chamada foi feita.

  • Total de alocações gerenciadas, feitas por um domínio de aplicativo durante seu ciclo de vida, em bytes: Alocações total não sempre refletem o uso de memória por um domínio de aplicativo, pois os objetos alocados podem ser de curta duração. No entanto, se um aplicativo aloca e libera grandes quantidades de objetos, o custo das alocações pode ser significativo.

  • Gerenciado de memória, em bytes, que é referenciado por um domínio de aplicativo e que sobreviveram o mais recente completo, bloqueando a coleção: Esse número é preciso somente após uma completa coleção de bloqueio. (Isso é em contraste com coleções simultâneas, o que ocorrem em segundo plano e não bloquear o aplicativo). Por exemplo, o GC.Collect() causas de sobrecarga do método por completo, bloqueando a coleção.

  • Total de memória gerenciada, em bytes, que é referenciado pelo processo e que sobreviveram o mais recente completo, bloqueando a coleção: A memória sobrevivida para domínios de aplicativos individuais pode ser comparada a esse número.

Determinar quando completo, bloqueando a coleção ocorre.

Para determinar quando as contagens de memória sobrevivida são precisas, você precisa saber quando uma coleção completa, o bloqueio ocorreu apenas. O método para fazer isso depende da API, você pode usar para examinar as estatísticas do BRAÇO.

API gerenciada

Se você usar as propriedades da AppDomain classe, você pode usar o GC.RegisterForFullGCNotification método para registrar a notificação de coleções de total. O limite que você usar não é importante, porque estão aguardando a conclusão de uma coleção em vez de usar a abordagem de uma coleção. Você pode então chamar o GC.WaitForFullGCComplete método, que bloqueia até que tenha concluído a uma coleção inteira. Você pode criar um thread que chama o método em um loop e faz as análises necessárias, sempre que o método retorna.

Como alternativa, você pode chamar o GC.CollectionCount método periodicamente para verificar se a contagem de coletas da geração 2 aumentou. Dependendo da freqüência de polling, essa técnica pode não fornecer tão precisa uma indicação da ocorrência de uma coleção inteira.

API de hospedagem.

Se você usar a API de hospedagem não gerenciada, seu host deve passar o CLR uma implementação de IHostGCManager interface. As chamadas CLR da IHostGCManager::SuspensionEnding método quando ele continua a execução de segmentos que foram suspensas enquanto ocorre a uma coleção. O CLR passa a geração da coleção concluída como um parâmetro do método, para que o host possa determinar se a coleção foi completa ou parcial. A implementação da IHostGCManager::SuspensionEnding método pode consultar para memória sobrevivida, para garantir que as contagens são recuperadas, assim que elas são atualizadas.

Consulte também

Referência

AppDomain.MonitoringIsEnabled

Interface de ICLRAppDomainResourceMonitor

<appDomainResourceMonitoring>

Conceitos

Eventos ETW CLR