現在、プロセッサを集中的に使用するシミュレーション タスクを、Azure 内で並列処理される数百のチャンクに分割しようとしています。セットアップが簡単な専用仮想マシンを提供する Azure Web サイトと、ストレージ キューを介した使いやすい抽象化を備えた Web ジョブが、私の請求書に完全に適合すると考えました。
次の Azure セットアップがあり、実行するたびにコードによって新しく作成されます
- 単一のストレージ アカウント
- ジョブ記述のある 1 つのストレージ キュー
- 静的データを含むストレージ コンテナー
- 結果のストレージ コンテナー (ジョブごとに一意のファイル)
- n (たとえば 8) "標準" Web サイト。つまり、n 個の異なる *.azurewebsites.net URI があります。
- WebJobs SDK (JobHost) を使用して、各 WebSite で 1 つの WebJob を継続的に実行 (この例では 8 つの WebJob)
- 各ジョブの説明は 1,000 未満
- 各ジョブは、約 100k の Blob 入力データで構成されます
- 各結果は約 100k の Blob-output-data です
- 現在のスケーリングでは、各ジョブは約 1 分半実行されます
これがジョブの署名です。
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
)
次にコードは、WebSite ローカルのジョブ固有のディレクトリをセットアップし、実行可能ファイルを含む zip アーカイブを抽出し、この実行可能ファイルを Process.Start で実行して、キャプチャした出力を BLOB に書き込みます。プロセスがアクセスするものはすべて、マシン上で利用できます。debug TextWriter は、ジョブ内のタイミング情報をキャプチャするためのものです。
私が期待していたのは、各 Web サイトがキューからジョブを取得して実行し、結果をコンテナーにポストして、次のジョブを取得するということでした。
私が実際に見ているのは、WebJob が開始され、各サイトで実行されていると報告されているにもかかわらず、1 つの WebSite だけが実際にジョブを実行しており、残りの WebSite はアイドル状態であるということです。正味の結果は、1 つの Web サイトの場合と同じ 1 分あたりのジョブ数です。これは、2 つの Web サイトが実行中のジョブに参加することを「決定」した実行のログです: Simulation-log.zip。接続文字列に記載されているストレージ アカウントは既に削除されているため、ログからアクセス キーを削除しませんでした。
WebJob にいくつかのタイミング インストルメンテーションを追加しました。その結果、実行可能ファイルの実行には、「通常の」実行にかかる時間の 2 倍または 3 倍 (ほぼ正確に) かかる場合があることがわかります。
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 などの時間が表示されます。ただし、予想よりも時間がかかるジョブの中には、ストップウォッチに予想される時間も表示されるものがあります。ただし、どちらの場合も、代わりに別の Web サイトのジョブが実行され、ストレージの結果コンテナーに結果が表示されます。結局、1 分間に終了するジョブの数は変わりません。
アップデート
今日、私はさらに一歩進んで、Web サイトごとに個別のストレージ アカウントを作成し、8 つの Web サイトのそれぞれに対して 8 つのストレージ アカウントの 8 つのキュー間でジョブを手動で分散しました。つまり、私の外部の観点からは、同じコードを偶然実行した以外に共通点は何もありませんでした。
これは役に立ちませんでした。
独立性に関係なく、私が作成する Web サイトですべての Web ジョブを実行する必要がある単一のプロセッサがあるように見えます。ポータルに表示されているように、CPU 時間のイメージを作成しました。