2

をパージDiagnosticMonitorConfigurationしようとして、次のことを試しました。

  • (唯一の)Webroleインスタンスの電源を入れ直しました
  • IISアプリプールを再起動しました(RDP => IISマネージャー経由)
  • Web ロールを再デプロイしました
  • global.asax コードを変更 => 再デプロイ

DirectoryConfigurationしかし、DiagnosticMonitorConfiguration のディレクトリ データ ソース内にメンバーの余分なコピーがまだ表示されます。これらの余分なコピーは、IIS スレッドがリタイアするたびに global.asaxApplication_Start()が呼び出されたときに誤って追加されました (20 分のアイドル時間)。それらがどのように追加されたかを示すBUGGYコードをコピーして貼り付けました(最終的に、のような例外が発生しましたOverallQuotaInMB is 150MB but sum of requested sub-quotas is 850MB)。

質問: 重複している理由がわかりました。ただし、上記の箇条書きのアクションを試しても、DiagnosticMonitorConfiguration がパージされないのはなぜですか? 正確にどのように状態が永続化されていますか? Azure テーブルまたは Azure SQL でなければならないとしか思えませんが、それは単なる推測です。

// called from global.asax's Application_Start()
    public bool Initialize()
    {

        RoleInstanceDiagnosticManager roleInstanceDiagnosticManager = getRoleInstanceDiagnosticManager();
        config = roleInstanceDiagnosticManager.GetCurrentConfiguration();

        if (config == null) 
            config = DiagnosticMonitor.GetDefaultInitialConfiguration();


        LocalResource localResource = RoleEnvironment.GetLocalResource("MyAppLogFolder");
        DirectoryConfiguration dirConfig = new DirectoryConfiguration();
        dirConfig.Container = "myapplog-blob";
        dirConfig.DirectoryQuotaInMB = localResource.MaximumSizeInMegabytes;
        dirConfig.Path = localResource.RootPath;

        // This is a BUG, keeps adding duplicate entries
        config.Directories.DataSources.Add(dirConfig);

        limitOtherDefaultDirSizes(config); // limits overall quota to 150MB
        config.Directories.ScheduledTransferPeriod = TimeSpan.FromMinutes(10.0);

        roleInstanceDiagnosticManager.SetCurrentConfiguration(config); 

        return true;
    }

リモート デバッグは、DiagnosticMonitorConfiguration データ構造が次のようになっていることを示しています。ここで重複がはっきりとわかり、例外が保証されます。

- config    {Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorConfiguration}
-  Directories  {Microsoft.WindowsAzure.Diagnostics.DirectoriesBufferConfiguration}
-    DataSources Count = 85 System.Collections.Generic.IList<Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration> 
+     [0] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}
+     [1] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}
+     [2] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}
-     [3] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}
        Container   "myapplog-blob" string
        DirectoryQuotaInMB  10  int
        Path    "C:\\Resources\\directory\\73c8a6bf9a5e434ab3d0c44034e7b7e9.MyAPP.API.MyAppLogFolder\\" string
-     [4] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}   
        Container   "myapplog-blob" string
        DirectoryQuotaInMB  10  int
        Path    "C:\\Resources\\directory\\73c8a6bf9a5e434ab3d0c44034e7b7e9.MyAPP.API.MyAppLogFolder\\" string
+     [5] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}   
...
+     [84] {Microsoft.WindowsAzure.Diagnostics.DirectoryConfiguration}
4

1 に答える 1

5

MSDN の次の記事を参照してください: Windows Azure Diagnostics の概要

Windows Azure Diagnostics を実装するときは、次の点を考慮する必要があります。

  • 構成情報は、 /wad-control-container/deploymentID/rolename/roleinstance の下の Windows Azure BLOB ストレージの XML ファイルに保存されます 。

構成は、現在のデプロイの BLOB ストレージ内の XML ファイルに保持されます。あなたのコードGetCurrentConfigurationでは、この XML ファイルをロードします。そして、ディレクトリを何度も追加し続けます (つまり、リサイクルごとに現在の構成にディレクトリを追加しようとします)。

GetCurrentConfiguration設定をリモートで変更しようとしている場合 (つまり、アプリのデプロイ後にパフォーマンス カウンターを追加したい場合) に最適です。常にGetDefaultInitialConfiguration();を呼び出す場合。白紙の状態から始めます。

PS: このコードを WebRole.cs に配置してみてください。そうすれば、インスタンスの起動時に 1 回だけ実行され、起動するたびにアプリケーション プールの速度が低下することはありません。

于 2012-10-30T14:50:01.903 に答える