2

在我尝试清除的过程中,DiagnosticMonitorConfiguration我尝试了以下方法:

  • 重启(唯一)webrole 实例
  • 重新启动 IIS 应用程序池(通过 RDP => IIS 管理器)
  • 重新部署了网络角色
  • 修改 global.asax 代码 => 重新部署

DirectoryConfiguration但是我仍然在 DiagnosticMonitorConfiguration 的目录数据源中看到了额外的成员副本。这些额外的副本是在Application_Start()每次 IIS 线程退役(20 分钟空闲时间)时调用 global.asax 时意外添加的。我已经复制粘贴了 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 诊断概述

实施 Windows Azure 诊断时应考虑以下事项:

  • 配置信息存储在/wad-control-container/deploymentID/rolename/roleinstance下的 Windows Azure blob 存储中的 XML 文件中

配置保存在当前部署的 blob 存储中的 XML 文件中。在您调用的代码GetCurrentConfiguration中,它将加载此 XML 文件。然后你会一遍又一遍地添加目录(这意味着每次回收都会尝试将目录添加到当前配置中)。

GetCurrentConfiguration当您尝试修改远程设置时非常有用(即:您想在部署应用程序后添加一些性能计数器)。如果你总是调用GetDefaultInitialConfiguration(); 你将从一个干净的石板开始。

PS:试着把这段代码放在WebRole.cs中,这样它只会在你的实例启动时执行一次,而不会在每次启动时减慢应用程序池的速度。

于 2012-10-30T14:50:01.903 回答