Azure functions Azure函数的吞吐量低

Azure functions Azure函数的吞吐量低,azure-functions,Azure Functions,我正在评估Azure函数以创建缩略图。较大图像的源URL放在存储队列中,使用带有队列触发器的C#函数处理URL(从源下载、调整大小并上载到另一个位置) 每个函数调用的处理时间不超过500毫秒,这很好。然而,在运行了一系列测试之后,我发现总体并行处理吞吐量并没有那么高。由于队列中的工作负载为1500-2000项,平台每秒仅执行10个功能实例 有没有办法向外扩展并使平台同时执行更多的功能实例?在消耗(动态)计划下运行时,当我们看到您的功能没有跟上时,系统将自动向外扩展到更多实例。这种扩展不是即时的,

我正在评估Azure函数以创建缩略图。较大图像的源URL放在存储队列中,使用带有队列触发器的C#函数处理URL(从源下载、调整大小并上载到另一个位置)

每个函数调用的处理时间不超过500毫秒,这很好。然而,在运行了一系列测试之后,我发现总体并行处理吞吐量并没有那么高。由于队列中的工作负载为1500-2000项,平台每秒仅执行10个功能实例


有没有办法向外扩展并使平台同时执行更多的功能实例?

消耗(动态)计划下运行时,当我们看到您的功能没有跟上时,系统将自动向外扩展到更多实例。这种扩展不是即时的,因此可能是在添加更多实例之前或之后不久,您的测试就结束了,然后才能看到这些新实例的效果。在应用程序服务(经典版)计划中运行时,您可以预先控制实例的数量,并可以扩展到所需的数量

您可以在
host.json
文件中为队列设置一些配置旋钮,这些旋钮会影响每个函数应用程序实例的并行度。在
队列
配置部分,您可以设置
batchSize
newBatchThreshold
,例如:

{
   "queues": {
      "batchSize": 32,
      "newBatchThreshold": 50
    }
}
batchSize
是每次提取时从队列中提取的消息数。然后并行处理批处理中的所有消息
newBatchThreshold
控制下一批邮件的提取时间。只有当当前正在处理的消息数量低于此阈值时,才会从队列中获取新的一批消息。因此,增加
newBatchThreshold
将允许并行处理更多的消息。有关这些设置的详细信息,请参见wiki

请注意,在调整这些设置时,您必须考虑您的工作负载。例如,如果您的函数非常占用内存/CPU,则不能在单个实例上并行运行太多的函数。所以你可能需要做一些实验


除上述所有功能外,您还应确保您的函数是一个适当的
异步
函数,以确保线程不会在IO上被不必要地阻塞,并且函数代码本身不存在其他潜在瓶颈。

消耗(动态)计划下运行时,当我们看到您的功能无法跟上时,系统将自动扩展到更多实例。这种扩展不是即时的,因此可能是在添加更多实例之前或之后不久,您的测试就结束了,然后才能看到这些新实例的效果。在应用程序服务(经典版)计划中运行时,您可以预先控制实例的数量,并可以扩展到所需的数量

您可以在
host.json
文件中为队列设置一些配置旋钮,这些旋钮会影响每个函数应用程序实例的并行度。在
队列
配置部分,您可以设置
batchSize
newBatchThreshold
,例如:

{
   "queues": {
      "batchSize": 32,
      "newBatchThreshold": 50
    }
}
batchSize
是每次提取时从队列中提取的消息数。然后并行处理批处理中的所有消息
newBatchThreshold
控制下一批邮件的提取时间。只有当当前正在处理的消息数量低于此阈值时,才会从队列中获取新的一批消息。因此,增加
newBatchThreshold
将允许并行处理更多的消息。有关这些设置的详细信息,请参见wiki

请注意,在调整这些设置时,您必须考虑您的工作负载。例如,如果您的函数非常占用内存/CPU,则不能在单个实例上并行运行太多的函数。所以你可能需要做一些实验


除上述所有功能外,您还应确保您的函数是一个适当的
异步
函数,以确保线程不会在IO上被不必要地阻塞,并且您的函数代码本身不存在其他潜在的瓶颈。

您能分享您的function.json和一些函数代码吗?另外,请澄清您正在运行的计划(消费/应用程序服务)。您可以分享您的function.json和一些功能代码吗?此外,请澄清您正在运行的计划(消费/应用程序服务)。