问题描述
在本次测试的Function App中,创建了三个Function App使用同一个App Service Plan资源。
当资源出现High CPU的问题时候,如何来快速定位是哪一个资源占用了CPU资源呢?
因为Function App公开的指标中,并不能观察到CPU状态。
那么,还是其它办法吗?
问题解答
有的。
启用Application Insights。 在它的Live Metrics中,可以直接查看每一个Function App的资源状态!
详细步骤是
1) 把三个Function App都启动Application Insights并配置到同一个Application Insights资源中
2) 进入Application Insights页面,选择Live Metrics功能
3) 根据Role进行过滤,分别查看每一个App的CPU指标
参考资料
如何为 Azure Functions 配置监视 : https://docs.azure.cn/zh-cn/azure-functions/configure-monitoring?tabs=v2
附录:提供三段简单的C#代码
1:占用CPU
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; namespace mytest.Function { public class CpuIntensiveFunction { private readonly ILogger<CpuIntensiveFunction> _logger; public CpuIntensiveFunction(ILogger<CpuIntensiveFunction> logger) { _logger = logger; } [Function("CpuIntensiveFunction")] public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req) { _logger.LogInformation("C# HTTP trigger function processed a request."); int times = 100; if (req.Query.TryGetValue("times", out var timesQuery)) int.TryParse(timesQuery, out times); long result = Fibonacci(times); _logger.LogInformation($"Calculated Fibonacci({times}): {result}"); return new OkObjectResult("Welcome to Azure Functions!"); } static long Fibonacci(int n) { if (n <= 1) return n; return Fibonacci(n - 1) + Fibonacci(n - 2); } } }
2:占用Memory
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; namespace mytest.Function { public class MemoryIntensiveFunction { private readonly ILogger<MemoryIntensiveFunction> _logger; public MemoryIntensiveFunction(ILogger<MemoryIntensiveFunction> logger) { _logger = logger; } [Function("MemoryIntensiveFunction")] public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req) { _logger.LogInformation("C# HTTP trigger function processed a request."); int size = 100_000_000; // 分配一个大的数组 byte[] largeArray = new byte[size]; for (int i = 0; i < size; i++) { largeArray[i] = (byte)(i % 256); } _logger.LogInformation("Memory allocation completed."); return new OkObjectResult("Welcome to Azure Functions!"); } } }
3:普通代码
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; namespace mytest.Function { public class SimpleFunction { private readonly ILogger<SimpleFunction> _logger; public SimpleFunction(ILogger<SimpleFunction> logger) { _logger = logger; } [Function("SimpleFunction")] public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req) { _logger.LogInformation("C# HTTP trigger function processed a request."); return new OkObjectResult("Welcome to Azure Functions!"); } } }
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!