Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Využití prostředků můžete maximalizovat na menším počtu výpočetních uzlů ve fondu spuštěním více než jednoho úkolu současně na každém uzlu.
I když některé scénáře fungují nejlépe se všemi prostředky uzlu vyhrazenými pro jeden úkol, některé úlohy můžou mít kratší dobu úloh a nižší náklady, když tyto zdroje sdílí více úkolů. Zvažte následující scénáře:
- Minimalizujte přenos dat pro úlohy, které můžou sdílet data. Poplatky za přenos dat můžete výrazně snížit zkopírováním sdílených dat do menšího počtu uzlů a následným paralelním prováděním úloh na každém uzlu. Tato strategie platí zejména v případě, že data, která se mají zkopírovat do každého uzlu, musí být přenesena mezi geografickými oblastmi.
- Maximalizujte využití paměti pro úlohy, které vyžadují velké množství paměti, ale pouze v krátkých časových obdobích a v proměnných během provádění. K efektivnímu zpracování takových špiček můžete použít méně výpočetních uzlů, ale větší výpočetní uzly s větší pamětí. Tyto uzly mají několik paralelních úloh spuštěných na každém uzlu, ale každý úkol může využít výhod paměti uzlů v různých časech.
- Zmírnit omezení počtu uzlů v případě, že se vyžaduje komunikace mezi uzly v rámci fondu. Pooly nakonfigurované pro komunikaci mezi uzly jsou v současné době omezeny na 50 výpočetních uzlů. Pokud je každý uzel v takovém fondu schopen paralelně spouštět úkoly, může být spuštěn větší počet úkolů současně.
- Replikace místního výpočetního clusteru, například při prvním přesunu výpočetního prostředí do Azure Pokud vaše aktuální místní řešení provádí více úloh na výpočetní uzel, můžete zvýšit maximální počet úloh uzlů, abyste tuto konfiguraci přesněji zrcadlili.
Ukázkový scénář
Představte si například aplikaci úloh s požadavky na procesor a paměť tak, aby Standard_D1 uzly byly dostatečné. K dokončení úlohy v požadovaném čase je však potřeba 1 000 těchto uzlů.
Místo použití Standard_D1 uzlů, které mají jedno jádro procesoru, můžete použít Standard_D14 uzly, které mají 16 jader a povolit paralelní provádění úloh. Místo 1 000 uzlů můžete potenciálně použít 16krát méně uzlů, bude potřeba jenom 63. Pokud se pro každý uzel vyžadují velké soubory aplikací nebo referenční data, zlepší se doba trvání úlohy a efektivita, protože se data kopírují jenom do 63 uzlů.
Povolení paralelního provádění úloh
Výpočetní uzly nakonfigurujete pro paralelní spouštění úloh na úrovni fondu. S knihovnou Batch .NET nastavte vlastnost CloudPool.TaskSlotsPerNode při vytváření fondu. Pokud používáte rozhraní REST API služby Batch, nastavte element taskSlotsPerNode v textu požadavku během vytváření fondu.
Poznámka:
Během vytváření fondu můžete nastavit pouze element taskSlotsPerNode a vlastnost TaskSlotsPerNode. Poté, co už byl fond vytvořen, není možné je upravit.
Azure Batch umožňuje nastavit sloty úloh na uzel až (4x) počet jader uzlů. Pokud je například fond nakonfigurovaný s uzly s velikostí Large (čtyři jádra), taskSlotsPerNode může být nastavena na 16. Bez ohledu na to, kolik jader uzel má, ale nemůžete mít více než 256 slotů úkolů na jeden uzel. Podrobnosti o počtu jader pro každou velikost uzlů najdete v tématu Velikosti cloudových služeb (Classic). Další informace o omezeních služeb najdete v tématu Kvóty a limity služby Batch.
Návod
Při vytváření vzorce automatického škálování pro fond se ujistěte, že berete v úvahu hodnotu taskSlotsPerNode. Například vzorec, který vyhodnocuje $RunningTasks , může být výrazně ovlivněn nárůstem úkolů na uzel. Další informace najdete v tématu Vytvoření automatického vzorce pro škálování výpočetních uzlů ve fondu Batch.
Určení distribuce úkolů
Při povolování souběžných úloh je důležité určit, jak se mají úkoly distribuovat mezi uzly ve fondu.
Pomocí vlastnosti CloudPool.TaskSchedulingPolicy můžete určit, že úkoly by se měly rovnoměrně přiřazovat napříč všemi uzly ve fondu ("šíření"). Nebo můžete stanovit, že co nejvíce úkolů by mělo být přiřazeno každému uzlu v rámci fondu, než se úkoly začnou přiřazovat k jiným uzlům ("balení").
Představte si například fond uzlů Standard_D14 (v předchozím příkladu), který je nakonfigurovaný s hodnotou CloudPool.TaskSlotsPerNode 16. Pokud je CloudPool.TaskSchedulingPolicy nakonfigurovaný s použitím ComputeNodeFillTypePack, maximalizuje využití všech 16 jader každého uzlu a umožní fondu automatického škálování odebrat nepoužívané uzly (uzly bez přiřazených úkolů) z fondu. Automatické škálování minimalizuje využití prostředků a může ušetřit peníze.
Definování slotů proměnných za úkol
Úlohu lze definovat pomocí vlastnosti CloudTask.RequiredSlots a určit, kolik slotů vyžaduje ke spuštění na výpočetním uzlu. Výchozí hodnota je 1. Pokud mají vaše úkoly různé váhy spojené s jejich využitím prostředků na výpočetním uzlu, můžete nastavit proměnné sloty úloh. Sloty proměnných úloh umožňují každému výpočetnímu uzlu rozumný počet souběžných spuštěných úloh bez zahlcení systémových prostředků, jako je procesor nebo paměť.
Například u fondu s vlastností taskSlotsPerNode = 8 můžete odesílat úlohy náročné na CPU vyžadující více jader requiredSlots = 8, zatímco další úlohy lze nastavit na requiredSlots = 1. Když je tato smíšená úloha naplánovaná, úlohy náročné na procesor běží výhradně na svých výpočetních uzlech, zatímco ostatní úlohy můžou běžet souběžně (až osm úloh najednou) na jiných uzlech. Smíšená úloha vám pomůže vyvážit zatížení mezi výpočetními uzly a zlepšit efektivitu využití prostředků.
Ujistěte se, že nezadáte hodnotu úkolu requiredSlots větší než hodnotu fondu taskSlotsPerNode, jinak se úkol nikdy nespustí. Služba Batch v současné době neověřuje tento konflikt při odesílání úkolů. Konflikt se neověřuje, protože v době odeslání úloha nemusí být spojena s žádným fondem nebo může být přesunuta do jiného fondu zakázáním a následným povolením.
Návod
Při použití proměnných slotů úloh je možné, že velké úlohy s více požadovanými sloty se dočasně nepodaří naplánovat, protože na jakémkoli výpočetním uzlu není k dispozici dostatek slotů, i když jsou na některých uzlech stále nečinné sloty. U těchto úkolů můžete zvýšit prioritu úlohy, abyste zvýšili jejich šanci soutěžit o dostupné sloty na uzlech.
Služba Batch vygeneruje úkol TaskScheduleFailEvent v případě, že se nepodaří naplánovat spuštění úkolu a bude opakovat plánování, dokud nebudou k dispozici požadované sloty. Tuto událost si můžete poslechnout, abyste zjistili potenciální problémy s plánováním úkolů a odpovídajícím způsobem je zmírnit.
Příklad batch .NET
Následující fragmenty kódu rozhraní API služby Batch .NET ukazují, jak vytvořit fond s více sloty úkolů na uzel a jak odeslat úkol s požadovanými sloty.
Vytvoření fondu s více sloty úkolů na jeden uzel
Tento fragment kódu ukazuje požadavek na vytvoření fondu, který obsahuje čtyři uzly s povolenými čtyřmi sloty úkolů pro každý uzel. Určuje zásadu plánování úkolů, která vyplní každý uzel úkoly před přiřazením úkolů k jinému uzlu ve fondu.
Další informace o přidávání fondů pomocí rozhraní API služby Batch .NET naleznete v tématu BatchClient.PoolOperations.CreatePool.
CloudPool pool =
batchClient.PoolOperations.CreatePool(
poolId: "mypool",
targetDedicatedComputeNodes: 4
virtualMachineSize: "standard_d1_v2",
VirtualMachineConfiguration: new VirtualMachineConfiguration(
imageReference: new ImageReference(
publisher: "MicrosoftWindowsServer",
offer: "WindowsServer",
sku: "2019-datacenter-core",
version: "latest"),
nodeAgentSkuId: "batch.node.windows amd64");
pool.TaskSlotsPerNode = 4;
pool.TaskSchedulingPolicy = new TaskSchedulingPolicy(ComputeNodeFillType.Pack);
pool.Commit();
Vytvořte úkol s požadovanými sloty
Tento fragment kódu vytvoří úlohu s nevýchozím requiredSlots. Tato úloha se spustí, když je na výpočetním uzlu k dispozici dostatek volných slotů.
CloudTask task = new CloudTask(taskId, taskCommandLine)
{
RequiredSlots = 2
};
Výpis výpočetních uzlů s počtem spuštěných úloh a slotů
Tento fragment kódu zobrazí seznam všech výpočetních uzlů ve fondu a vytiskne počty spuštěných úloh a slotů úkolů na uzel.
ODATADetailLevel nodeDetail = new ODATADetailLevel(selectClause: "id,runningTasksCount,runningTaskSlotsCount");
IPagedEnumerable<ComputeNode> nodes = batchClient.PoolOperations.ListComputeNodes(poolId, nodeDetail);
await nodes.ForEachAsync(node =>
{
Console.WriteLine(node.Id + " :");
Console.WriteLine($"RunningTasks = {node.RunningTasksCount}, RunningTaskSlots = {node.RunningTaskSlotsCount}");
}).ConfigureAwait(continueOnCapturedContext: false);
Výpis počtu úkolů pro úlohu
Tento fragment kódu získá počty úkolů pro úlohu, což zahrnuje počty úkolů i slotů úkolů podle jednotlivých stavů úkolů.
TaskCountsResult result = await batchClient.JobOperations.GetJobTaskCountsAsync(jobId);
Console.WriteLine("\t\tActive\tRunning\tCompleted");
Console.WriteLine($"TaskCounts:\t{result.TaskCounts.Active}\t{result.TaskCounts.Running}\t{result.TaskCounts.Completed}");
Console.WriteLine($"TaskSlotCounts:\t{result.TaskSlotCounts.Active}\t{result.TaskSlotCounts.Running}\t{result.TaskSlotCounts.Completed}");
Příklad služby Batch REST
Následující fragmenty kódu rozhraní REST API služby Batch ukazují, jak vytvořit fond s více úkolovými sloty na každý uzel a jak odeslat úkol s požadovaným počtem slotů.
Vytvoření fondu s více sloty úkolů pro každý uzel
Tento fragment kódu ukazuje požadavek na vytvoření fondu, který obsahuje dva velké uzly s maximálně čtyřmi úkoly na uzel.
Další informace o přidávání fondů pomocí rozhraní REST API najdete v tématu Přidání fondu do účtu.
{
"odata.metadata":"https://myaccount.myregion.batch.azure.com/$metadata#pools/@Element",
"id":"mypool",
"vmSize":"large",
"virtualMachineConfiguration": {
"imageReference": {
"publisher": "canonical",
"offer": "ubuntuserver",
"sku": "20.04-lts"
},
"nodeAgentSKUId": "batch.node.ubuntu 20.04"
},
"targetDedicatedComputeNodes":2,
"taskSlotsPerNode":4,
"enableInterNodeCommunication":true,
}
Vytvořte úkol s požadovanými sloty
Tento fragment kódu ukazuje požadavek na přidání úkolu s nedefaultem requiredSlots. Tato úloha se spustí jenom v případě, že na výpočetním uzlu je k dispozici dostatek volných slotů.
{
"id": "taskId",
"commandLine": "bash -c 'echo hello'",
"userIdentity": {
"autoUser": {
"scope": "task",
"elevationLevel": "nonadmin"
}
},
"requiredSLots": 2
}
Ukázka kódu na GitHubu
Projekt ParallelTasks na GitHubu znázorňuje použití vlastnosti CloudPool.TaskSlotsPerNode .
Tato konzolová aplikace jazyka C# používá knihovnu Batch .NET k vytvoření fondu s jedním nebo více výpočetními uzly. Provede konfigurovatelný počet úloh na těchto uzlech pro simulaci proměnné zatížení. Výstup z aplikace ukazuje, které uzly spustily jednotlivé úlohy. Aplikace také poskytuje souhrn parametrů úlohy a doby trvání.
Následující příklad ukazuje souhrnnou část výstupu ze dvou různých spuštění ukázkové aplikace ParallelTasks. Doby trvání úloh uvedené zde nezahrnují čas vytvoření fondu, protože každá úloha byla odeslána do dříve vytvořeného fondu, jehož výpočetní uzly byly v době odeslání v nečinnosti .
První spuštění ukázkové aplikace ukazuje, že s jedním uzlem ve fondu a výchozím nastavením jednoho úkolu na uzel je doba trvání úlohy přes 30 minut.
Nodes: 1
Node size: large
Task slots per node: 1
Max slots per task: 1
Tasks: 32
Duration: 00:30:01.4638023
Druhý běh vzorku ukazuje významné snížení doby trvání úlohy. Toto snížení je způsobeno tím, že fond byl nakonfigurován se čtyřmi úkoly na uzel, což umožnilo, aby se úkoly prováděly paralelně a dokončily úlohu téměř za necelou čtvrtinu doby.
Nodes: 1
Node size: large
Task slots per node: 4
Max slots per task: 1
Tasks: 32
Duration: 00:08:48.2423500