天蓝色功能扩展

Zso*_*chl 5 parallel-processing azure azure-functions

我们使用更重量级的控制台应用程序,使用HTTP触发器和消费服务计划测试了Azure功能的横向扩展功能.所以我们期望通过扩展来实现并行执行.我们在新的AppDomain中执行控制台应用程序,因为funcion实例在同一进程中运行.在控制台应用程序中,我们在内存数据库中执行sqlite数据库操作.

首先我们只执行一次该功能,并测量执行时间.让它成为x :)我们不断开始增加并行线程的数量.我们经历过在这些情况下1个函数app实例的执行时间是x*num_of_threads.好像函数实例已被序列化并且不是并行执行的.

  1. 这可能是什么原因?为什么他们没有并行执行?
  2. 默认情况下有哪些硬件?这很慢.可以在消费计划中以某种方式升级.为什么没有扩大规模?sg可以阻止扩展功能吗?

谢谢你的帮助.

编辑:我的应用程序的基本源代码:

using System.Net;
using System;

public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log, ExecutionContext context)
{

     string testThreadId = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "id", true) == 0)
        .Value;

    var funcId = context.InvocationId.ToString();

    var homePath = Environment.GetEnvironmentVariable("HOME");     


    var folderName = Path.Combine(homePath,@"site\wwwroot\JanoRunTime2");
    var fileName =  Path.Combine(folderName,"AzureFunctionTest.exe");
    var configFile = Path.Combine(folderName,"AzureFunctionTest.exe.config");
    var setup = new AppDomainSetup();
    setup.ApplicationBase = folderName;
    setup.ConfigurationFile = configFile;
    var newDomain = AppDomain.CreateDomain("JanoTestExecutorDomain_" + funcId, null, setup );

 try{

        newDomain.ExecuteAssembly(fileName, new []{testThreadId, funcId});         

        return req.CreateResponse(HttpStatusCode.OK );

    }
    catch(Exception e){
          return req.CreateResponse(HttpStatusCode.InternalServerError);
    }
    finally{
        AppDomain.Unload(newDomain);        

    }

}
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 5

请求是并行执行的,但根据语言存在差异(例如,节点是单线程的)。如果您想要一些工作负载来验证并行执行和扩展,您可以在此处部署解决方案的 github 。

您的函数将在某些条件下扩展到更多实例,但最相关的是吞吐量:Azure Functions 跟踪每单位时间完成的请求数,并在该数字下降时进行扩展。以下是有关消费计划如何运作的一些信息。

至于硬件,函数和无服务器计算的想法是消除开发人员的这种考虑。函数“实例”可以被视为具有 1.5GB 内存的计算单元。如果您想要对硬件有更多控制,您始终可以在应用程序服务计划中运行功能。

由于您的工作负载,您可能会看到这种“序列化”行为。如果您在全新的 AppDomain 中启动依赖于 CPU 的工作负载并返回,该函数可能不会跟踪您仍在执行工作。在这种情况下,您可以在不达到吞吐量扩展条件的情况下最大化 CPU。