• English日本語한국어
  • ログイン今すぐ開始

この機械翻訳は参考用に提供されます。

英語版と翻訳版に矛盾がある場合は、英語版が優先されます。詳細については、こちらのページをご覧ください。

問題を作成する

高いAppDomain.GetData()ロック競合(.NET Framework)

問題

.NET エージェントが高スループットの .NET Framework アプリケーションに接続されている場合、数人の顧客から、高いスレッド競合が発生することが報告されました。プロセス ダンプとスタック トレースを確認すると、多くのスレッドが AppDomain.GetData()の呼び出しによってブロックされている可能性があります。

考えられる解決策

.NET エージェントのバージョン 9.7では、.NET エージェントによる AppDomain ストレージの使用を無効にする新しい環境変数が導入されました。

NEW_RELIC_DISABLE_APPDOMAIN_CACHING=true

注意

この環境変数は、エージェントの AppDomain.GetData()呼び出しによるロック競合を排除しますが、この環境変数が有効になっていると、.NET エージェントの合計オーバーヘッドが増加します。私たちのテストでは、ロックは減少しましたが、テスト アプリケーションに接続された .NET エージェントの最大アプリケーション スループットは低下しました。

この新しい構成オプションを試して、この問題が発生しているお客様からのフィードバックに非常に関心があります。この構成オプションを試してみる場合は、 GitHubリポジトリに.NETの問題を作成して、経験を説明してください。

原因

.NET エージェントは、メソッドを計測するためにメソッド署名情報にアクセスする必要があります。.NET Framework アプリケーションのデフォルトでは、エージェントはこのメソッド情報をリフレクション経由でロードし、将来の使用に備えて AppDomain にキャッシュします。これは一般的な最適化を目的としていますが、一部のお客様はこの動作に関連してスレッド ロックの高い競合を経験しており、これがサービスが遅くなったり応答しなくなったりする根本原因であると考えています。

Microsoft のソース コードを検査した後、実際に AppDomain.GetData() を呼び出すとグローバル ロックが発生します。

.NETエージェントは.NETCoreアプリケーションに対してメソッド情報キャッシュスキームをまったく使用せず、同様のスレッドロック競合の問題を報告した顧客はいないため、.NETでエージェントが同じように機能するように環境変数を公開することにしました。フレームワークアプリケーション。

Copyright © 2024 New Relic Inc.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.