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 a csomópontok 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őket és alacsonyabb költségeket tapasztalhatnak, ha több tevékenység osztozik ezen erőforrásokon. 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 az egyes csomópontokon párhuzamosan hajtja végre a feladatokat. Ez a stratégia különösen akkor érvényes, ha az egyes csomópontokra másolandó adatokat át kell vinni a földrajzi régiók között.
  • Maximalizálja a memóriahasználatot olyan feladatok esetében, amelyek nagy mennyiségű memóriát igényelnek, de csak rövid időszakokban és a végrehajtás során változó időpontokban. Kevesebb, de nagyobb számítási csomópontot használhat több memóriával az ilyen csúcsok hatékony kezeléséhez. Ezek a csomópontok több feladatot futtatnak párhuzamosan 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.
  • Mérsékelje a csomópontok számának korlátait , ha a csomópontok közötti kommunikációra szükség van egy készleten belül. A csomópontok közötti kommunikációhoz konfigurált készletek jelenleg 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, több tevékenység is végrehajtható egyszerre.
  • Saját telephelyi számítási fürt replikálása, például amikor először számítási környezetet helyez át az Azure-felhőbe. Ha az aktuális 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

Képzeljen el például egy olyan feladatalkalmazást, amely processzor- és memóriaigényekkel rendelkezik, például 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, Standard_D14 16 maggal rendelkező csomópontokat használhat, és engedélyezheti a párhuzamos feladatvégrehajtást. 1000 csomópont helyett akár 16-szor kevesebb csomópontot is használhat, csak 63-ra 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 vannak átmásolva.

Párhuzamos feladatvégrehajtás engedélyezése

A számítási csomópontokat a készlet szintjén konfigurálhatja a párhuzamos feladatvégrehajtáshoz. A Batch .NET könyvtárban állítsa be a BatchAccountPoolData.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érelem törzsében a készlet létrehozása során.

Megjegyzés:

A taskSlotsPerNode elemet és a TaskSlotsPerNode tulajdonságot csak a készlet létrehozása során állíthatja be. A készlet létrehozása után nem módosíthatók.

Az 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 lehet, hogy 16-ra van állítva. Függetlenül attól, hogy hány maggal rendelkezik a csomópont, csomópontonként nem lehet több, mint 256 feladathely. Az egyes csomópontméretekhez tartozó magok számáról további információt a Cloud Services méretei (klasszikus) című témakörben talál. A szolgáltatáskorlátokról további információt a Batch szolgáltatáskvóták és -korlátok című témakörben talál.

Jótanács

Ügyeljen arra, hogy figyelembe vegye az taskSlotsPerNode értéket, amikor automatikus skálázási képletet hoz létre a készlethez. Például egy $RunningTasks képlet kiértékelését jelentősen befolyásolhatja a csomópontonkénti feladatok számának növekedése. További információ: Automatikus képlet létrehozása számítási csomópontok skálázására a Batch-készletben.

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 BatchAccountPoolData.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"). Megadhatja azt is, hogy minden csomóponthoz a lehető legtöbb feladatot rendeljük, mielőtt a feladatokat a pool másik csomópontjához rendeljük ("packing").

Vegyük példaként a(z) Standard_D14 csomópontok készletét (az előző példában), amelynek a BatchAccountPoolData.TaskSlotsPerNode értéke 16. Ha a BatchAccountPoolData.TaskSchedulingPolicy a BatchNodeFillTypePack értékére van állítva, az maximalizálja az egyes csomópontok mind a 16 magjának kihasználtságát, és lehetővé teszi, hogy az automatikusan skálázódó készlet eltávolítsa a készletből a nem használt csomópontokat (azokat a csomópontokat, amelyekhez nincs feladat hozzárendelve). Az automatikus skálázás minimalizálja az erőforrás-használatot, és pénzt takaríthat meg.

Változóhelyek definiálása tevékenységenként

Egy feladat definiálható a BatchTaskCreateOptions.RequiredSlots tulajdonsággal, amely megadja, hogy hány tárolóhelyre van szükség a számítási csomóponton való futtatáshoz. Az alapértelmezett érték 1. Változó feladathelyeket akkor állíthat be, ha a tevékenységek különböző súlyokkal vannak társítva 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ó feladatokkal rendelkezzenek anélkül, hogy túlterhelnék a rendszer erőforrásait, például a processzort vagy a memóriát.

Például egy taskSlotsPerNode = 8 tulajdonsággal rendelkező erőforráskészlet esetében, többmagos, CPU-igényes feladatokat requiredSlots = 8 küldhet be, míg más tevékenységek beállíthatók requiredSlots = 1. Ha ez a vegyes számítási feladat ütemezve van, a processzorigényes tevékenységek kizárólag a számítási csomópontjaikon futnak, míg más tevékenységek egyidejűleg (egyszerre legfeljebb nyolc feladat) futhatnak más csomópontokon. A vegyes számítási feladatok segítségével kiegyensúlyozza számítási feladatait a számítási csomópontok között, és javíthatja az erőforrás-használat hatékonyságát.

Győződjön meg arról, hogy nem ad meg egy feladat requiredSlots-ot, ami nagyobb, mint a medence taskSlotsPerNode, mert akkor a feladat soha nem fog futni. A Batch szolgáltatás jelenleg nem ellenőrzi ezt az ütközést a tevékenységek elküldésekor. Nem érvényesíti az ütközést, mert előfordulhat, hogy egy feladat nem rendelkezik hozzárendelt erőforráskészlettel a benyújtásakor, vagy a letiltás/újraengedélyezés révén másik erőforráskészletre válthat.

Jótanács

Változó feladathelyek használata esetén előfordulhat, hogy a több szükséges ponttal rendelkező nagy feladatok ütemezése ideiglenesen meghiúsulhat, mert nem áll rendelkezésre elegendő tárolóhely egyetlen számítási csomóponton sem, még akkor is, ha egyes csomópontokon még mindig üresjárati pontok találhatók. 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 TaskScheduleFailEventet , ha nem ütemezi a feladat futtatását, és addig próbálkozik újra az ütemezéssel, amíg a szükséges pontok elérhetővé nem válnak. Az eseményt meghallgatva észlelheti a lehetséges feladatütemezési problémákat, és ennek megfelelően enyhítheti 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 feladatpontot tartalmazó készletet, és hogyan küldhet el feladatokat a szükséges tárolóhelyekkel.

Csomópontonként több feladatpontot tartalmazó 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 feladatütemezési szabályzatot ad meg, amely az egyes csomópontot feladatokkal feltölti, mielőtt feladatokat rendel a csoport egy másik csomópontjához.

A készletek Batch .NET API használatával történő hozzáadásáról további információt a BatchAccountPoolCollection.CreateOrUpdate című témakörben talál.

BatchAccountPoolData poolData = new BatchAccountPoolData()
{
    VmSize = "standard_d1_v2",
    DeploymentConfiguration = new BatchDeploymentConfiguration()
    {
        VmConfiguration = new BatchVmConfiguration(
            imageReference: new BatchImageReference()
            {
                Publisher = "MicrosoftWindowsServer",
                Offer = "WindowsServer",
                Sku = "2019-datacenter-core",
                Version = "latest"
            },
            nodeAgentSkuId: "batch.node.windows amd64")
    },
    ScaleSettings = new BatchAccountPoolScaleSettings()
    {
        FixedScale = new BatchAccountFixedScaleSettings() { TargetDedicatedNodes = 4 }
    },
    TaskSlotsPerNode = 4,
    TaskSchedulingPolicy = new Azure.ResourceManager.Batch.Models.BatchTaskSchedulingPolicy(
        Azure.ResourceManager.Batch.Models.BatchNodeFillType.Pack)
};

await batchAccount.GetBatchAccountPools().CreateOrUpdateAsync(WaitUntil.Completed, "mypool", poolData);

Feladat létrehozása a szükséges tárolóhelyekkel

Ez a kódrészlet létrehoz egy nem alapértelmezett requiredSlots feladatot. Ez a feladat akkor fut, ha elegendő szabad hely áll rendelkezésre egy számítási csomóponton.

BatchTaskCreateOptions task = new BatchTaskCreateOptions(taskId, taskCommandLine)
{
    RequiredSlots = 2
};

Futó feladatok és rendelkezésre álló helyek számával rendelkező számítási csomópontok listázása

Ez a kódrészlet felsorolja a készlet összes számítási csomópontját, és csomópontonként kinyomtatja a feladatok és a feladathelyek futtatásának számát.

await foreach (BatchNode node in batchClient.GetNodesAsync(
    poolId,
    select: new[] { "id", "runningTasksCount", "runningTaskSlotsCount" }))
{
    System.Console.WriteLine(node.Id + " :");
    System.Console.WriteLine($"RunningTasks = {node.RunningTasksCount}, RunningTaskSlots = {node.RunningTaskSlotsCount}");
}

A munka feladatainak szá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 tevékenységhelyek számát is tartalmazza tevékenységállapotonként.

BatchTaskCountsResult result = await batchClient.GetJobTaskCountsAsync(jobId);

System.Console.WriteLine("\t\tActive\tRunning\tCompleted");
System.Console.WriteLine($"TaskCounts:\t{result.TaskCounts.Active}\t{result.TaskCounts.Running}\t{result.TaskCounts.Completed}");
System.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 el feladatokat a szükséges tárolóhelyekkel.

Csomópontonként több feladatpontot tartalmazó készlet létrehozása

Ez a kódrészlet egy olyan készlet létrehozására irányuló kérést jelenít meg, amely csomópontonként legfeljebb négy feladatot tartalmazó két nagy csomópontot tartalmaz.

A készletek REST API-val történő hozzáadásáról további információt a Készlet hozzáadása fiókhoz című témakörben talál.

{
  "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 olyan kérést jelenít meg, amely nem szabályszerű feladat hozzáadását requiredSlotskéri. 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 a BatchAccountPoolData.TaskSlotsPerNode tulajdonság használatát mutatja be.

Ez a C#-konzolalkalmazás a Batch .NET-kódtár használatával hoz létre egy készletet egy vagy több számítási csomóponttal. Konfigurálható számú feladatot hajt végre ezeken a csomópontokon 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 feladatot egy korábban létrehozott készletbe küldtek, amelynek számítási csomópontjai tétlen állapotban voltak a beküldéskor.

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 feladat végrehajtása majdnem negyed 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