gpt4 book ai didi

azure - 在 Azure 中,为什么在多个网站上运行时,从单个存储帐户运行的同一个 WebJob 无法扩展?

转载 作者:行者123 更新时间:2023-12-03 17:49:18 25 4
gpt4 key购买 nike

我目前正在尝试将处理器密集型模拟任务划分为数百个 block ,并在 Azure 中并行处理。我认为 Azure 网站提供易于设置的专用虚拟机和 WebJobs,以及易于使用的存储队列抽象,非常适合我的需求。

我有以下 Azure 设置,每次运行时都会由我的代码重新创建它

  • 单个存储帐户
  • 一个带有作业描述的存储队列
  • 包含静态数据的存储容器
  • 结果的存储容器(每个作业都有唯一的文件)
  • n 个(例如 8 个)“标准”网站,意味着有 n 个不同的 *.azurewebsites.net URI
  • 使用 WebJobs SDK (JobHost) 连续运行每个网站上的一个 WebJob(示例中为 8 个 WebJob)
  • 每个职位描述为 <1k
  • 每个作业包含大约 100k 个 Blob 输入数据
  • 每个结果约为 100k Blob-output-data
  • 按照当前的扩展规模,每个作业运行大约一分半钟

这是作业的签名。

public static void RunGeant4Simulation(
[QueueTrigger("simulationjobs")] JobDescription jobDescription,
[Blob("input/{Archive}", FileAccess.Read)] Stream archive,
[Blob("result/{Name}-{Energy}-output.zip", FileAccess.Write)] Stream output,
[Blob("result/{Name}-{Energy}-log.dat")] TextWriter debug
)

然后,代码继续设置网站本地、特定于作业的目录,提取包含可执行文件的 zip 存档,使用 Process.Start 运行此可执行文件,并将捕获的输出写入 blob。进程访问的所有内容都在机器上可用。调试 TextWriter 用于捕获作业中的计时信息。

我期望看到的是每个网站都会从队列中获取一个作业,运行它,将结果发布到容器中并获取下一个作业。

我实际上看到的是,只有一个网站实际上正在运行作业,而其余的网站则处于闲置状态,尽管据报告 WebJob 已在每个站点上启动并运行。最终结果是每分钟完成的作业数量与一个网站完成的作业数量相同。以下是运行日志,其中两个网站“决定”参与运行作业:simulation-log.zip 。连接字符串中提到的存储帐户已被删除,因此我没有从日志中删除访问 key 。

我在 WebJob 中添加了一些计时工具,从中我可以看到,有时运行可执行文件需要花费“正常”运行时间的两倍或三倍(几乎完全一样)

stopwatch.Start();
using (var process = Process.Start(processStartInfo))
{
debug.WriteLine("After Starting Process: {0}", DateTime.UtcNow);
var outputData = process.StandardOutput.ReadToEnd();

process.WaitForExit();

stopwatch.Stop();
debug.WriteLine("Process Finished: {0} {1}", DateTime.UtcNow, stopwatch.Elapsed);

outputBytes = Encoding.UTF8.GetBytes(outputData);
}

秒表显示 1:15、2:27、3:43 等时间。但一些比预期时间长的作业也会在秒表上显示预期时间。但是,在这两种情况下,都会运行另一个网站上的作业,并在存储的结果容器中显示结果。最终,每分钟完成的作业数量不会改变。

更新

今天,我更进一步,为每个网站创建了一个单独的存储帐户,并在 8 个存储帐户中的 8 个队列之间手动分配作业,每个队列对应 8 个网站之一。这意味着从我的外部角度来看,除了偶然运行相同的代码之外,没有任何共同点。

没有有帮助。

看起来我仍然只有一个处理器,必须在我创建的任何网站上运行所有 WebJobs,无论它们有多独立。我创建了 CPU 时间的图像,如门户中所示:CPU Time as shown in the portal

最佳答案

我对 Azure 网站的想法实际上是错误的,这就是我感到困惑的原因:

在非免费网站中,有两件事是完全独立扩展的

  • 可用于所有这些网站(SDK 中的“ServerFarm”)的计算能力。这意味着您选择机器大小(从小到大)和其中的数量(“实例”),这些实例负责运行您的所有基本或标准网站。
  • 在 URI(例如 ASP.NET、PHP 或 WebJobs)上运行的软件

在我看来,网站直接链接到支持它们的虚拟机,但没有直接连接。

我现在有一个包含 n 个大型实例的 ServerFarm。在此 ServerFarm 中,有 n 个网站。每个WebSite有5个WebJobs,这样Large实例中的4个Processor就可以得到充分利用。

现在,一切都按预期扩展。

关于azure - 在 Azure 中,为什么在多个网站上运行时,从单个存储帐户运行的同一个 WebJob 无法扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24762994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com