2016-12-02 101 views
3

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

首先我们只执行一次函数,并测量执行时间。让它成为x :) 我们不断发起并行线程数量的增加。我们发现在这些情况下,1个函数应用程序实例的执行时间是x * num_of_threads。就好像函数实例已经被序列化并且不被并行执行一样。

  1. 这是什么原因?为什么它们不是平行执行的?
  2. 默认情况下有哪些硬件?这很慢。它可以在消费计划中以某种方式升级。为什么它没有缩小?可以阻止扩大功能?

感谢您的帮助。

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

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);   

    } 

} 

回答

3

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

在一些条件下,您的函数将扩展到更多实例,但最相关的是吞吐量:Azure函数会跟踪每单位时间内完成的请求数量,如果该数目下降,则会扩展。 Here是关于消费计划如何工作的一些信息。

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

您可能因为工作量而看到这种“序列化”行为。如果您在全新的AppDomain中启动了一个与CPU相关的工作负载并返回,该函数可能无法跟踪您仍在工作的内容。在这种情况下,您可以在不达到吞吐量调整条件的情况下最大化CPU。

+0

嗨,谢谢。因此,我可以成为一个问题本身,我执行我的东西在一个新的AppDomain?或者只有当我执行它异步?我使用的AppDomain.ExecuteAssembly,据我所知是同步。 –

+0

看着[AppDomain.ExecuteAssembly](https://msdn.microsoft.com/en-us/library/sxx9f4c2(v = vs.110).aspx),它实际上并没有创建一个新的AppDomain并且似乎运行同步,所以应该发生缩放。看到你的测试代码试图重现将是有用的。 此外,为了消除任何混淆,Azure函数将正确处理异步调用。唯一可以想象潜在问题的场景是从函数产生全新的进程/ AppDomain /线程,而不是等待完成。 –

+0

我添加了我的应用程序的源代码。我认为这是一个新的appdomain创建和控制台应用程序同步执行。 –