Tra*_*hen 5 azure azure-webjobs
我目前正在尝试将处理器密集型模拟任务划分为几百个在Azure中并行处理的块.我认为Azure WebSites提供易于设置的专用虚拟机和WebJobs,其易于使用的存储队列抽象符合我的法案.
我有以下Azure设置,每次运行时都会由我的代码重新创建
这是工作的签名.
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时间的图像,如门户网站所示: 
我对 Azure 网站的想法实际上是错误的,这就是我感到困惑的原因:
在非免费网站中,有两件事是完全独立扩展的
在我看来,网站直接链接到支持它们的虚拟机,但没有直接连接。
我现在有一个包含 n 个大型实例的 ServerFarm。在此 ServerFarm 中,有 n 个网站。每个WebSite有5个WebJobs,这样Large实例中的4个Processor就可以得到充分利用。
现在,一切都按预期进行。
| 归档时间: |
|
| 查看次数: |
1054 次 |
| 最近记录: |