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

ロックは、マルチスレッド アプリケーション内で、一度に 1 つのスレッドで連続的に実行する必要があるコードのクリティカル セクションを保護するために使用されます。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: Common Language Run-time) には、同期とロックのプリミティブの完全なセットが用意されています。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 は、ミューテックス、ReaderWriter ロック、およびセマフォをサポートするクラスをはじめとする、追加の同期と競合のプリミティブをサポートします。The .NET Framework supports additional synchronization and locking primitives, including classes that support Mutexes, ReaderWriterLocks, and Semaphores. 詳細については、MSDN Web サイトの .NET Framework 開発者ガイドの「Overview of Synchronization Primitives」 (同期プリミティブの概要) を参照してください。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. これらには、クリティカル セクション オブジェクト、および多数のさまざまな待機機能やイベント通知機能が含まれます。These include critical section objects and many different Wait and event signaling functions. 詳細については、MSDN ライブラリの Win32 および COM 開発の同期に関するセクションを参照してください。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. Locks と WaitHandles は、設定およびリセットされるときに自動的にインタロックされた操作を使用する .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 のセクションの「Interlocked Operations」 (インタロックされた操作) を参照してください。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.