DA0039: 매우 높은 비율의 잠금 경합DA0039: Very High Rate of Lock contentions

규칙 IDRule Id DA0039DA0039
범주Category .NET Framework 사용.NET Framework Usage
프로파일링 방법Profiling methods 샘플링Sampling

계측Instrumentation

.NET 메모리.NET Memory
메시지Message .NET 잠금 경합의 비율이 매우 높습니다.A very high rate of .NET Lock contentions is occurring. 동시성 프로필을 실행하여 이 잠금 경합의 원인을 조사하세요.Please investigate the reason for this lock contention by running a Concurrency profile.
규칙 유형Rule type 경고Warning

샘플링, .NET 메모리 또는 리소스 경합 방법을 사용하여 프로파일링할 경우 이 규칙을 트리거하려면 25개 이상의 샘플을 수집해야 합니다.When you profile by using the sampling, .NET memory, or resource contention methods, you must collect at least 25 samples to trigger this rule.

원인Cause

프로파일링 데이터와 함께 수집되는 시스템 성능 데이터가 응용 프로그램 실행 중에 발생한 잠금 경합의 비율이 지나치게 높다는 것을 나타냅니다.System performance data that is collected with the profiling data indicates that an excessively high rate of lock contentions occurred during application execution. 동시성 프로파일링 방법을 통해 다시 프로파일링하여 경합의 원인을 찾아 보세요.Consider profiling again using the concurrency profiling method to find the cause of the contention.

규칙 설명Rule Description

다중 스레드 응용 프로그램에서 한 번에 스레드 하나씩 직렬로 실행되어야 하는 코드의 임계 영역을 보호하는 데 잠금을 사용합니다.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. Microsoft .NET CLR(공용 언어 런타임)는 동기화 및 잠금 기본 형식의 전체 집합을 제공합니다.The Microsoft .NET Common Language Run-time (CLR) provides a full set of synchronization and locking primitives. 예를 들어 C# 언어는 잠금 문(Visual Basic의 경우 SyncLock)을 지원합니다.For example, the C# language supports a lock statement (SyncLock in Visual Basic). 관리되는 응용 프로그램은 System.Threading 네임스페이스에서 Monitor.Enter 및 Monitor.Exit 메서드를 호출하여 잠금을 직접 획득 및 해제할 수 있습니다.A managed application can call the Monitor.Enter and Monitor.Exit methods in the System.Threading namespace to acquire and release a lock directly. .NET Framework는 Mutex, ReaderWriterLock 및 Semaphore를 지원하는 클래스를 비롯하여 추가적인 동기화 및 잠금 기본 형식을 지원합니다.The .NET Framework supports additional synchronization and locking primitives, including classes that support Mutexes, ReaderWriterLocks, and Semaphores. 자세한 내용은 MSDN 웹 사이트에 있는 .NET Framework 개발자 가이드에서 동기화 기본 형식 개요를 참조하세요.For more information, see Overview of Synchronization Primitives in the .NET Framework Developer's Guide on the MSDN Web site. .NET Framework 클래스는 Windows 운영 체제에 기본 제공되는 하위 수준 동기화 서비스 위에 계층화됩니다.The .NET Framework classes are themselves layered over lower level synchronization services built into the Windows operating system. 이러한 클래스에는 임계 영역 개체와 많은 다양한 Wait 및 이벤트 알림 함수가 포함됩니다.These include critical section objects and many different Wait and event signaling functions. 자세한 내용은 MSDN 라이브러리에서 Win32 및 COM 개발의 Synchronization(동기화) 섹션을 참조하세요.For more information, see the Synchronization section of Win32 and COM Development in the MSDN Library

동기화와 잠금에 사용되는 기본적인 .NET Framework 클래스와 네이티브 Windows 개체는 둘 다 연동 작업을 사용하여 변경해야 하는 공유 메모리 위치입니다.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. 연동 작업은 공유 메모리 위치에서 작동하는 하드웨어 관련 명령을 사용하여 원자성 작업을 통해 해당 상태를 변경합니다.Interlocked operations use hardware-specific instructions that operate on shared memory locations to change their state using atomic operations. 원자성 작업은 컴퓨터의 모든 프로세서에서 일관성이 있어야 합니다.Atomic operations are guaranteed to be consistent across all processors in the machine. Lock 및 WaitHandle은 설정되거나 재설정될 때 자동으로 연동 작업을 사용하는 .NET 개체입니다.Locks and WaitHandles are .NET objects that automatically use interlocked operations when they are set or reset. 스레드로부터 안전한 방식으로 업데이트하기 위해 연동 작업을 사용해야 하는 응용 프로그램에 다른 공유 메모리 데이터 구조가 있을 수 있습니다.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. 자세한 내용은 MSDN 라이브러리의 .NET Framework 섹션에서 연동 작업을 참조하세요.For more information, see Interlocked Operations in the .NET Framework section of the MSND Library

동기화와 잠금은 다중 스레드 응용 프로그램이 제대로 실행되게 하는 데 사용되는 메커니즘입니다.Synchronization and locking are mechanisms used to ensure that multi-threading applications execute correctly. 다중 스레드 응용 프로그램의 각 스레드는 운영 체제에 의해 독립적으로 예약되는 독립 실행 단위입니다.Each thread of a multi-threaded application is an independent execution unit that is scheduled independently by the operating system. 또 다른 스레드가 잠금을 유지하고 있기 때문에 잠금 획득을 시도하는 스레드가 지연될 때마다 잠금 경합이 발생합니다.A lock contention occurs whenever a thread that is trying to acquire a lock is delayed because another thread is holding the lock.

잠금이 빈번히 중첩됩니다.Locks are frequently nested. 임계 영역을 실행하는 스레드가 나중에 또 다른 잠금이 필요한 함수를 실행할 경우 중첩이 발생합니다.Nesting occurs when a thread executing a critical section performs a function that then requires another lock. 일부 잠금 중첩은 피할 수 없습니다.Some amount of lock nesting is unavoidable. 임계 영역은 스레드로부터 안전할 수 있도록 잠금에 의존하는 .NET Framework 메서드를 호출할 수 있습니다.Your critical section may call a .NET Framework method that relies on locks to ensure it is thread-safe. 응용 프로그램의 일부 임계 영역에서 다른 잠금 핸들을 통해 잠기는 Framework 메서드를 호출하면 잠금이 중첩됩니다.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. 중첩된 잠금 조건이 있으면 해결하고 수정하기가 너무 어려운 성능 문제가 발생할 수 있습니다.Nested locking conditions can lead to performance problems that are notoriously difficult to unravel and fix.

프로파일링 실행 중에 수집된 측정값이 잠금 경합 수가 지나치게 많다는 것을 나타낼 경우 이 규칙이 실행됩니다.This rule fires when measurements taken during a profiling run indicate there is a excessively high amount of lock contention. 잠금 경합은 잠금을 기다리고 있는 스레드의 실행을 지연시킵니다.Lock contentions delay the execution of threads that are waiting for the lock. 저사양 하드웨어에서 실행되는 부하 테스트나 단위 테스트의 잠금 경합 수가 적더라도 잠금 경합을 조사해야 합니다.Even fairly small amounts of lock contention in unit tests or in load tests running on lower end hardware should be investigated.

참고

프로파일링 데이터에서 보고된 잠금 경합 비율이 높지만 과도하지 않으면 이 경고 메시지 대신 DA0038: 높은 비율의 잠금 경합 경고 메시지가 실행됩니다.When the rate of reported lock contentions in the profiling data is significant but not excessive, the DA0038: High Rate of Lock contentions information message is fired instead of this warning message.

경고를 조사하는 방법How to Investigate a Warning

메시지를 두 번 클릭하여 프로파일링 데이터의 표시 뷰로 이동합니다.Double-click the message to navigate to the Marks view of the profiling data. .NET CLR LocksAndThreads\Contention Rate / sec 열을 찾습니다.Find the .NET CLR LocksAndThreads\Contention Rate / sec column. 다른 단계보다 잠금 경합 수가 더 많은 특정 프로그램 실행 단계가 있는지 확인합니다.Determine if there are specific phases of program execution where lock contention is heavier than other phases.

동시성 프로파일링 방법을 사용하지 않을 경우에만 이 규칙이 실행됩니다.This rule fires only when you are not using the concurrency profiling method. 동시성 프로파일링 방법은 응용 프로그램에서 잠금 경합에 관련된 성능 문제를 진단할 때 사용할 가장 좋은 도구입니다.The concurrency profiling method is the best tool to use to diagnose performance problems related to lock contention in your application. 동시성 프로파일링 데이터를 수집하여 응용 프로그램의 잠금 동작을 파악합니다.Collect concurrency profiling data to understand the locking behavior of your application. 어떤 잠금이 아주 많이 경합되는지, 경합된 잠금을 기다리는 스레드의 실행 시간이 지연되는 기간, 특정 코드의 의미 등을 파악해야 합니다.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. 동시성 프로필은 네이티브 Windows 기능 및 .NET Framework 클래스의 잠금 동작과 응용 프로그램이 참조하는 기타 모든 타사 라이브러리의 잠금 동작을 포함하여 모든 잠금 경합에 대한 데이터를 수집합니다.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. Visual StudioVisual Studio IDE의 동시성 프로파일링에 대한 자세한 내용은 스레드 및 프로세스 동시성 데이터 수집을 참조하세요.For information about concurrency profiling from the Visual StudioVisual Studio IDE, see Collecting Thread and Process Concurrency Data. 명령줄의 동시성 프로파일링 정보에 대한 링크는 명령줄에서 프로파일링 방법 사용동시성 방법을 사용하여 리소스 경합 및 스레드 작업 데이터 수집 섹션을 참조하세요.For links to information about concurrency profiling from the command line, see the Using the Concurrency Method to Collect Resource Contention and Thread Activity Data section of Using Profiling Methods From the Command Line.