Compartilhar via


DA0039: taxa muito alta de contenções de bloqueio

Identificação da Regra

DA0039

Categoria

uso do .NET Framework

Analisando métodos

Preparação de exemplos

Instrumentação

Memória de .NET

Message (Mensagem)

Uma taxa muito alta de disputas de bloqueio do .NET está ocorrendo.Investigue o motivo pelo suporte para essa contenção de bloqueio executando um perfil de simultaneidade.

Tipo de regra

Aviso

Quando você analisa usando a amostragem, a memória .NET ou os métodos de contenção de recurso, você deve coletar pelo menos 25 amostras para disparar esta regra.

Causa

Os dados de desempenho do sistema coletados com os dados de perfil que indicam excessivamente - a taxa alta de disputas de bloqueio ocorreu durante a execução do aplicativo.Considere analisar novamente usando a simultaneidade que analisa o método para localizar a causa da contenção.

Descrição da Regra

Os bloqueios são usados para proteger as seções críticos de código que devem ser executadas em série por um thread de cada vez em um aplicativo multi-threaded.Microsoft .NET framework Common Language Runtime (CLR) fornece um conjunto completo das primitivas de sincronização e de bloqueio.Por exemplo, a linguagem C# oferece suporte a uma instrução de bloqueio (SyncLock no Visual Basic).Um aplicativo gerenciado pode chamar os métodos de Monitor.Enter e de Monitor.Exit no namespace de System.Threading para adquirir diretamente e liberar um bloqueio.O.NET Framework oferece suporte aos primitivos adicionais de sincronização e de bloqueio, incluindo as classes que oferecem suporte, Mutexes ReaderWriterLocks, e dois semáforos.Para Visão geral das primitivas de sincronização obter mais informações, consulte na Guia do Desenvolvedor do .NET Framework. no site do MSDN.As próprias classes do .NET Framework são colocadas em camadas sobre os serviços de sincronização de nível inferior criados no sistema operacional Windows.Esses incluem objetos da seção crítica e funções muito diferentes de sinalização de espera e do evento.Para Sincronização obter mais informações, consulte a seção do Win32 e do COM na Biblioteca MSDN

Subjacentes das classes do .NET Framework e objetos nativos do windows que são usados para sincronização e o bloqueio é os locais de memória compartilhada que devem ser modificados usando operações bloqueadas.As operações bloqueadas usam as instruções específicas do hardware que operam locais de memória sobre compartilhados para alterar seu estado que usa operações atômicas.As operações atômicas têm a garantia de ser consistentes em todos os processadores no computador.Os bloqueios e WaitHandles são objetos .NET que automaticamente o uso bloqueado operações quando são definidas ou redefinidas.Pode haver outras estruturas de dados compartilhadas de memória em seu aplicativo também requer que o usar operações bloqueadas para ser atualizado em um modo seguro para threads.Para Operações bloqueadas obter mais informações, consulte na seção do .NET Framework de biblioteca de MSND

A sincronização e o bloqueio são mecanismos usados para garantir que os aplicativos de várias threading executados corretamente.Cada thread de um aplicativo multi-threaded é uma unidade de execução independente que foi agendada independente pelo sistema operacional.Uma contenção de bloqueio ocorre sempre que um thread que está tentando adquirir um bloqueio é atrasado porque outro thread está mantendo o bloqueio.

Os bloqueios são aninhados com frequência.O aninhamento ocorre quando um thread que executa uma seção crítica executa uma função que requer em outro bloqueio.Qualquer quantidade de aninhamento de bloqueio é inevitável.A seção crítica pode chamar um método do.NET Framework que depende de bloqueios para garantir que é thread-safe.Uma chamada de qualquer seção crítica em seu aplicativo em um método da estrutura que também os bloqueios que usam um identificador diferente de bloqueio cause a bloqueios ao aninhamento.Aninhado bloquear condições pode resultar em problemas de desempenho que são notòria difíceis de desembaraçar e corrigir.

Esta regra é disparada quando as medidas calculadas durante analisar executado indica que há a excessivamente - a quantidade alta de contenção de bloqueio.As disputas de bloqueio atrasam a execução de threads que estão aguardando o bloqueio.Mesmo razoavelmente as pequenas quantidades de contenção de bloqueio em testes de unidade ou no teste de carga que executam no hardware mais baixo de extremidade inferior devem ser investigadas.

ObservaçãoObservação

Quando a taxa de disputas relatadas de bloqueio na criação de perfis de dados é significante mas não excessiva, a mensagem de informações de DA0038: taxa alta de contenções de bloqueio será acionada em vez dessa mensagem de aviso.

Como investigar um aviso

Clique duas vezes na mensagem para navegar até a exibição de Marcas de dados de perfil. Localizar a coluna de .NET CLR LocksAndThreads \ taxa de contenção/sec .Determine se há etapas específicas de execução do programa onde a contenção de bloqueio é pesada mais do que as outras fases.

Esta regra é acionado somente quando você não estiver usando a simultaneidade que analisa o método.A simultaneidade que analisa o método é a melhor ferramenta a ser usada para diagnosticar problemas de desempenho relacionados à contenção de bloqueio em seu aplicativo.Coletar dados de perfil de simultaneidade para compreender o comportamento de bloqueio de seu aplicativo.Isso inclui a compreensão de bloqueios são altamente disputados, de quanto tempo o tempo de execução de thread são posteriores aguardando bloqueios disputados e, que código específico é indicado.Os perfis de simultaneidade coletam dados em todas as disputas de bloqueio, inclusive o comportamento de bloqueio de recursos nativos do windows, o .NET Framework classificará, e todas as outras bibliotecas de terceiros suas referências de aplicativo.Para obter informações sobre simultaneidade que analisa de Visual Studio IDE, consulte Coletando dados de simultaneidade do thread e do processo.Para links para informações sobre a simultaneidade que analisa de linha de comando, consulte a seção de Using the Concurrency Method to Collect Resource Contention and Thread Activity Data de Usando métodos da criação de perfil para coletar dados de desempenho a partir da linha de comando.