在Azure中,为什么在多个Web站点上运行时,单个存储帐户中的同一个WebJob不能扩展?

Tra*_*hen 5 azure azure-webjobs

我目前正在尝试将处理器密集型模拟任务划分为几百个在Azure中并行处理的块.我认为Azure WebSites提供易于设置的专用虚拟机和WebJobs,其易于使用的存储队列抽象符合我的法案.

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

  • 单个存储帐户
  • 一个带有作业描述的存储队列
  • 具有静态数据的存储容器
  • 结果的存储容器(每个作业的唯一文件)
  • n(例如8)"标准"网站,意味着有n个不同的*.azurewebsites.net URI
  • 每个WebSite上的一个WebJob使用WebJobs SDK(JobHost)连续运行(示例中为8个WebJobs)
  • 每个职位描述<1k
  • 每个作业包含大约10万个Blob输入数据
  • 每个结果大约是100k的Blob输出数据
  • 通过当前缩放,每个作业运行大约一分半钟

这是工作的签名.

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
)
Run Code Online (Sandbox Code Playgroud)

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

我期望看到的是每个WebSite都会从队列中找到一份工作,运行它,将结果发布到容器中并接受下一个工作.

我实际看到的是,只有一个WebSite实际上正在运行作业,而其余的只是闲置,尽管WebJob报告为在每个站点上启动和运行.最终结果是每分钟完成的作业数量与一个WebSite相同.这是一个运行日志,其中两个WebSites"决定"参与运行的作业:simulation-log.zip.连接字符串中提到的存储帐户已被删除,因此我没有从日志中删除访问密钥.

我已经为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);
}
Run Code Online (Sandbox Code Playgroud)

秒表显示时间为1:15,2:27,3:43等.但是一些花费比预期更长的工作也显示了秒表的预计时间.但是,在这两种情况下,运行另一个WebSite上的作业而不是在存储的结果容器中运行结果.最后,每分钟完成的工作数量不会改变.

更新

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

这并没有帮助.

看起来我还有一个单独的处理器必须在我创建的任何WebSite上运行所有WebJobs,无论它们有多独立.我已经创建了一个CPU时间的图像,如门户网站所示: 门户网站中显示的CPU时间

Tra*_*hen 0

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

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

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

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

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

现在,一切都按预期进行。