Feladatok egyidejű futtatása a Batch számítási csomópontok használatának maximalizálása érdekében
A készlet kisebb számú számítási csomópontján maximalizálhatja az erőforrás-használatot, ha egyszerre több feladatot futtat az egyes csomópontokon.
Bár egyes forgatókönyvek egy csomópont egyetlen tevékenységhez dedikált összes erőforrásával működnek a legjobban, bizonyos számítási feladatok rövidebb feladatidőt és alacsonyabb költségeket tapasztalhatnak, ha több tevékenység osztja meg ezeket az erőforrásokat. Vegyük példaként a következő forgatókönyveket:
- Az adatok megosztására képes feladatok adatátvitelének minimalizálása. Jelentősen csökkentheti az adatátviteli díjakat, ha a megosztott adatokat kisebb számú csomópontra másolja, majd párhuzamosan hajtja végre a feladatokat az egyes csomópontokon. Ez a stratégia különösen akkor érvényes, ha az egyes csomópontokra másolandó adatokat át kell helyezni a földrajzi régiók között.
- A nagy mennyiségű memóriát igénylő feladatok memóriahasználatának maximalizálása, de csak rövid időszakokban és a végrehajtás során változó időpontokban. Az ilyen csúcsok hatékony kezeléséhez kevesebb, de nagyobb, több memóriával rendelkező számítási csomópontot alkalmazhat. Ezek a csomópontok több feladattal rendelkeznek, amelyek párhuzamosan futnak az egyes csomópontokon, de minden tevékenység különböző időpontokban kihasználhatja a csomópontok bőséges memóriáját.
- A csomópontok számkorlátainak csökkentése , ha csomópontok közötti kommunikációra van szükség egy készleten belül. Jelenleg a csomópontok közötti kommunikációhoz konfigurált készletek legfeljebb 50 számítási csomópontra korlátozódnak. Ha egy ilyen készlet minden csomópontja képes párhuzamosan végrehajtani a feladatokat, akkor egyszerre több feladat is végrehajtható.
- Helyszíni számítási fürt replikálása, például amikor először helyez át egy számítási környezetet az Azure-ba. Ha a jelenlegi helyszíni megoldás számítási csomópontonként több feladatot hajt végre, növelheti a csomóponttevékenységek maximális számát, hogy jobban tükrözhesse ezt a konfigurációt.
Példaforgatókönyv
Tegyük fel például, hogy egy feladatalkalmazás processzor- és memóriaigényekkel rendelkezik, így Standard_D1 csomópontok elegendőek. Ahhoz azonban, hogy a feladat a szükséges időben befejeződjön, 1000 csomópontra van szükség.
Ahelyett, hogy egy processzormaggal rendelkező Standard_D1 csomópontokat használna, használhat Standard_D14 egyenként 16 maggal rendelkező csomópontokat, és engedélyezheti a párhuzamos feladatvégrehajtást. 1000 csomópont helyett 16-szor kevesebb csomópontot használhat, csak 63 csomópontra lenne szükség. Ha minden csomóponthoz nagy alkalmazásfájlokra vagy referenciaadatokra van szükség, a feladat időtartama és hatékonysága javul, mivel az adatok csak 63 csomópontra lesznek másolva.
Párhuzamos feladatvégrehajtás engedélyezése
A számítási csomópontokat a készlet szintjén konfigurálja a párhuzamos feladatvégrehajtáshoz. A Batch .NET-kódtárral állítsa be a CloudPool.TaskSlotsPerNode tulajdonságot a készlet létrehozásakor. Ha a Batch REST API-t használja, állítsa be a taskSlotsPerNode elemet a kérelemtörzsben a készlet létrehozása során.
Megjegyzés
Az elem és a taskSlotsPerNode
TaskSlotsPerNode tulajdonság csak a készlet létrehozásakor állítható be. A készlet létrehozása után nem módosíthatók.
Azure Batch lehetővé teszi a csomópontonkénti feladathelyek beállítását a csomópontmagok számának (4x) értékére. Ha például a készlet "Nagy" méretű csomópontokkal (négy maggal) van konfigurálva, akkor taskSlotsPerNode
16-ra lehet állítani. A csomópont magjainak számától függetlenül azonban csomópontonként nem lehet 256-nál több feladathely. Az egyes csomópontméretekhez tartozó magok számáról a Cloud Services méretei (klasszikus) című témakörben olvashat bővebben. A szolgáltatáskorlátokkal kapcsolatos további információkért lásd: Batch-szolgáltatáskvóták és -korlátok.
Tipp
Ügyeljen arra, hogy figyelembe vegye az taskSlotsPerNode
értéket, amikor automatikus skálázási képletet hoz létre a készlethez. Egy kiértékelt $RunningTasks
képletet például jelentősen érinthet a tevékenységek csomópontonkénti növekedése. További információ: Automatikus képlet létrehozása a számítási csomópontok Batch-készletben való skálázására.
Tevékenységelosztás megadása
Az egyidejű tevékenységek engedélyezésekor fontos megadni, hogy a tevékenységek hogyan legyenek elosztva a készlet csomópontjai között.
A CloudPool.TaskSchedulingPolicy tulajdonság használatával megadhatja, hogy a tevékenységeket egyenletesen kell hozzárendelni a készlet összes csomópontjához ("szórás"). Vagy megadhatja, hogy a lehető legtöbb tevékenységet rendelje hozzá az egyes csomópontokhoz, mielőtt a tevékenységeket a készlet egy másik csomópontjára rendeli ("csomagolás").
Vegyük például a CloudPool.TaskSlotsPerNode 16-os cloudpool.TaskSlotsPerNode értékével konfigurált Standard_D14 csomópontok készletét (az előző példában). Ha a CloudPool.TaskSchedulingPolicy csomag computeNodeFillType típussal van konfigurálva , akkor maximalizálja az egyes csomópontok 16 magjának használatát, és lehetővé teszi, hogy az automatikus skálázási készlet eltávolítsa a nem használt csomópontokat (a hozzárendelt feladatokat nem tartalmazó csomópontokat) a készletből. Az automatikus skálázás minimalizálja az erőforrás-használatot, és pénzt takaríthat meg.
Változó tárolóhelyek definiálása tevékenységenként
A tevékenység definiálható a CloudTask.RequiredSlots tulajdonsággal, amely megadja, hogy hány tárolóhelyet kell futtatnia egy számítási csomóponton. Az alapértelmezett érték az 1. Akkor állíthat be változó feladathelyeket, ha a tevékenységek eltérő súlyokkal rendelkeznek az erőforrás-használatukhoz a számítási csomóponton. A változó feladathelyek lehetővé teszik, hogy az egyes számítási csomópontok ésszerű számú egyidejűleg futó feladattal rendelkezzenek anélkül, hogy túlterhelnék a rendszer erőforrásait, például a cpu-t vagy a memóriát.
Egy tulajdonsággal taskSlotsPerNode = 8
rendelkező készlet esetében például többmagos, processzorigényes feladatokat küldhet be a használatával requiredSlots = 8
, míg más feladatokat a következőre requiredSlots = 1
állíthat be: . Ha ez a vegyes számítási feladat van ütemezve, a processzorigényes feladatok kizárólag a számítási csomópontjaikon futnak, míg más tevékenységek egyidejűleg (akár nyolc feladat egyszerre) futhatnak más csomópontokon. A vegyes számítási feladat segít kiegyensúlyozni a számítási feladatokat a számítási csomópontok között, és javítja az erőforrás-használat hatékonyságát.
Győződjön meg arról, hogy nem adja meg, hogy a tevékenység requiredSlots
nagyobb legyen, mint a készleté taskSlotsPerNode
, vagy a tevékenység soha nem fut. A Batch szolgáltatás jelenleg nem ellenőrzi ezt az ütközést a tevékenységek elküldésekor. Nem ellenőrzi az ütközést, mert előfordulhat, hogy egy feladatnak nincs készlete a beküldési időpontban, vagy az engedélyezés letiltásával/újbóli engedélyezésével másik készletre válthat.
Tipp
Változó feladathelyek használata esetén előfordulhat, hogy a több szükséges tárolóhellyel rendelkező nagy feladatok ütemezése ideiglenesen meghiúsulhat, mert nem áll rendelkezésre elegendő tárolóhely egy számítási csomóponton, még akkor is, ha egyes csomópontokon még mindig vannak üresjárati pontok. A feladatok prioritásának növelésével növelheti a csomópontokon elérhető pontokért való versengés esélyét.
A Batch szolgáltatás kibocsátja a TaskScheduleFailEvent parancsot, ha nem sikerül ütemezni a feladat futtatását, és addig próbálkozik újra az ütemezéssel, amíg a szükséges tárolóhelyek elérhetővé nem válnak. Az eseményt meghallgatva észlelheti a lehetséges feladatütemezési problémákat, és ennek megfelelően elháríthatja azokat.
Batch .NET-példa
Az alábbi Batch .NET API-kódrészletek bemutatják, hogyan hozhat létre csomópontonként több feladathelyet tartalmazó készletet, és hogyan küldhet be feladatokat a szükséges tárolóhelyekkel.
Csomópontonként több feladatponttal rendelkező készlet létrehozása
Ez a kódrészlet egy négy csomópontot tartalmazó készlet létrehozására irányuló kérést jelenít meg, csomópontonként négy feladathelyet engedélyezve. Olyan tevékenységütemezési szabályzatot ad meg, amely az egyes csomópontokat feladatokkal tölti meg, mielőtt tevékenységeket rendel a készlet egy másik csomópontjára.
További információ a készletek Batch .NET API-val történő hozzáadásáról: 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();
Feladat létrehozása a szükséges tárolóhelyekkel
Ez a kódrészlet nemdefault requiredSlots
típusú feladatot hoz létre. Ez a feladat akkor fut, ha elegendő szabad hely áll rendelkezésre egy számítási csomóponton.
CloudTask task = new CloudTask(taskId, taskCommandLine)
{
RequiredSlots = 2
};
Számítási csomópontok listázása feladatok és tárolóhelyek futtatásához szükséges számokkal
Ez a kódrészlet felsorolja a készlet összes számítási csomópontját, és kiírja a feladatok és a feladathelyek csomópontonkénti futtatásának számát.
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);
A feladat tevékenységszámának listázása
Ez a kódrészlet lekéri a feladat tevékenységszámát, amely a tevékenységek és a feladathelyek számát is tartalmazza tevékenységállapotonként.
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}");
Batch REST-példa
Az alábbi Batch REST API-kódrészletek bemutatják, hogyan hozhat létre csomópontonként több feladathelyet tartalmazó készletet, és hogyan küldhet be feladatokat a szükséges tárolóhelyekkel.
Csomópontonként több feladatponttal rendelkező készlet létrehozása
Ez a kódrészlet egy olyan készlet létrehozására vonatkozó kérést jelenít meg, amely csomópontonként legfeljebb négy feladattal rendelkező két nagy csomópontot tartalmaz.
További információ a készletek REST API-val történő hozzáadásáról: Készlet hozzáadása fiókhoz.
{
"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,
}
Feladat létrehozása a szükséges tárolóhelyekkel
Ez a kódrészlet egy nemdefault nevű feladat hozzáadására vonatkozó kérést jelenít meg requiredSlots
. Ez a feladat csak akkor fut, ha elegendő szabad hely áll rendelkezésre a számítási csomóponton.
{
"id": "taskId",
"commandLine": "bash -c 'echo hello'",
"userIdentity": {
"autoUser": {
"scope": "task",
"elevationLevel": "nonadmin"
}
},
"requiredSLots": 2
}
Kódminta a GitHubon
A GitHub ParallelTasks projektje bemutatja a CloudPool.TaskSlotsPerNode tulajdonság használatát.
Ez a C#-konzolalkalmazás a Batch . NET-kódtárat használja egy vagy több számítási csomóponttal rendelkező készlet létrehozásához. Konfigurálható számú feladatot hajt végre ezen a csomóponton a változó terhelés szimulálásához. Az alkalmazás kimenete azt mutatja, hogy mely csomópontok hajtották végre az egyes feladatokat. Az alkalmazás a feladat paramétereinek és időtartamának összegzését is tartalmazza.
Az alábbi példa a ParallelTasks mintaalkalmazás két különböző futtatásából származó kimenet összefoglaló részét mutatja be. Az itt látható feladat-időtartamok nem tartalmazzák a készletlétrehozási időt, mivel minden feladat egy korábban létrehozott készletbe lett elküldve, amelynek számítási csomópontjai tétlenségi állapotban voltak a beküldés időpontjában.
A mintaalkalmazás első végrehajtása azt mutatja, hogy a készletben egyetlen csomópont és csomópontonként egy tevékenység alapértelmezett beállítása esetén a feladat időtartama több mint 30 perc.
Nodes: 1
Node size: large
Task slots per node: 1
Max slots per task: 1
Tasks: 32
Duration: 00:30:01.4638023
A minta második futtatása a feladat időtartamának jelentős csökkenését mutatja. Ennek a csökkentésnek az az oka, hogy a készlet csomópontonként négy tevékenységgel lett konfigurálva, ami lehetővé teszi, hogy a párhuzamos tevékenységek végrehajtása majdnem egynegyed idő alatt befejezze a feladatot.
Nodes: 1
Node size: large
Task slots per node: 4
Max slots per task: 1
Tasks: 32
Duration: 00:08:48.2423500