Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Możesz zmaksymalizować użycie zasobów w mniejszej liczbie węzłów obliczeniowych w puli, uruchamiając jednocześnie więcej niż jedno zadanie w każdym węźle.
Podczas gdy niektóre scenariusze działają najlepiej, gdy wszystkie zasoby węzła są przeznaczone na jedno zadanie, pewne obciążenia mogą mieć krótszy czas realizacji zadań i lepsze wyniki pod względem kosztów, gdy wiele zadań współużytkuje te zasoby. Rozważ następujące scenariusze:
- Zminimalizuj transfer danych dla zadań, które mogą udostępniać dane. Możesz znacznie zmniejszyć opłaty za transfer danych, kopiując udostępnione dane do mniejszej liczby węzłów, a następnie wykonując zadania równolegle w każdym węźle. Ta strategia dotyczy szczególnie sytuacji, gdy dane do skopiowania do każdego węzła muszą być przesyłane między regionami geograficznymi.
- Maksymalizuj użycie pamięci dla zadań wymagających dużej ilości pamięci, ale tylko w krótkich okresach czasu i w zmiennych godzinach wykonywania. Możesz stosować mniej, ale większe węzły obliczeniowe z większą ilością pamięci, aby efektywnie obsługiwać takie skoki. Te węzły mają wiele zadań uruchomionych równolegle w każdym węźle, ale każde zadanie może korzystać z obfitej pamięci węzłów w różnym czasie.
- Ogranicz limity liczby węzłów , gdy komunikacja między węzłami jest wymagana w puli. Obecnie pule skonfigurowane do komunikacji między węzłami są ograniczone do 50 węzłów obliczeniowych. Jeśli każdy węzeł w takiej puli może równolegle wykonywać zadania, można wykonać równocześnie większą liczbę zadań.
- Replikowanie lokalnego klastra obliczeniowego, takiego jak podczas pierwszego przenoszenia środowiska obliczeniowego na platformę Azure. Jeśli bieżące rozwiązanie lokalne wykonuje wiele zadań na węźle obliczeniowym, możesz zwiększyć maksymalną liczbę zadań węzłów, aby lepiej odzwierciedlić tę konfigurację.
Przykładowy scenariusz
Załóżmy na przykład, że aplikacja zadań ma wymagania dotyczące konkretnego procesora CPU i pamięci, tak że węzły Standard_D1 są wystarczające. Jednak aby zakończyć zadanie w wymaganym czasie, potrzebne jest 1000 z tych węzłów.
Zamiast używać węzłów Standard_D1 z jednym rdzeniem procesora CPU, można użyć Standard_D14 węzłów z 16 rdzeniami i włączyć równoległe wykonywanie zadań. Potencjalnie można użyć 16 razy mniejszej liczby węzłów zamiast 1000 węzłów, wymagane będzie tylko 63. Jeśli duże pliki aplikacji lub dane referencyjne są wymagane dla każdego węzła, czas trwania zadania i wydajność są lepsze, ponieważ dane są kopiowane tylko do 63 węzłów.
Włączanie równoległego wykonywania zadań
Węzły obliczeniowe są konfigurowane na potrzeby równoległego wykonywania zadań na poziomie puli. W bibliotece Batch .NET ustaw właściwość CloudPool.TaskSlotsPerNode podczas tworzenia puli. Jeśli używasz interfejsu API REST usługi Batch, ustaw element taskSlotsPerNode w treści żądania podczas tworzenia puli.
Uwaga
Element taskSlotsPerNode i właściwość TaskSlotsPerNode można ustawić tylko w czasie tworzenia puli. Nie można ich modyfikować po utworzeniu puli.
Usługa Azure Batch pozwala na ustawienie liczby miejsc na zadania na węzeł do wartości czterokrotności liczby rdzeni węzła. Jeśli na przykład pula jest skonfigurowana z węzłami o rozmiarze "Duże" (cztery rdzenie), taskSlotsPerNode może być ustawiona na 16. Jednak niezależnie od liczby rdzeni węzła nie można mieć więcej niż 256 miejsc zadań na węzeł. Aby uzyskać szczegółowe informacje na temat liczby rdzeni dla każdego rozmiaru węzła, zobacz Rozmiary dla usług Cloud Services (wersja klasyczna). Aby uzyskać więcej informacji na temat limitów usług, zapoznaj się z Przydziały i limity usługi Batch.
Wskazówka
Pamiętaj, aby wziąć pod uwagę wartość taskSlotsPerNode podczas konstruowania formuły autoskalowania dla swojej puli. Na przykład formuła, która ocenia $RunningTasks , może mieć dramatyczny wpływ na zwiększenie liczby zadań na węzeł. Aby uzyskać więcej informacji, zobacz Tworzenie automatycznej formuły skalowania węzłów obliczeniowych w puli Batch.
Określanie dystrybucji zadań
Podczas włączania zadań współbieżnych ważne jest określenie sposobu dystrybucji zadań między węzłami w puli.
Za pomocą właściwości CloudPool.TaskSchedulingPolicy można określić, że zadania powinny być przypisywane równomiernie we wszystkich węzłach w puli ("rozłożenie"). Możesz też określić, że do każdego węzła należy przypisać jak najwięcej zadań, zanim zadania zostaną przypisane do innego węzła w puli ("pakowanie").
Rozważmy na przykład pulę węzłów Standard_D14 (w poprzednim przykładzie), która jest skonfigurowana przy użyciu wartości CloudPool.TaskSlotsPerNode równej 16. Jeśli CloudPool.TaskSchedulingPolicy jest skonfigurowana z typem ComputeNodeFillType jako zapełnianie, maksymalizuje to użycie wszystkich 16 rdzeni każdego węzła i umożliwia puli autoskalowania usunięcie nieużywanych węzłów (węzłów bez przypisanych zadań) z puli. Skalowanie automatyczne minimalizuje użycie zasobów i może zaoszczędzić pieniądze.
Definiowanie miejsc zmiennych na zadanie
Zadanie można zdefiniować za pomocą właściwości CloudTask.RequiredSlots , określając liczbę miejsc wymaganych do uruchomienia w węźle obliczeniowym. Wartość domyślna to 1. Możesz ustawić zmienne miejsca zadań, jeśli zadania mają różne wagi skojarzone z użyciem zasobów w węźle obliczeniowym. Zmienne sloty zadań umożliwiają każdemu węzłowi obliczeniowemu rozsądną liczbę współbieżnych zadań bez przeciążenia zasobów systemowych, takich jak CPU lub pamięć.
Na przykład w przypadku puli z właściwością taskSlotsPerNode = 8, można przesyłać zadania wielordzeniowe, intensywnie korzystające z procesora, za pomocą requiredSlots = 8, podczas gdy inne zadania można ustawić na requiredSlots = 1. Po zaplanowaniu tego mieszanego obciążenia zadania intensywnie korzystające z procesora CPU są uruchamiane wyłącznie w węzłach obliczeniowych, podczas gdy inne zadania mogą być uruchamiane współbieżnie (maksymalnie osiem zadań jednocześnie) w innych węzłach. Mieszane obciążenie pomaga zrównoważyć obciążenie między węzłami obliczeniowymi i zwiększyć wydajność użycia zasobów.
Upewnij się, że nie określisz zadania requiredSlots jako większego niż pula taskSlotsPerNode, lub zadanie nigdy nie zostanie uruchomione. Usługa Batch nie weryfikuje obecnie tego konfliktu podczas przesyłania zadań. Nie weryfikuje konfliktu, ponieważ zadanie może nie mieć puli powiązanej w momencie przesłania lub może zmienić się na inną pulę przez wyłączenie i ponowne włączenie.
Wskazówka
W przypadku korzystania ze zmiennych miejsc zadań możliwe jest, że duże zadania z większą liczbą wymaganych miejsc mogą tymczasowo zakończyć się niepowodzeniem, ponieważ nie ma wystarczającej liczby miejsc w dowolnym węźle obliczeniowym, nawet jeśli w niektórych węzłach nadal istnieją bezczynne miejsca. Możesz podnieść priorytet tych zadań, aby zwiększyć ich szanse konkurowania o dostępne miejsca w węzłach.
Usługa Batch emituje element TaskScheduleFailEvent , gdy nie można zaplanować zadania do uruchomienia i będzie ponawiać próbę planowania, dopóki wymagane miejsca nie staną się dostępne. Możesz nasłuchiwać tego zdarzenia, aby wykryć potencjalne problemy z planowaniem zadań i odpowiednio rozwiązać ten problem.
Przykład aplikacji Batch .NET
Poniższe fragmenty kodu interfejsu API Batch .NET pokazują, jak utworzyć pulę z wieloma slotami zadań na węzeł oraz jak przesłać zadanie z wymaganymi slotami.
Utwórz pulę z wieloma miejscami na zadania na węzłach
Ten fragment kodu przedstawia żądanie utworzenia puli zawierającej cztery węzły z czterema miejscami zadań dozwolonymi na węzeł. Określa zasady planowania zadań, które wypełniają każdy węzeł zadaniami przed przypisaniem zadań do innego węzła w puli.
Aby uzyskać więcej informacji na temat dodawania pul przy użyciu interfejsu API platformy .NET usługi Batch, zobacz 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();
Tworzenie zadania z wymaganymi miejscami
Ten fragment kodu tworzy zadanie z niedefinicyjnym requiredSlotselementem . To zadanie jest uruchamiane, gdy w węźle obliczeniowym jest wystarczająca ilość wolnych miejsc.
CloudTask task = new CloudTask(taskId, taskCommandLine)
{
RequiredSlots = 2
};
Wyświetlanie listy węzłów obliczeniowych z liczbami uruchomionych zadań i miejsc
Ten fragment kodu zawiera listę wszystkich węzłów obliczeniowych w puli i wyświetla liczbę uruchomionych zadań i miejsc zadań na węzeł.
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);
Wyświetlanie listy liczników zadań dla zadania
Ten fragment kodu uzyskuje liczbę zadań dla pracy, która obejmuje zarówno ilość zadań, jak i liczbę miejsc zadań na każdy stan zadania.
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}");
Przykład rest usługi Batch
Poniższe fragmenty kodu interfejsu API REST usługi Batch pokazują, jak utworzyć pulę z wieloma miejscami zadań na węzeł i jak przesłać zadanie z wymaganymi miejscami.
Tworzenie puli z wieloma miejscami zadań na węzeł
Ten fragment kodu przedstawia żądanie utworzenia puli zawierającej dwa duże węzły z maksymalnie czterema zadaniami na węzeł.
Aby uzyskać więcej informacji na temat dodawania pul przy użyciu interfejsu API REST, zobacz Dodawanie puli do konta.
{
"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,
}
Utwórz zadanie z wymaganymi polami
Ten fragment kodu przedstawia żądanie dodania zadania z niedefinicyjnym requiredSlotselementem . To zadanie jest uruchamiane tylko wtedy, gdy w węźle obliczeniowym jest wystarczająca ilość wolnych miejsc.
{
"id": "taskId",
"commandLine": "bash -c 'echo hello'",
"userIdentity": {
"autoUser": {
"scope": "task",
"elevationLevel": "nonadmin"
}
},
"requiredSLots": 2
}
Przykładowy kod w witrynie GitHub
Projekt ParallelTasks w witrynie GitHub ilustruje użycie właściwości CloudPool.TaskSlotsPerNode .
Ta aplikacja konsolowa języka C# używa biblioteki platformy .NET usługi Batch do utworzenia puli z co najmniej jednym węzłem obliczeniowym. Wykonuje on konfigurowalną liczbę zadań w tych węzłach w celu symulowania zmiennego obciążenia. Dane wyjściowe z aplikacji pokazują, które węzły wykonały każde zadanie. Aplikacja zawiera również podsumowanie parametrów i czasu trwania zadania.
Poniższy przykład przedstawia część podsumowania danych wyjściowych z dwóch różnych przebiegów przykładowej aplikacji ParallelTasks. Czasy trwania zadań pokazane w tym miejscu nie obejmują czasu tworzenia puli, ponieważ każde zadanie zostało przesłane do wcześniej utworzonej puli, której węzły obliczeniowe były w stanie bezczynności w czasie przesyłania.
Pierwsze wykonanie przykładowej aplikacji pokazuje, że w przypadku pojedynczego węzła w puli i domyślnego ustawienia jednego zadania na węzeł czas trwania zadania wynosi ponad 30 minut.
Nodes: 1
Node size: large
Task slots per node: 1
Max slots per task: 1
Tasks: 32
Duration: 00:30:01.4638023
Drugi przebieg przykładu pokazuje znaczny spadek czasu trwania zadania. Jest to spowodowane tym, że pula została skonfigurowana z czterema zadaniami na węzeł, co pozwala na równoległe wykonywanie zadania w ciągu prawie jednej czwartej czasu.
Nodes: 1
Node size: large
Task slots per node: 4
Max slots per task: 1
Tasks: 32
Duration: 00:08:48.2423500