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 taskSlotsPerNodeTaskSlotsPerNode 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 = 8rendelkező 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 requiredSlotstí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

Következő lépések