天蓝色功能横向扩展
Posted
技术标签:
【中文标题】天蓝色功能横向扩展【英文标题】:azure function scale out 【发布时间】:2016-12-02 11:30:32 【问题描述】:我们使用更重量级的控制台应用、HTTP 触发器和消费服务计划测试了 Azure Functions 的横向扩展功能。因此,我们期望具有横向扩展的并行执行。我们在一个新的 AppDomain 中执行控制台应用程序,因为函数实例在同一个进程中运行。在控制台应用程序中,我们对内存数据库执行 sqlite 数据库操作。
首先我们只执行了 1 次函数,并测量了执行时间。让它成为 x :) 我们不断增加并行线程的数量。我们体验到在这些情况下 1 个函数应用实例的执行时间是 x * num_of_threads。就好像函数实例已经被序列化而不是并行执行一样。
-
这可能是什么原因?为什么它们不并行执行?
默认有哪些硬件?它很慢。是否可以在消费计划中以某种方式升级。为什么没有横向扩展? 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);
【问题讨论】:
【参考方案1】:请求是并行执行的,但根据语言存在差异(例如,节点是单线程的)。如果您想要一些工作负载来验证并行执行和扩展,您可以在 github 上部署解决方案 here。
您的函数将在某些条件下扩展到更多实例,但最相关的是吞吐量:Azure Functions 会跟踪每单位时间内完成的请求数量,并在该数量下降时进行扩展。 Here 是关于消费计划如何运作的一些信息。
至于硬件,Functions 和无服务器计算的想法是消除开发人员的这种考虑。可以将函数“实例”视为具有 1.5GB 内存的计算单元。如果您想更好地控制硬件,您可以随时在应用服务计划中运行功能。
由于您的工作量,您可能会看到这种“序列化”行为。如果您在全新的 AppDomain 中启动依赖于 CPU 的工作负载并返回,该函数可能无法跟踪您仍在工作。在这种情况下,您可以在不达到吞吐量扩展条件的情况下最大化 CPU。
【讨论】:
嗨,谢谢。因此,我在新的应用程序域中执行我的东西本身可能是一个问题吗?或者只有当我异步执行它时?我使用了 AppDomain.ExecuteAssembly,据我所知是同步的。 看AppDomain.ExecuteAssembly,它实际上并没有创建一个新的AppDomain并且看起来是同步运行的,所以应该会进行缩放。查看您的测试代码以尝试重现会很有用。此外,为了消除任何混淆,Azure Functions 将正确处理异步调用。我能想象到潜在问题的唯一情况是从函数中产生全新的进程/AppDomains/线程,而不是等待它们完成。 我添加了我的应用程序的源代码。我认为这是一个新的 appdomain 创建和控制台应用程序同步执行。以上是关于天蓝色功能横向扩展的主要内容,如果未能解决你的问题,请参考以下文章