如何查询 Azure 应用服务中的性能指标?

How do I query an indicator of performance capability in an Azure App Service?

我有一些速度较慢的 运行ning 服务在做一些相当繁重的处理。这些进程 运行 在几个不同的地方,包括本地服务器和 Azure 中,并且都将它们的结果写入一个公共数据库。我想在数据库中存储一条与处理结果相关的注释,指示有关处理位置的性能的一些有用信息 运行。

我的本地服务器 运行 以下代码成功,这允许我记录 CPU 名称(例如:我的工作站使用以下代码记录 "AMD Ryzen 9 3900X 12-Core Processor",这是足以满足我们的需求):

    public string GetCpu()
    {
        var searcher = new ManagementObjectSearcher("SELECT Name FROM Win32_Processor");

        string results = "Unknown CPU";
        foreach (var item in searcher.Get())
        {
            results = item["Name"].ToString();
        }

        return results;
    }

如您所料,此代码在 Azure 中 运行 失败并出现权限错误。我可以在 Azure 中 运行 获取有用信息的其他内容是什么,即使不完全相同?我不需要 CPU 名称,只是一个有用的处理能力指标。如果记录了 "P1V1 App Hosting Plan" 之类的内容,那将足以满足我们的需求。我不确定是否有比这更能说明处理能力的东西,但我也愿意接受其他建议。考虑到正在进行的多租户设置,我怀疑在 Azure 中获得 CPU 模型甚至可能具有欺骗性。

有一个简单的方法来获取它,Azure 有一个名为 WEBSITE_SKU 的环境存储主机计划级别。您可以去您的 Kudu 页面查看环境。

您可以使用 Environment.GetEnvironmentVariable("WEBSITE_SKU") 来获取它。


以上示例将为所有级别的 Premium V2 配置输出 "PremiumV2"。这意味着它对 P1V2、P2V2 和 P3V2 具有相同的输出,即使每个 ACU 的数量都是前一个的两倍。幸运的是,其中 there are a number of other environment variables with useful information 可以让我们获得更多信息。有了这些额外的信息,一个以在本地和 Azure 应用服务中都有效的方式收集信息的函数示例可能如下所示:

public string GetComputationalResources()
{
    string results = null;

    try
    {
        var azureSku = Environment.GetEnvironmentVariable("WEBSITE_SKU");
        if (!string.IsNullOrWhiteSpace(azureSku))
        {
            // We're in Azure. Get more information!

            var cpuCount = Environment.GetEnvironmentVariable("NUMBER_OF_PROCESSORS")?.Trim();
            var cpuId = Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER")?.Trim();
            var computeMode = Environment.GetEnvironmentVariable("WEBSITE_COMPUTE_MODE")?.Trim();
            var websiteMode = Environment.GetEnvironmentVariable("WEBSITE_SITE_MODE")?.Trim();
            results = $"{azureSku} {computeMode} {websiteMode} | {cpuCount}x {cpuId}";
        }

    }
    catch
    {
        results = null;
    }

    if (results == null)
    {
        try
        {
            using (var searcher = new ManagementObjectSearcher("SELECT Name FROM Win32_Processor"))
            {
                foreach (var item in searcher.Get())
                {
                    results = item["Name"].ToString().Trim();
                }
            }
        }
        catch
        {
            results = "Unknown CPU";
        }
    }

    return results;
}

示例输出(据我所知,在 Azure 中有可能获得 AMD 而不仅仅是 Intel):

  • 内部部署:AMD Ryzen 9 3900X 12-Core Processor
  • P1V2:PremiumV2 Dedicated | 1x Intel64 Family 6 Model 79 Stepping 1, GenuineIntel
  • P2V2:PremiumV2 Dedicated | 2x Intel64 Family 6 Model 79 Stepping 1, GenuineIntel
  • P3V2:PremiumV2 Dedicated | 4x Intel64 Family 6 Model 79 Stepping 1, GenuineIntel
  • P1: Premium Dedicated | 1x Intel64 Family 6 Model 79 Stepping 1, GenuineIntel
  • P2: Premium Dedicated | 2x Intel64 Family 6 Model 79 Stepping 1, GenuineIntel
  • P3: Premium Dedicated | 4x Intel64 Family 6 Model 79 Stepping 1, GenuineIntel
  • S1: Standard Dedicated | 1x Intel64 Family 6 Model 79 Stepping 1, GenuineIntel
  • S2: Standard Dedicated | 2x Intel64 Family 6 Model 79 Stepping 1, GenuineIntel
  • S3: Standard Dedicated | 4x Intel64 Family 6 Model 79 Stepping 1, GenuineIntel