Tworzenie formuły automatycznego skalowania węzłów obliczeniowych w puli usługi Batch

Usługa Azure Batch może automatycznie skalować pule na podstawie zdefiniowanych parametrów, co pozwala zaoszczędzić czas i pieniądze. Dzięki automatycznemu skalowaniu usługa Batch dynamicznie dodaje węzły do puli w miarę wzrostu zapotrzebowania na zadania i usuwa węzły obliczeniowe w miarę spadku zapotrzebowania na zadania.

Aby włączyć automatyczne skalowanie w puli węzłów obliczeniowych, należy skojarzyć pulę z zdefiniowaną formułą autoskalowania. Usługa Batch używa formuły autoskalowania, aby określić, ile węzłów jest potrzebnych do wykonania obciążenia. Te węzły mogą być węzłami dedykowanymi lub węzłami typu spot platformy Azure. Usługa Batch okresowo przegląda dane metryk usługi i używa ich do dostosowywania liczby węzłów w puli na podstawie formuły i w zdefiniowanym interwale.

Automatyczne skalowanie można włączyć podczas tworzenia puli lub stosować je do istniejącej puli. Usługa Batch umożliwia ocenę formuł przed przypisaniem ich do pul oraz monitorowanie stanu przebiegów automatycznego skalowania. Po skonfigurowaniu puli z automatycznym skalowaniem można później wprowadzić zmiany w formule.

Ważne

Podczas tworzenia konta usługi Batch można określić tryb alokacji puli, który określa, czy pule są przydzielane w subskrypcji usługi Batch (wartość domyślna) lub w subskrypcji użytkownika. Jeśli konto usługi Batch zostało utworzone z domyślną konfiguracją usługi Batch, konto jest ograniczone do maksymalnej liczby rdzeni, które mogą być używane do przetwarzania. Usługa Batch skaluje węzły obliczeniowe tylko do tego limitu rdzeni. Z tego powodu usługa Batch może nie osiągać docelowej liczby węzłów obliczeniowych określonych przez formułę autoskalowania. Aby dowiedzieć się, jak wyświetlać i zwiększać limity przydziałów kont, zobacz Limity przydziału i limity dla usługi Azure Batch.

Jeśli konto zostało utworzone w trybie subskrypcji użytkownika, twoje konto współudzieli limit przydziału rdzeni dla subskrypcji. Aby uzyskać więcej informacji, zobacz sekcję Virtual Machines limits (Limity maszyn wirtualnych) w artykule Azure subscription and service limits, quotas, and constraints (Ograniczenia, przydziały i limity usług i subskrypcji platformy Azure).

Formuły skalowania automatycznego

Formuła automatycznego skalowania jest wartością ciągu zdefiniowaną, która zawiera co najmniej jedną instrukcję. Formuła autoskalowania jest przypisywana do elementu autoScaleFormula puli (Batch REST) lub właściwości CloudPool.AutoScaleFormula (Batch .NET). Usługa Batch używa formuły, aby określić docelową liczbę węzłów obliczeniowych w puli dla następnego interwału przetwarzania. Ciąg formuły nie może przekraczać 8 KB, może zawierać maksymalnie 100 instrukcji rozdzielonych średnikami i może zawierać podziały wierszy i komentarze.

Możesz traktować formuły automatycznego skalowania jako "język" autoskalowania usługi Batch. Instrukcje formuł są wyrażeniami utworzonymi bezpłatnie, które mogą zawierać zarówno zmienne zdefiniowane przez usługę, które są definiowane przez usługę Batch, jak i zmienne zdefiniowane przez użytkownika. Formuły mogą wykonywać różne operacje na tych wartościach przy użyciu wbudowanych typów, operatorów i funkcji. Na przykład instrukcja może mieć następującą postać:

$myNewVariable = function($ServiceDefinedVariable, $myCustomVariable);

Formuły zazwyczaj zawierają wiele instrukcji, które wykonują operacje na wartościach uzyskanych w poprzednich instrukcjach. Na przykład najpierw uzyskasz wartość parametru variable1, a następnie przekażesz ją do funkcji w celu wypełnienia variable2elementu :

$variable1 = function1($ServiceDefinedVariable);
$variable2 = function2($OtherServiceDefinedVariable, $variable1);

Uwzględnij te instrukcje w formule autoskalowania, aby uzyskać docelową liczbę węzłów obliczeniowych. Węzły dedykowane i węzły typu spot mają własne ustawienia docelowe. Formuła skalowania automatycznego może zawierać wartość docelową dla dedykowanych węzłów, wartość docelową węzłów typu Spot lub obie te wartości.

Docelowa liczba węzłów może być wyższa, niższa lub taka sama jak bieżąca liczba węzłów tego typu w puli. Usługa Batch ocenia formułę automatycznego skalowania puli w określonych interwałach automatycznego skalowania. Usługa Batch dostosowuje docelową liczbę każdego typu węzła w puli do liczby, którą formuła autoskalowania określa w czasie oceny.

Przykładowe formuły autoskalowania

W poniższych przykładach przedstawiono dwie formuły skalowania automatycznego, które można dostosować do pracy w większości scenariuszy. Zmienne startingNumberOfVMs i maxNumberofVMs w przykładowych formułach można dostosować do Twoich potrzeb.

Oczekujące zadania

W przypadku tej formuły autoskalowania pula jest początkowo tworzona przy użyciu pojedynczej maszyny wirtualnej. $PendingTasks Metryka definiuje liczbę uruchomionych lub w kolejce zadań. Formuła znajduje średnią liczbę oczekujących zadań w ciągu ostatnich 180 sekund i ustawia odpowiednio zmienną $TargetDedicatedNodes . Formuła zapewnia, że docelowa liczba dedykowanych węzłów nigdy nie przekracza 25 maszyn wirtualnych. W miarę przesyłania nowych zadań pula automatycznie rośnie. W miarę wykonywania zadań maszyny wirtualne stają się wolne, a formuła skalowania automatycznego zmniejsza pulę.

Ta formuła skaluje dedykowane węzły, ale można je modyfikować w celu skalowania węzłów typu spot.

startingNumberOfVMs = 1;
maxNumberofVMs = 25;
pendingTaskSamplePercent = $PendingTasks.GetSamplePercent(180 * TimeInterval_Second);
pendingTaskSamples = pendingTaskSamplePercent < 70 ? startingNumberOfVMs : avg($PendingTasks.GetSample(180 * TimeInterval_Second));
$TargetDedicatedNodes=min(maxNumberofVMs, pendingTaskSamples);
$NodeDeallocationOption = taskcompletion;

Ważne

Obecnie usługa Batch ma ograniczenia dotyczące rozwiązywania oczekujących zadań. Po dodaniu zadania do zadania jest on również dodawany do kolejki wewnętrznej używanej przez usługę Batch do planowania. Jeśli zadanie zostanie usunięte przed zaplanowanym harmonogramem, zadanie może zostać utrwalone w kolejce, co spowoduje, że nadal będzie ono liczone w elemecie $PendingTasks. To usunięte zadanie zostanie ostatecznie wyczyszczone z kolejki, gdy usługa Batch będzie mieć możliwość ściągnięcia zadań z kolejki do harmonogramu z bezczynnymi węzłami w puli usługi Batch.

Wywłaszczone węzły

W tym przykładzie zostanie utworzona pula rozpoczynająca się od 25 węzłów typu spot. Za każdym razem, gdy węzeł typu spot jest wywłaszczone, jest zastępowany dedykowanym węzłem. Podobnie jak w przypadku pierwszego przykładu zmienna maxNumberofVMs uniemożliwia puli przekroczenie 25 maszyn wirtualnych. Ten przykład jest przydatny w przypadku korzystania z maszyn wirtualnych typu spot, jednocześnie zapewniając, że w okresie istnienia puli występuje tylko stała liczba wywłaszczeń.

maxNumberofVMs = 25;
$TargetDedicatedNodes = min(maxNumberofVMs, $PreemptedNodeCount.GetSample(180 * TimeInterval_Second));
$TargetLowPriorityNodes = min(maxNumberofVMs , maxNumberofVMs - $TargetDedicatedNodes);
$NodeDeallocationOption = taskcompletion;

Więcej informacji na temat tworzenia formuł autoskalowania znajdziesz w dalszej części tego artykułu.

Zmienne

W formułach autoskalowania można używać zmiennych zdefiniowanych przez usługę i zdefiniowanych przez użytkownika.

Zmienne zdefiniowane przez usługę są wbudowane w usługę Batch. Niektóre zmienne zdefiniowane przez usługę to odczyt-zapis, a niektóre są tylko do odczytu.

Zmienne zdefiniowane przez użytkownika to zmienne, które definiujesz. W poprzednim przykładzie $TargetDedicatedNodes i $PendingTasks są zmiennymi zdefiniowanymi przez usługę, podczas gdy startingNumberOfVMs zmienne zdefiniowane przez użytkownika i maxNumberofVMs są zmiennymi zdefiniowanymi przez użytkownika.

Uwaga

Zmienne zdefiniowane przez usługę są zawsze poprzedzone znakiem dolara ($). W przypadku zmiennych zdefiniowanych przez użytkownika znak dolara jest opcjonalny.

W poniższych tabelach przedstawiono zmienne tylko do odczytu i zapisu zdefiniowane przez usługę Batch.

Zmienne zdefiniowane przez usługę odczytu i zapisu

Możesz pobrać i ustawić wartości tych zmiennych zdefiniowanych przez usługę, aby zarządzać liczbą węzłów obliczeniowych w puli.

Zmienna opis
$TargetDedicatedNodes Docelowa liczba dedykowanych węzłów obliczeniowych dla puli. Określony jako element docelowy, ponieważ pula może nie zawsze osiągać żądaną liczbę węzłów. Jeśli na przykład docelowa liczba dedykowanych węzłów zostanie zmodyfikowana przez ocenę autoskalowania przed osiągnięciem początkowego celu puli, pula może nie dotrzeć do celu.

Pula na koncie utworzonym w trybie usługi Batch może nie osiągnąć celu, jeśli obiekt docelowy przekroczy węzeł konta usługi Batch lub limit przydziału rdzeni. Pula na koncie utworzonym w trybie subskrypcji użytkownika może nie osiągnąć celu, jeśli cel przekracza limit przydziału rdzeni udostępnionych dla subskrypcji.
$TargetLowPriorityNodes Docelowa liczba węzłów obliczeniowych typu Spot dla puli. Określony jako element docelowy, ponieważ pula może nie zawsze osiągać żądaną liczbę węzłów. Jeśli na przykład docelowa liczba węzłów typu Spot zostanie zmodyfikowana przez ocenę autoskalowania przed osiągnięciem początkowego celu puli, pula może nie dotrzeć do celu. Pula może również nie osiągnąć celu, jeśli element docelowy przekracza węzeł konta usługi Batch lub limit przydziału rdzeni.

Aby uzyskać więcej informacji na temat węzłów obliczeniowych typu spot, zobacz Use Spot VMs with Batch (Używanie maszyn wirtualnych typu spot z usługą Batch).
$NodeDeallocationOption Akcja wykonywana po usunięciu węzłów obliczeniowych z puli. Dopuszczalne wartości:
- requeue: wartość domyślna. Natychmiast kończy zadania i umieszcza je z powrotem w kolejce zadań, aby były ponownie zaplanowane. Ta akcja gwarantuje, że docelowa liczba węzłów zostanie osiągnięta tak szybko, jak to możliwe. Jednak może to być mniej wydajne, ponieważ wszystkie uruchomione zadania są przerywane, a następnie muszą zostać uruchomione ponownie.
- zakończenie: natychmiast kończy zadania i usuwa je z kolejki zadań.
- taskcompletion: czeka na zakończenie aktualnie uruchomionych zadań, a następnie usuwa węzeł z puli. Użyj tej opcji, aby uniknąć przerwania i ponownego kolejkowania zadań, marnowanie wszystkich zadań, które wykonano.
- retaineddata: czeka na wyczyszczenie wszystkich lokalnych danych przechowywanych przez zadanie w węźle przed usunięciem węzła z puli.

Uwaga

Zmienną $TargetDedicatedNodes można również określić przy użyciu aliasu $TargetDedicated. Podobnie zmienną $TargetLowPriorityNodes można określić przy użyciu aliasu $TargetLowPriority. Jeśli zarówno w pełni nazwana zmienna, jak i jej alias są ustawiane przez formułę, pierwszeństwo ma wartość przypisana do w pełni nazwanej zmiennej.

Zmienne zdefiniowane tylko do odczytu

Możesz uzyskać wartość tych zmiennych zdefiniowanych przez usługę, aby wprowadzić korekty oparte na metrykach z usługi Batch.

Ważne

Zadania zwolnienia zadań nie są obecnie uwzględniane w zmiennych, które zapewniają liczbę zadań, takich jak $ActiveTasks i $PendingTasks. W zależności od formuły autoskalowania może to spowodować usunięcie węzłów bez węzłów dostępnych do uruchamiania zadań zwolnienia zadań.

Napiwek

Te zmienne zdefiniowane tylko do odczytu to obiekty , które zapewniają różne metody uzyskiwania dostępu do danych skojarzonych z poszczególnymi elementami. Aby uzyskać więcej informacji, zobacz Uzyskiwanie przykładowych danych w dalszej części tego artykułu.

Zmienna opis
$CPUPercent Średni procent użycia procesora CPU.
$WallClockSeconds Liczba zużytych sekund. Wycofanie się po 2024-Mar-31.
$MemoryBytes Średnia liczba używanych megabajtów. Wycofanie się po 2024-Mar-31.
$DiskBytes Średnia liczba gigabajtów używanych na dyskach lokalnych. Wycofanie się po 2024-Mar-31.
$DiskReadBytes Liczba odczytanych bajtów. Wycofanie się po 2024-Mar-31.
$DiskWriteBytes Liczba zapisanych bajtów. Wycofanie się po 2024-Mar-31.
$DiskReadOps Liczba wykonanych operacji odczytu na dysku. Wycofanie się po 2024-Mar-31.
$DiskWriteOps Liczba wykonanych operacji zapisu na dysku. Wycofanie się po 2024-Mar-31.
$NetworkInBytes Liczba bajtów przychodzących. Wycofanie się po 2024-Mar-31.
$NetworkOutBytes Liczba bajtów wychodzących. Wycofanie się po 2024-Mar-31.
$SampleNodeCount Liczba węzłów obliczeniowych. Wycofanie się po 2024-Mar-31.
$ActiveTasks Liczba zadań, które są gotowe do wykonania, ale nie są jeszcze wykonywane. Obejmuje to wszystkie zadania, które znajdują się w stanie aktywnym i których zależności zostały spełnione. Wszystkie zadania, które znajdują się w stanie aktywnym, ale których zależności nie zostały spełnione, są wykluczone z $ActiveTasks liczby. W przypadku zadania $ActiveTasks z wieloma wystąpieniami obejmuje liczbę wystąpień ustawionych w zadaniu.
$RunningTasks Liczba zadań w stanie uruchomienia.
$PendingTasks Suma wartości $ActiveTasks i $RunningTasks.
$SucceededTasks Liczba zadań zakończonych pomyślnie.
$FailedTasks Liczba zadań zakończonych niepowodzeniem.
$TaskSlotsPerNode Liczba miejsc zadań, których można użyć do uruchamiania współbieżnych zadań w jednym węźle obliczeniowym w puli.
$CurrentDedicatedNodes Bieżąca liczba dedykowanych węzłów obliczeniowych.
$CurrentLowPriorityNodes Bieżąca liczba węzłów obliczeniowych typu Spot, w tym wszystkich węzłów, które zostały wywłaszczone.
$UsableNodeCount Liczba węzłów obliczeniowych, których można używać.
$PreemptedNodeCount Liczba węzłów w puli, które są w stanie wywłaszczonym.

Ostrzeżenie

Wybierz zmienne zdefiniowane przez usługę zostaną wycofane po 31 marca 2024 r., jak wspomniano w powyższej tabeli. Po dacie wycofania te zmienne zdefiniowane przez usługę nie będą już wypełniane przykładowymi danymi. Nie należy używać tych zmiennych przed tą datą.

Uwaga

Użyj $RunningTasks funkcji podczas skalowania na podstawie liczby zadań uruchomionych w określonym momencie w czasie, a $ActiveTasks podczas skalowania na podstawie liczby zadań, które są kolejkowane do uruchomienia.

Typy

Formuły skalowania automatycznego obsługują następujące typy:

  • double
  • doubleVec
  • doubleVecList
  • string
  • timestamp — struktura złożona zawierająca następujące elementy członkowskie:
    • rocznie
    • miesiąc (1–12)
    • dzień (1–31)
    • dzień tygodnia (w formacie liczby, na przykład 1 dla poniedziałku)
    • godzina (w formacie 24-godzinnym, na przykład 13 oznacza 13:00)
    • minuta (00–59)
    • sekunda (00-59)
  • timeinterval
    • TimeInterval_Zero
    • TimeInterval_100ns
    • TimeInterval_Microsecond
    • TimeInterval_Millisecond
    • TimeInterval_Second
    • TimeInterval_Minute
    • TimeInterval_Hour
    • TimeInterval_Day
    • TimeInterval_Week
    • TimeInterval_Year

Operacje

Te operacje są dozwolone w typach wymienionych w poprzedniej sekcji.

Operacja Obsługiwane operatory Typ wyniku
podwójny operator +, -, *, / double
dwuoperamentowy operator * timeinterval
doubleVec , operator podwójny +, -, *, / doubleVec
doubleVec, operator doubleVec +, -, *, / doubleVec
operator timeinterval — podwójny *, / timeinterval
timeinterval, operator timeinterval +, - timeinterval
sygnatura czasowa operatora timeinterval + timestamp
timestamp , operator timeinterval + timestamp
sygnatura czasowa operatora sygnatury czasowej - timeinterval
operator podwójny -, ! double
operator timeinterval - timeinterval
podwójny operator <, <=, ==, =, >>, != double
ciąg operatora ciągu <, <=, ==, =, >>, != double
sygnatura czasowa operatora sygnatury czasowej <, <=, ==, =, >>, != double
timeinterval, operator timeinterval <, <=, ==, =, >>, != double
podwójny operator &&, || double

Testowanie podwójne za pomocąternarnego operatora (double ? statement1 : statement2), powoduje, że wartość niezerowa jest równa true, a zero jako false.

Funkcje

Te wstępnie zdefiniowane funkcje można używać podczas definiowania formuły skalowania automatycznego.

Function Typ zwracany opis
avg(doubleVecList) double Zwraca średnią wartość dla wszystkich wartości w doubleVecList.
ceil(double) double Zwraca najmniejszą wartość całkowitą nie mniejszą niż podwójna.
ceil(doubleVecList) doubleVec Zwraca składnik mądry ceil doubleVecList.
floor(double) double Zwraca największą wartość całkowitą nie większą niż podwójna.
floor(doubleVecList) doubleVec Zwraca składnik mądry floor doubleVecList.
len(doubleVecList) double Zwraca długość wektora utworzonego na podstawie elementu doubleVecList.
lg(double) double Zwraca bazę dziennika 2 z podwójnej.
lg(doubleVecList) doubleVec Zwraca składnik mądry lg doubleVecList.
ln(podwójne) double Zwraca dziennik naturalny podwójnej wartości.
ln(doubleVecList) doubleVec Zwraca składnik mądry ln doubleVecList.
log(double) double Zwraca bazę dziennika 10 z podwójnej.
log(doubleVecList) doubleVec Zwraca składnik mądry log doubleVecList.
max(doubleVecList) double Zwraca wartość maksymalną w doubleVecList.
min(doubleVecList) double Zwraca wartość minimalną w doubleVecList.
norm(doubleVecList) double Zwraca dwie normy wektora utworzonego na podstawie doubleVecList.
percentyl(doubleVec v, double p) double Zwraca element percentylowy wektora v.
rand() double Zwraca wartość losową z zakresu od 0,0 do 1,0.
range(doubleVecList) double Zwraca różnicę między wartościami min i max w doubleVecList.
round(double) double Zwraca najbliższą wartość całkowitą do wartości podwójnej (w formacie zmiennoprzecinkowym), zaokrąglając przypadki w połowie drogi od zera.
round(doubleVecList) doubleVec Zwraca składnik mądry round doubleVecList.
std(doubleVecList) double Zwraca odchylenie standardowe próbki wartości w doubleVecList.
stop() Zatrzymuje ocenę wyrażenia autoskalowania.
sum(doubleVecList) double Zwraca sumę wszystkich składników doubleVecList.
time(string dateTime="") timestamp Zwraca sygnaturę czasową bieżącej godziny, jeśli nie przekazano żadnych parametrów, lub sygnaturę czasową ciągu dateTime, jeśli zostanie przekazany. Obsługiwane formaty dateTime to W3C-DTF i RFC 1123.
val(doubleVec v, double i) double Zwraca wartość elementu, który znajduje się w lokalizacji i w wektor v, z indeksem początkowym zera.

Niektóre funkcje opisane w poprzedniej tabeli mogą akceptować listę jako argument. Lista rozdzielona przecinkami jest dowolną kombinacją podwójnych i doubleVec. Na przykład:

doubleVecList := ( (double | doubleVec)+(, (double | doubleVec) )* )?

Wartość doubleVecList jest konwertowana na pojedynczy doubleVec przed oceną. Na przykład jeśli v = [1,2,3]wywołanie avg(v) metody jest równoważne wywołaniu metody avg(1,2,3). Wywołanie avg(v, 7) jest równoważne wywołaniu funkcji avg(1,2,3,7).

Metryki

Metryki zasobów i zadań można używać podczas definiowania formuły. Można dostosować docelową liczbę dedykowanych węzłów w puli na podstawie danych metryk, które uzyskujesz i oceniasz. Aby uzyskać więcej informacji na temat każdej metryki, zobacz sekcję Zmienne .

Metryczne opis
Zasób Metryki zasobów są oparte na procesorze CPU, przepustowości, użyciu pamięci węzłów obliczeniowych i liczbie węzłów.

Te zmienne zdefiniowane przez usługę są przydatne do wprowadzania korekt na podstawie liczby węzłów:
- $TargetDedicatedNodes
- $TargetLowPriorityNodes
- $CurrentDedicatedNodes
- $CurrentLowPriorityNodes
- $PreemptedNodeCount
- $UsableNodeCount

Te zmienne zdefiniowane przez usługę są przydatne do wprowadzania korekt w oparciu o użycie zasobów węzła:
- $CPUPercent
- $WallClockSeconds
- $MemoryBytes
- $DiskBytes
- $DiskReadBytes
- $DiskWriteBytes
- $DiskReadOps
- $DiskWriteOps
- $NetworkInBytes
- $NetworkOutBytes
Zadanie Metryki zadań są oparte na stanie zadań, takich jak Aktywne, Oczekujące i Ukończone. Następujące zmienne zdefiniowane przez usługę są przydatne do wprowadzania korekt rozmiaru puli na podstawie metryk zadań:
- $ActiveTasks
- $RunningTasks
- $PendingTasks
- $SucceededTasks
- $FailedTasks

Pozyskiwanie przykładowych danych

Podstawową operacją formuły autoskalowania jest uzyskanie danych metryk zadań i zasobów (przykładów), a następnie dostosowanie rozmiaru puli na podstawie tych danych. W związku z tym ważne jest, aby mieć jasne zrozumienie sposobu interakcji formuł autoskalowania z przykładami.

Metody

Formuły autoskalowania działają na próbkach danych metryk dostarczonych przez usługę Batch. Formuła zwiększa lub zmniejsza węzły obliczeniowe puli na podstawie uzyskiwanych wartości. Zmienne zdefiniowane przez usługę to obiekty, które zapewniają metody uzyskiwania dostępu do danych skojarzonych z tym obiektem. Na przykład następujące wyrażenie przedstawia żądanie pobrania ostatnich pięciu minut użycia procesora CPU:

$CPUPercent.GetSample(TimeInterval_Minute * 5)

Poniższe metody mogą służyć do uzyskiwania przykładowych danych dotyczących zmiennych zdefiniowanych przez usługę.

Metoda opis
GetSample() Metoda GetSample() zwraca wektor próbek danych.

Przykład to 30 sekund wartości danych metryk. Innymi słowy próbki są uzyskiwane co 30 sekund. Jednak jak wspomniano poniżej, występuje opóźnienie między zbieraniem próbki a dostępnością formuły. W związku z tym nie wszystkie próbki dla danego okresu czasu mogą być dostępne do oceny przez formułę.

- doubleVec GetSample(double count): określa liczbę próbek do uzyskania z najnowszych zebranych próbek. GetSample(1) Zwraca ostatni dostępny przykład. W przypadku metryk, takich jak $CPUPercent, nie należy jednak GetSample(1) używać, ponieważ nie można wiedzieć , kiedy próbka została zebrana. Może to być ostatnie lub, ze względu na problemy z systemem, może to być znacznie starsze. W takich przypadkach lepiej użyć przedziału czasu, jak pokazano poniżej.

- doubleVec GetSample((timestamp or timeinterval) startTime [, double samplePercent]): określa ramy czasowe zbierania przykładowych danych. Opcjonalnie określa również procent próbek, które muszą być dostępne w żądanym przedziale czasu. Na przykład zwraca 20 próbek, $CPUPercent.GetSample(TimeInterval_Minute * 10) jeśli wszystkie próbki z ostatnich 10 minut są obecne w CPUPercent historii. Jeśli ostatnia minuta historii nie była dostępna, zostanie zwróconych tylko 18 próbek. W takim przypadku $CPUPercent.GetSample(TimeInterval_Minute * 10, 95) nie powiedzie się, ponieważ tylko 90 procent próbek jest dostępnych, ale $CPUPercent.GetSample(TimeInterval_Minute * 10, 80) powiedzie się.

- doubleVec GetSample((timestamp or timeinterval) startTime, (timestamp or timeinterval) endTime [, double samplePercent]): określa ramy czasowe zbierania danych z czasem rozpoczęcia i czasem zakończenia. Jak wspomniano powyżej, występuje opóźnienie między zbieraniem próbki a udostępnieniem formuły. Rozważ to opóźnienie podczas korzystania z GetSample metody . Zobacz GetSamplePercent poniżej.
GetSamplePeriod() Zwraca okres próbek pobranych w historycznym zestawie danych próbki.
Count() Zwraca łączną liczbę próbek w historii metryk.
HistoryBeginTime() Zwraca sygnaturę czasową najstarszej dostępnej próbki danych dla metryki.
GetSamplePercent() Zwraca wartość procentową próbek, które są dostępne dla danego interwału czasu. Na przykład doubleVec GetSamplePercent( (timestamp or timeinterval) startTime [, (timestamp or timeinterval) endTime] ). GetSample Ponieważ metoda kończy się niepowodzeniem, jeśli procent zwróconych próbek jest mniejszy niż samplePercent określony, możesz użyć GetSamplePercent metody , aby najpierw sprawdzić. Następnie można wykonać akcję alternatywną, jeśli nie ma wystarczających próbek, bez zatrzymywania automatycznej oceny skalowania.

Przykłady

Usługa Batch okresowo pobiera próbki metryk zadań i zasobów i udostępnia je formułom skalowania automatycznego. Te próbki są rejestrowane co 30 sekund przez usługę Batch. Jednak zazwyczaj występuje opóźnienie między zarejestrowaniem tych próbek a udostępnieniem (i odczytaniem) formuł autoskalowania. Ponadto próbki mogą nie być rejestrowane dla określonego interwału z powodu czynników, takich jak problemy z siecią lub inną infrastrukturą.

Procent próbki

Po samplePercent przekazaniu metody lub GetSample() wywołaniu metody GetSamplePercent() procent odwołuje się do porównania całkowitej możliwej liczby próbek zarejestrowanych przez usługę Batch oraz liczby próbek dostępnych dla formuły autoskalowania.

Przyjrzyjmy się 10-minutowej długości czasu jako przykładu. Ponieważ próbki są rejestrowane co 30 sekund w tym 10-minutowym przedziale czasu, maksymalna całkowita liczba próbek zarejestrowanych przez usługę Batch wynosi 20 próbek (2 na minutę). Jednak ze względu na nieodłączne opóźnienie mechanizmu raportowania i inne problemy na platformie Azure może istnieć tylko 15 przykładów, które są dostępne dla formuły autoskalowania do odczytu. Na przykład dla tego 10-minutowego okresu tylko 75 procent całkowitej liczby zarejestrowanych próbek może być dostępnych dla formuły.

GetSample() i przykładowe zakresy

Formuły autoskalowania rosną i zmniejszają pule, dodając lub usuwając węzły. Ponieważ węzły kosztują Pieniądze, upewnij się, że formuły korzystają z inteligentnej metody analizy opartej na wystarczających danych. Zaleca się użycie analizy typu trendu w formułach. Ten typ rośnie i zmniejsza pule na podstawie zakresu zebranych próbek.

W tym celu użyj polecenia GetSample(interval look-back start, interval look-back end) , aby zwrócić wektor próbek:

$runningTasksSample = $RunningTasks.GetSample(1 * TimeInterval_Minute, 6 * TimeInterval_Minute);

Gdy usługa Batch oblicza powyższy wiersz, zwraca zakres próbek jako wektor wartości. Na przykład:

$runningTasksSample=[1,1,1,1,1,1,1,1,1,1];

Po zebraniu wektora próbek możesz użyć funkcji takich jak min(), max()i avg() , aby uzyskać znaczące wartości z zebranego zakresu.

Aby zachować szczególną ostrożność, możesz wymusić niepowodzenie oceny formuły, jeśli dla określonego okresu jest dostępna mniejsza niż określona wartość procentowa próbki. W przypadku wymuszenia niepowodzenia oceny formuły należy poinstruować usługę Batch, aby zaprzestała dalszej oceny formuły, jeśli określona wartość procentowa próbek jest niedostępna. W takim przypadku nie wprowadzono żadnych zmian w rozmiarze puli. Aby określić wymagany procent próbek do pomyślnego przeprowadzenia oceny, określ go jako trzeci parametr na GetSample()wartość . W tym miejscu określono wymaganie 75 procent próbek:

$runningTasksSample = $RunningTasks.GetSample(60 * TimeInterval_Second, 120 * TimeInterval_Second, 75);

Ponieważ może wystąpić opóźnienie w dostępności próbki, zawsze należy określić zakres czasu z czasem rozpoczęcia wyszukiwania, który jest starszy niż minuta. Propagacja próbek przez system trwa około minut, więc próbki w zakresie (0 * TimeInterval_Second, 60 * TimeInterval_Second) mogą być niedostępne. Ponownie możesz użyć parametru procentowego , GetSample() aby wymusić określone wymaganie procentowe próbki.

Ważne

Zdecydowanie zalecamy unikanie polegania tylko na GetSample(1) formułach autoskalowania. Jest to spowodowane tym, że GetSample(1) zasadniczo mówi do usługi Batch: "Daj mi ostatni przykład, który miałeś, niezależnie od tego, jak długo temu go pobrano"." Ponieważ jest to tylko jedna próbka i może to być starsza próbka, może nie być reprezentatywna dla większego obrazu ostatniego zadania lub stanu zasobu. Jeśli używasz metody GetSample(1), upewnij się, że jest ona częścią większej instrukcji, a nie jedynym punktem danych, na którym opiera się formuła.

Pisanie formuły skalowania automatycznego

Utworzysz formułę autoskalowania, tworząc instrukcje używające powyższych składników, a następnie połącz te instrukcje w pełną formułę. W tej sekcji utworzysz przykładową formułę autoskalowania, która może podejmować rzeczywiste decyzje dotyczące skalowania i wprowadzać korekty.

Najpierw zdefiniujmy wymagania dotyczące nowej formuły skalowania automatycznego. Formuła powinna:

  • Zwiększ docelową liczbę dedykowanych węzłów obliczeniowych w puli, jeśli użycie procesora CPU jest wysokie.
  • Zmniejsz docelową liczbę dedykowanych węzłów obliczeniowych w puli, gdy użycie procesora CPU jest niskie.
  • Zawsze ogranicz maksymalną liczbę dedykowanych węzłów do 400.
  • Podczas zmniejszania liczby węzłów nie usuwaj węzłów, które są uruchomione zadania; w razie potrzeby zaczekaj na zakończenie zadań przed usunięciem węzłów.

Pierwsza instrukcja w formule zwiększa liczbę węzłów podczas wysokiego użycia procesora CPU. Należy zdefiniować instrukcję, która wypełnia zmienną zdefiniowaną przez użytkownika ($totalDedicatedNodes) wartością 110 procent bieżącej docelowej liczby dedykowanych węzłów, ale tylko wtedy, gdy minimalne średnie użycie procesora CPU w ciągu ostatnich 10 minut przekraczało 70 procent. W przeciwnym razie używa wartości dla bieżącej liczby dedykowanych węzłów.

$totalDedicatedNodes =
    (min($CPUPercent.GetSample(TimeInterval_Minute * 10)) > 0.7) ?
    ($CurrentDedicatedNodes * 1.1) : $CurrentDedicatedNodes;

Aby zmniejszyć liczbę dedykowanych węzłów podczas niskiego użycia procesora CPU, następna instrukcja w formule ustawia tę samą $totalDedicatedNodes zmienną na 90 procent bieżącej docelowej liczby dedykowanych węzłów, jeśli średnie użycie procesora CPU w ciągu ostatnich 60 minut było poniżej 20 procent. W przeciwnym razie używa bieżącej $totalDedicatedNodes wartości wypełnionej w powyższej instrukcji.

$totalDedicatedNodes =
    (avg($CPUPercent.GetSample(TimeInterval_Minute * 60)) < 0.2) ?
    ($CurrentDedicatedNodes * 0.9) : $totalDedicatedNodes;

Teraz ogranicz docelową liczbę dedykowanych węzłów obliczeniowych do maksymalnie 400.

$TargetDedicatedNodes = min(400, $totalDedicatedNodes);

Na koniec upewnij się, że węzły nie zostaną usunięte, dopóki ich zadania nie zostaną zakończone.

$NodeDeallocationOption = taskcompletion;

Oto kompletna formuła:

$totalDedicatedNodes =
    (min($CPUPercent.GetSample(TimeInterval_Minute * 10)) > 0.7) ?
    ($CurrentDedicatedNodes * 1.1) : $CurrentDedicatedNodes;
$totalDedicatedNodes =
    (avg($CPUPercent.GetSample(TimeInterval_Minute * 60)) < 0.2) ?
    ($CurrentDedicatedNodes * 0.9) : $totalDedicatedNodes;
$TargetDedicatedNodes = min(400, $totalDedicatedNodes);
$NodeDeallocationOption = taskcompletion;

Uwaga

Jeśli wybierzesz, możesz uwzględnić komentarze i podziały wierszy w ciągach formuły. Należy również pamiętać, że brakujące średniki mogą powodować błędy oceny.

Interwał automatycznego skalowania

Domyślnie usługa Batch dostosowuje rozmiar puli zgodnie z formułą autoskalowania co 15 minut. Ten interwał można skonfigurować przy użyciu następujących właściwości puli:

Minimalny interwał wynosi pięć minut, a wartość maksymalna to 168 godzin. Jeśli określono interwał poza tym zakresem, usługa Batch zwraca błąd Nieprawidłowe żądanie (400).

Uwaga

Skalowanie automatyczne nie jest obecnie przeznaczone do reagowania na zmiany w czasie krótszym niż minuta, ale raczej ma na celu stopniowe dostosowywanie rozmiaru puli podczas uruchamiania obciążenia.

Tworzenie puli z obsługą automatycznego skalowania przy użyciu zestawów SDK usługi Batch

Skalowanie automatyczne puli można skonfigurować przy użyciu dowolnego zestawu SDK usługi Batch, poleceń cmdlet programu PowerShell interfejsu APIREST usługi Batch i interfejsu wiersza polecenia usługi Batch. W tej sekcji przedstawiono przykłady dla platformy .NET i języka Python.

.NET

Aby utworzyć pulę z włączonym skalowaniem automatycznym na platformie .NET, wykonaj następujące kroki:

  1. Utwórz pulę za pomocą puli BatchClient.PoolOperations.CreatePool.
  2. Ustaw właściwość CloudPool.AutoScaleEnabled na true.
  3. Ustaw właściwość CloudPool.AutoScaleFormula przy użyciu formuły autoskalowania.
  4. (Opcjonalnie) Ustaw właściwość CloudPool.AutoScaleEvaluationInterval (wartość domyślna to 15 minut).
  5. Zatwierdź pulę za pomocą pliku CloudPool.Commit lub CommitAsync.

Poniższy przykład tworzy pulę z obsługą automatycznego skalowania na platformie .NET. Formuła automatycznego skalowania puli ustawia docelową liczbę dedykowanych węzłów na 5 w poniedziałek i 1 każdego innego dnia tygodnia. Interwał automatycznego skalowania jest ustawiony na 30 minut. W tym i innych fragmentach kodu w języku C# w tym artykule myBatchClient jest poprawnie zainicjowane wystąpienie klasy BatchClient .

CloudPool pool = myBatchClient.PoolOperations.CreatePool(
                    poolId: "mypool",
                    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.AutoScaleEnabled = true;
pool.AutoScaleFormula = "$TargetDedicatedNodes = (time().weekday == 1 ? 5:1);";
pool.AutoScaleEvaluationInterval = TimeSpan.FromMinutes(30);
await pool.CommitAsync();

Ważne

Podczas tworzenia puli z obsługą automatycznego skalowania nie należy określać parametru targetDedicatedNodes ani parametru targetLowPriorityNodes w wywołaniu metody CreatePool. Zamiast tego określ AutoScaleEnabled właściwości i AutoScaleFormula w puli. Wartości tych właściwości określają docelową liczbę każdego typu węzła.

Aby ręcznie zmienić rozmiar puli z włączoną funkcją automatycznego skalowania (na przykład przy użyciu klasy BatchClient.PoolOperations.ResizePoolAsync), należy najpierw wyłączyć automatyczne skalowanie w puli, a następnie zmienić jej rozmiar.

Napiwek

Aby uzyskać więcej przykładów korzystania z zestawu .NET SDK, zobacz repozytorium Szybki start dla platformy .NET usługi Batch w witrynie GitHub.

Python

Aby utworzyć pulę z obsługą automatycznego skalowania przy użyciu zestawu SDK języka Python:

  1. Utwórz pulę i określ jej konfigurację.
  2. Dodaj pulę do klienta usługi.
  3. Włącz autoskalowanie w puli przy użyciu formuły, którą piszesz.

Poniższy przykład ilustruje te kroki.

# Create a pool; specify configuration
new_pool = batch.models.PoolAddParameter(
    id="autoscale-enabled-pool",
    virtual_machine_configuration=batchmodels.VirtualMachineConfiguration(
        image_reference=batchmodels.ImageReference(
          publisher="Canonical",
          offer="UbuntuServer",
          sku="20.04-LTS",
          version="latest"
            ),
        node_agent_sku_id="batch.node.ubuntu 20.04"),
    vm_size="STANDARD_D1_v2",
    target_dedicated_nodes=0,
    target_low_priority_nodes=0
)
batch_service_client.pool.add(new_pool) # Add the pool to the service client

formula = """$curTime = time();
             $workHours = $curTime.hour >= 8 && $curTime.hour < 18;
             $isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
             $isWorkingWeekdayHour = $workHours && $isWeekday;
             $TargetDedicated = $isWorkingWeekdayHour ? 20:10;""";

# Enable autoscale; specify the formula
response = batch_service_client.pool.enable_auto_scale(pool_id, auto_scale_formula=formula,
                                            auto_scale_evaluation_interval=datetime.timedelta(minutes=10),
                                            pool_enable_auto_scale_options=None,
                                            custom_headers=None, raw=False)

Napiwek

Aby uzyskać więcej przykładów używania zestawu SDK języka Python, zobacz repozytorium Szybki start dla języka Python usługi Batch w witrynie GitHub.

Włączanie skalowania automatycznego w istniejącej puli

Każdy zestaw SDK usługi Batch umożliwia automatyczne skalowanie. Na przykład:

Po włączeniu skalowania automatycznego w istniejącej puli należy pamiętać o:

  • Jeśli skalowanie automatyczne jest obecnie wyłączone w puli, podczas wystawiania żądania należy określić prawidłową formułę autoskalowania. Opcjonalnie możesz określić interwał automatycznego skalowania. Jeśli nie określisz interwału, zostanie użyta wartość domyślna 15 minut.
  • Jeśli skalowanie automatyczne jest obecnie włączone w puli, możesz określić nową formułę, nowy interwał lub oba te elementy. Należy określić co najmniej jedną z tych właściwości.
    • Jeśli określisz nowy interwał automatycznego skalowania, istniejący harmonogram zostanie zatrzymany i zostanie uruchomiony nowy harmonogram. Godzina rozpoczęcia nowego harmonogramu to czas, w którym zostało wydane żądanie włączenia skalowania automatycznego.
    • Jeśli pominięto formułę autoskalowania lub interwał, usługa Batch nadal używa bieżącej wartości tego ustawienia.

Uwaga

Jeśli określono wartości parametrów targetDedicatedNodes lub targetLowPriorityNodes CreatePool metody podczas tworzenia puli na platformie .NET lub dla porównywalnych parametrów w innym języku, te wartości są ignorowane podczas obliczania formuły autoskalowania.

W tym przykładzie języka C# biblioteka .NET usługi Batch umożliwia skalowanie automatyczne w istniejącej puli.

// Define the autoscaling formula. This formula sets the target number of nodes
// to 5 on Mondays, and 1 on every other day of the week
string myAutoScaleFormula = "$TargetDedicatedNodes = (time().weekday == 1 ? 5:1);";

// Set the autoscale formula on the existing pool
await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleFormula: myAutoScaleFormula);

Aktualizowanie formuły skalowania automatycznego

Aby zaktualizować formułę w istniejącej puli z obsługą automatycznego skalowania, wywołaj operację , aby włączyć skalowanie automatyczne ponownie przy użyciu nowej formuły. Jeśli na przykład skalowanie automatyczne jest już włączone myexistingpool po wykonaniu następującego kodu platformy .NET, formuła autoskalowania jest zastępowana zawartością myNewFormulaelementu .

await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleFormula: myNewFormula);

Aktualizowanie interwału skalowania automatycznego

Aby zaktualizować interwał oceny autoskalowania istniejącej puli z obsługą autoskalowania, wywołaj operację , aby włączyć skalowanie automatyczne ponownie z nowym interwałem. Aby na przykład ustawić interwał oceny autoskalowania na 60 minut dla puli, która jest już włączona automatycznie na platformie .NET:

await myBatchClient.PoolOperations.EnableAutoScaleAsync(
    "myexistingpool",
    autoscaleEvaluationInterval: TimeSpan.FromMinutes(60));

Ocena formuły autoskalu

Formułę można ocenić przed zastosowaniem jej do puli. Dzięki temu można przetestować wyniki formuły przed wprowadzeniem jej do środowiska produkcyjnego.

Zanim będzie można ocenić formułę autoskalowania, musisz najpierw włączyć skalowanie automatyczne w puli z prawidłową formułą, taką jak formuła $TargetDedicatedNodes = 0jednowierszowa. Następnie użyj jednej z następujących opcji, aby ocenić formułę, którą chcesz przetestować:

Poniższy przykład platformy .NET usługi Batch ocenia formułę skalowania automatycznego. Jeśli pula nie używa jeszcze skalowania automatycznego, włącz ją najpierw.

// First obtain a reference to an existing pool
CloudPool pool = await batchClient.PoolOperations.GetPoolAsync("myExistingPool");

// If autoscaling isn't already enabled on the pool, enable it.
// You can't evaluate an autoscale formula on a non-autoscale-enabled pool.
if (pool.AutoScaleEnabled == false)
{
    // You need a valid autoscale formula to enable autoscaling on the
    // pool. This formula is valid, but won't resize the pool:
    await pool.EnableAutoScaleAsync(
        autoscaleFormula: "$TargetDedicatedNodes = $CurrentDedicatedNodes;",
        autoscaleEvaluationInterval: TimeSpan.FromMinutes(5));

    // Batch limits EnableAutoScaleAsync calls to once every 30 seconds.
    // Because you want to apply our new autoscale formula below if it
    // evaluates successfully, and you *just* enabled autoscaling on
    // this pool, pause here to ensure you pass that threshold.
    Thread.Sleep(TimeSpan.FromSeconds(31));

    // Refresh the properties of the pool so that we've got the
    // latest value for AutoScaleEnabled
    await pool.RefreshAsync();
}

// You must ensure that autoscaling is enabled on the pool prior to
// evaluating a formula
if (pool.AutoScaleEnabled == true)
{
    // The formula to evaluate - adjusts target number of nodes based on
    // day of week and time of day
    string myFormula = @"
        $curTime = time();
        $workHours = $curTime.hour >= 8 && $curTime.hour < 18;
        $isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
        $isWorkingWeekdayHour = $workHours && $isWeekday;
        $TargetDedicatedNodes = $isWorkingWeekdayHour ? 20:10;
    ";

    // Perform the autoscale formula evaluation. Note that this code does not
    // actually apply the formula to the pool.
    AutoScaleRun eval =
        await batchClient.PoolOperations.EvaluateAutoScaleAsync(pool.Id, myFormula);

    if (eval.Error == null)
    {
        // Evaluation success - print the results of the AutoScaleRun.
        // This will display the values of each variable as evaluated by the
        // autoscale formula.
        Console.WriteLine("AutoScaleRun.Results: " +
            eval.Results.Replace("$", "\n    $"));

        // Apply the formula to the pool since it evaluated successfully
        await batchClient.PoolOperations.EnableAutoScaleAsync(pool.Id, myFormula);
    }
    else
    {
        // Evaluation failed, output the message associated with the error
        Console.WriteLine("AutoScaleRun.Error.Message: " +
            eval.Error.Message);
    }
}

Pomyślna ocena formuły pokazanej w tym fragmencie kodu generuje wyniki podobne do następujących:

AutoScaleRun.Results:
    $TargetDedicatedNodes=10;
    $NodeDeallocationOption=requeue;
    $curTime=2016-10-13T19:18:47.805Z;
    $isWeekday=1;
    $isWorkingWeekdayHour=0;
    $workHours=0

Uzyskiwanie informacji na temat przebiegów skalowania automatycznego

Zaleca się okresowe sprawdzanie oceny formuły autoskalowania przez usługę Batch. W tym celu pobierz (lub odśwież) odwołanie do puli, a następnie sprawdź właściwości ostatniego przebiegu autoskalowania.

Na platformie .NET usługi Batch właściwość CloudPool.AutoScaleRun ma kilka właściwości, które zawierają informacje o najnowszym przebiegu automatycznego skalowania wykonywanego w puli:

W interfejsie API REST polecenie Pobierz informacje o żądaniu puli zwraca informacje o puli, które obejmują najnowsze informacje o przebiegu automatycznego skalowania we właściwości autoScaleRun .

Poniższy przykład w języku C# używa biblioteki platformy .NET usługi Batch do drukowania informacji o ostatnim uruchomieniu skalowania automatycznego w puli myPool.

await Cloud pool = myBatchClient.PoolOperations.GetPoolAsync("myPool");
Console.WriteLine("Last execution: " + pool.AutoScaleRun.Timestamp);
Console.WriteLine("Result:" + pool.AutoScaleRun.Results.Replace("$", "\n  $"));
Console.WriteLine("Error: " + pool.AutoScaleRun.Error);

Przykładowe dane wyjściowe z poprzedniego przykładu:

Last execution: 10/14/2016 18:36:43
Result:
  $TargetDedicatedNodes=10;
  $NodeDeallocationOption=requeue;
  $curTime=2016-10-14T18:36:43.282Z;
  $isWeekday=1;
  $isWorkingWeekdayHour=0;
  $workHours=0
Error:

Pobieranie historii uruchamiania autoskalowania przy użyciu zdarzeń automatycznego skalowania puli

Możesz również sprawdzić historię automatycznego skalowania, wykonując zapytanie o wartość PoolAutoScaleEvent. Usługa Batch emituje to zdarzenie, aby rejestrować każde wystąpienie oceny i wykonywania formuły autoskalowania, co może być pomocne w rozwiązywaniu potencjalnych problemów.

Przykładowe zdarzenie dla elementu PoolAutoScaleEvent:

{
    "id": "poolId",
    "timestamp": "2020-09-21T23:41:36.750Z",
    "formula": "...",
    "results": "$TargetDedicatedNodes=10;$NodeDeallocationOption=requeue;$curTime=2016-10-14T18:36:43.282Z;$isWeekday=1;$isWorkingWeekdayHour=0;$workHours=0",
    "error": {
        "code": "",
        "message": "",
        "values": []
    }
}

Przykładowe formuły automatycznego skalowania

Przyjrzyjmy się kilku formułom, które pokazują różne sposoby dostosowywania ilości zasobów obliczeniowych w puli.

Przykład 1. Korekta oparta na czasie

Załóżmy, że chcesz dostosować rozmiar puli na podstawie dnia tygodnia i godziny dnia. W tym przykładzie pokazano, jak odpowiednio zwiększyć lub zmniejszyć liczbę węzłów w puli.

Formuła najpierw uzyskuje bieżącą godzinę. Jeśli jest to dzień powszedni (1–5) i w godzinach pracy (od 8:00 do 18:00), rozmiar puli docelowej jest ustawiony na 20 węzłów. W przeciwnym razie ustawiono 10 węzłów.

$curTime = time();
$workHours = $curTime.hour >= 8 && $curTime.hour < 18;
$isWeekday = $curTime.weekday >= 1 && $curTime.weekday <= 5;
$isWorkingWeekdayHour = $workHours && $isWeekday;
$TargetDedicatedNodes = $isWorkingWeekdayHour ? 20:10;
$NodeDeallocationOption = taskcompletion;

$curTime można dostosować tak, aby odzwierciedlała lokalną strefę czasową, dodając time() element do produktu TimeZoneInterval_Hour i przesunięcie UTC. Na przykład należy użyć funkcji $curTime = time() + (-6 * TimeInterval_Hour); Mountain Daylight Time (MDT). Należy pamiętać, że przesunięcie musi zostać dostosowane na początku i na końcu czasu letniego, jeśli ma to zastosowanie.

Przykład 2. Korekta oparta na zadaniach

W tym przykładzie w języku C# rozmiar puli jest dostosowywany na podstawie liczby zadań w kolejce. Komentarze i podziały wierszy są uwzględniane w ciągach formuły.

// Get pending tasks for the past 15 minutes.
$samples = $PendingTasks.GetSamplePercent(TimeInterval_Minute * 15);
// If you have fewer than 70 percent data points, use the last sample point,
// otherwise use the maximum of last sample point and the history average.
$tasks = $samples < 70 ? max(0,$PendingTasks.GetSample(1)) : max( $PendingTasks.GetSample(1), avg($PendingTasks.GetSample(TimeInterval_Minute * 15)));
// If number of pending tasks is not 0, set targetVM to pending tasks, otherwise
// half of current dedicated.
$targetVMs = $tasks > 0? $tasks:max(0, $TargetDedicatedNodes/2);
// The pool size is capped at 20, if target VM value is more than that, set it
// to 20. This value should be adjusted according to your use case.
$TargetDedicatedNodes = max(0, min($targetVMs, 20));
// Set node deallocation mode - let running tasks finish before removing a node
$NodeDeallocationOption = taskcompletion;

Przykład 3. Ewidencjonowanie zadań równoległych

Ten przykład w języku C# dostosowuje rozmiar puli na podstawie liczby zadań. Ta formuła uwzględnia również wartość TaskSlotsPerNode ustawioną dla puli. Takie podejście jest przydatne w sytuacjach, w których równoległe wykonywanie zadań zostało włączone w puli.

// Determine whether 70 percent of the samples have been recorded in the past
// 15 minutes; if not, use last sample
$samples = $ActiveTasks.GetSamplePercent(TimeInterval_Minute * 15);
$tasks = $samples < 70 ? max(0,$ActiveTasks.GetSample(1)) : max( $ActiveTasks.GetSample(1),avg($ActiveTasks.GetSample(TimeInterval_Minute * 15)));
// Set the number of nodes to add to one-fourth the number of active tasks
// (the TaskSlotsPerNode property on this pool is set to 4, adjust
// this number for your use case)
$cores = $TargetDedicatedNodes * 4;
$extraVMs = (($tasks - $cores) + 3) / 4;
$targetVMs = ($TargetDedicatedNodes + $extraVMs);
// Attempt to grow the number of compute nodes to match the number of active
// tasks, with a maximum of 3
$TargetDedicatedNodes = max(0,min($targetVMs,3));
// Keep the nodes active until the tasks finish
$NodeDeallocationOption = taskcompletion;

Przykład 4. Ustawianie początkowego rozmiaru puli

W tym przykładzie pokazano przykład w języku C# z formułą autoskalowania, która ustawia rozmiar puli na określoną liczbę węzłów w początkowym okresie. Następnie dostosowuje rozmiar puli na podstawie liczby uruchomionych i aktywnych zadań.

W szczególności ta formuła wykonuje następujące czynności:

  • Ustawia początkowy rozmiar puli na cztery węzły.
  • Nie dostosowuje rozmiaru puli w ciągu pierwszych 10 minut od cyklu życia puli.
  • Po 10 minutach uzyskuje maksymalną wartość liczby uruchomionych i aktywnych zadań w ciągu ostatnich 60 minut.
    • Jeśli obie wartości mają wartość 0, co oznacza, że w ciągu ostatnich 60 minut nie uruchomiono żadnych zadań, rozmiar puli jest ustawiony na 0.
    • Jeśli dowolna wartość jest większa niż zero, nie zostanie wprowadzona żadna zmiana.
string now = DateTime.UtcNow.ToString("r");
string formula = string.Format(@"
    $TargetDedicatedNodes = {1};
    lifespan         = time() - time(""{0}"");
    span             = TimeInterval_Minute * 60;
    startup          = TimeInterval_Minute * 10;
    ratio            = 50;

    $TargetDedicatedNodes = (lifespan > startup ? (max($RunningTasks.GetSample(span, ratio), $ActiveTasks.GetSample(span, ratio)) == 0 ? 0 : $TargetDedicatedNodes) : {1});
    ", now, 4);

Następne kroki