DA0038: taxa alta de contenções de bloqueioDA0038: High rate of lock contentions

ID de regraRule Id DA0038DA0038
CategoriaCategory Uso do .NET Framework.NET Framework Usage
Método de criação de perfilProfiling method AmostragemSampling

InstrumentaçãoInstrumentation

Memória do .NET.NET Memory
MensagemMessage Uma alta taxa de contenções de Bloqueio do .NET está ocorrendo.A high rate of .NET Lock contentions is occurring. Investigue o motivo dessa contenção de bloqueio executando um perfil de Simultaneidade.Please investigate the reason for this lock contention by running a Concurrency profile.
Tipo de regraRule type InformaçõesInformation

Ao criar o perfil usando a amostragem, a memória do .NET ou métodos de contenção de recursos, é necessário coletar pelo menos 25 amostras para disparar essa regra.When you profile by using the sampling, .NET memory, or resource contention methods, you must collect at least 25 samples to trigger this rule.

CausaCause

Os dados de desempenho do sistema coletados com os dados de criação de perfil indicam que ocorreu uma taxa consideravelmente alta de contenções de bloqueio durante a execução do aplicativo.System performance data that is collected with the profiling data indicates that a significantly high rate of lock contentions occurred during application execution. Considere uma nova criação de perfil usando o método de criação de perfil de simultaneidade para descobrir a causa das contenções.Consider profiling again using the concurrency profiling method to find the cause of the contentions.

Descrição da regraRule description

Os bloqueios são usados para proteger seções críticas do código que devem ser executadas em série por um thread por vez em um aplicativo multi-threaded.Locks are used to protect critical sections of code that must be executed serially by one thread at a time in a multi-threaded application. O CLR (Common Language Runtime) do Microsoft .NET fornece um conjunto completo de primitivos de sincronização e bloqueio.The Microsoft .NET Common Language Run-time (CLR) provides a full set of synchronization and locking primitives. Por exemplo, a linguagem C# dá suporte a uma instrução de bloqueio (SyncLock no Visual Basic).For example, the C# language supports a lock statement (SyncLock in Visual Basic). Um aplicativo gerenciado pode chamar os métodos Monitor.Enter e Monitor.Exit no namespace System.Threading para adquirir e liberar um bloqueio diretamente.A managed application can call the Monitor.Enter and Monitor.Exit methods in the System.Threading namespace to acquire and release a lock directly. O .NET Framework dá suporte a primitivos de sincronização e bloqueio adicionais, incluindo classes que dão suporte a Mutexes, ReaderWriterLocks e Semaphores.The .NET Framework supports additional synchronization and locking primitives, including classes that support Mutexes, ReaderWriterLocks, and Semaphores. Para obter mais informações, consulte Visão geral dos primitivos de sincronização no Guia do Desenvolvedor do .NET Framework no site do MSDN.For more information, see Overview of Synchronization Primitives in the .NET Framework Developer's Guide on the MSDN Web site. As classes do .NET Framework são colocadas em camada por conta própria sobre os serviços de sincronização de nível inferior internos do sistema operacional Windows.The .NET Framework classes are themselves layered over lower level synchronization services built into the Windows operating system. Eles incluem objetos de seção crítica e várias funções de sinalização de evento e de Espera diferentes.These include critical section objects and many different Wait and event signaling functions. Para obter mais informações, consulte a seção Synchronization (Sincronização) do Desenvolvimento do Win32 e COM na Biblioteca MSDNFor more information, see the Synchronization section of Win32 and COM Development in the MSDN Library

Subjacentes às classes do .NET Framework e aos objetos nativos do Windows que são usados para sincronização e bloqueio estão os locais de memória compartilhada que devem ser alterados usando operações sincronizadas.Underlying both the .NET Framework classes and native Windows objects that are used for synchronization and locking are shared memory locations that must be changed using interlocked operations. As operações sincronizadas usam instruções específicas ao hardware que operam em locais de memória compartilhada para alterar seu estado usando operações atômicas.Interlocked operations use hardware-specific instructions that operate on shared memory locations to change their state using atomic operations. Operações atômicas têm a garantia de serem consistentes em todos os processadores no computador.Atomic operations are guaranteed to be consistent across all processors in the machine. Locks e WaitHandles são objetos do .NET que usam operações sincronizadas automaticamente quando são definidos ou redefinidos.Locks and WaitHandles are .NET objects that automatically use interlocked operations when they are set or reset. Pode haver outras estruturas de dados de memória compartilhada no aplicativo que também exigem o uso de operações sincronizadas para que sejam atualizadas de uma forma thread-safe.There may be other shared memory data structures in your application that also requires you to use interlocked operations in order to be updated in a thread-safe manner. Para obter mais informações, confira Operações interconectadas na seção do .NET Framework da biblioteca do MSDN.For more information, see Interlocked Operations in the .NET Framework section of the MSDN Library.

A sincronização e o bloqueio são mecanismos usados para garantir que aplicativos de vários threads sejam executados corretamente.Synchronization and locking are mechanisms used to ensure that multi-threading applications execute correctly. Cada thread de um aplicativo multi-threaded é uma unidade de execução independente que é agendada de forma independente pelo sistema operacional.Each thread of a multi-threaded application is an independent execution unit that is scheduled independently by the operating system. Uma contenção de bloqueio ocorre sempre que um thread que está tentando adquirir um bloqueio é atrasado devido a outro thread estar mantendo o bloqueio.A lock contention occurs whenever a thread that is trying to acquire a lock is delayed because another thread is holding the lock.

Os bloqueios são frequentemente aninhados.Locks are frequently nested. O aninhamento ocorre quando um thread que executa uma seção crítica executa uma função que exige outro bloqueio em seguida.Nesting occurs when a thread executing a critical section performs a function that then requires another lock. Alguma quantidade de aninhamento de bloqueio é inevitável.Some amount of lock nesting is unavoidable. A seção crítica pode chamar um método do .NET Framework que se baseia em bloqueios para garantir que ele é thread-safe.Your critical section may call a .NET Framework method that relies on locks to ensure it is thread-safe. Uma chamada de alguma seção crítica do aplicativo em um método Framework que também é bloqueada usando um identificador de bloqueio diferente faz com que os bloqueios sejam aninhados.A call from some critical section in your application into a Framework method that also locks using a different lock handle causes locks to nest. As condições de bloqueio aninhado podem levar a problemas de desempenho que são notoriamente difíceis de serem resolvidos e corrigidos.Nested locking conditions can lead to performance problems that are notoriously difficult to unravel and fix.

Essa regra é acionada quando as medições feitas durante uma execução de criação de perfil indicam que há uma quantidade excessivamente alta de contenções de bloqueio.This rule fires when measurements taken during a profiling run indicate there is an excessively high amount of lock contention. As contenções de bloqueio atrasam a execução de threads que estão aguardando o bloqueio.Lock contentions delay the execution of threads that are waiting for the lock. Até mesmo pequenas quantidades de contenção de bloqueio em testes de unidade ou em testes de carga em execução em um hardware de extremidade inferior devem ser investigadas.Even fairly small amounts of lock contention in unit tests or in load tests running on lower end hardware should be investigated.

Note

Quando a taxa de contenções de bloqueio relatadas nos dados de criação de perfil é excessivamente alta, a mensagem de aviso DA0039: taxa muito alta de contenções de bloqueio é acionada em vez dessa mensagem de informações.When the rate of reported lock contentions in the profiling data is excessively high, the DA0039: Very High Rate of Lock contentions warning message is fired instead of this information message.

Como investigar um avisoHow to investigate a warning

Clique duas vezes na mensagem para navegar para a exibição Marcas dos dados de criação de perfil.Double-click the message to navigate to the Marks view of the profiling data. Encontre a coluna .NET CLR LocksAndThreads\Taxa de contenção/s.Find the .NET CLR LocksAndThreads\Contention Rate / sec column. Determine se há fases específicas da execução do programa em que a contenção de bloqueio é mais pesada do que em outras fases.Determine if there are specific phases of program execution where lock contention is heavier than other phases.

Essa regra é acionada somente quando o método de criação de perfil de simultaneidade não está sendo usado.This rule fires only when you are not using the concurrency profiling method. O método de criação de perfil de simultaneidade é a melhor ferramenta a ser usada para diagnosticar problemas de desempenho relacionados à contenção de bloqueio em seu aplicativo.The concurrency profiling method is the best tool to use to diagnose performance problems related to lock contention in your application. Colete dados de criação de perfil de simultaneidade para entender o comportamento de bloqueio do aplicativo.Collect concurrency profiling data to understand the locking behavior of your application. Isso inclui entender quais bloqueios têm uma contenção pesada, por quanto tempo a execução do thread é atrasada aguardando bloqueios com contenção e qual código específico está envolvido.This includes understanding which locks are heavily contended, how long thread execution time is delayed waiting for contended locks, and what specific code is implicated. Os perfis de simultaneidade coletam dados em todas as contenções de bloqueio, incluindo o comportamento de bloqueio de instalações nativas do Windows, classes do .NET Framework e todas as outras bibliotecas de terceiros referenciadas pelo aplicativo.Concurrency profiles collects data on all lock contentions, including the locking behavior of native Windows facilities, .NET Framework classes, and any other third-party libraries your application references. Para obter informações sobre a criação de perfil de simultaneidade com base na IDE do Visual StudioVisual Studio, confira Coletar dados de simultaneidade de thread e do processo.For information about concurrency profiling from the Visual StudioVisual Studio IDE, see Collect thread and process concurrency data. Para obter links para informações sobre criação de perfil de simultaneidade por meio da linha de comando, confira a seção Use the concurrency method to collect resource contention and thread activity data (Usar o método de simultaneidade para coletar a contenção de recursos e dados de atividade de thread) de Use profiling methods from the command line (Usar métodos de criação de perfil da linha de comando).For links to information about concurrency profiling from the command line, see the Use the concurrency method to collect resource contention and thread activity data section of Use profiling methods from the command line.