Udostępnij przez


Stwórz formułę do automatycznego skalowania węzłów obliczeniowych w puli 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 pracy. Te węzły mogą być węzłami dedykowanymi lub węzłami Azure Spot. Usługa Batch okresowo przegląda dane metryk usługi i używa ich do dostosowywania liczby węzłów w puli według Twojej formuły i w wyznaczonym przez Ciebie interwale.

Automatyczne skalowanie można włączyć podczas tworzenia puli lub stosować je do istniejącej puli. Usługa Batch pozwala ocenić formuły przed ich przypisaniem do pul oraz monitorować stan 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 ustalonego 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ć przydziały na koncie, zapoznaj się z Przydziałami i limitami dla usługi Azure Batch.

Jeśli utworzyłeś konto w trybie subskrypcji użytkownika, twoje konto dzieli podstawowy limit dla tej 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 to zdefiniowana wartość ciągu, 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 okresach 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 15 minut 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 ją modyfikować w celu skalowania węzłów typu spot.

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

Ważne

Obecnie usługa Batch ma ograniczenia dotyczące rozwiązywania oczekujących zadań. Gdy zadanie zostanie dodane do pracy, jest ono również dodawane do wewnętrznej kolejki używanej przez usługę Batch do planowania. Jeśli zadanie zostanie usunięte przed zaplanowaniem, może pozostać w kolejce, co spowoduje, że nadal będzie ono liczone w elemencie $PendingTasks. To usunięte zadanie zostanie ostatecznie wyczyszczone z kolejki, gdy usługa Batch będzie mieć możliwość pobrania zadań z kolejki i harmonogramowania ich z wykorzystaniem bezczynnych węzłów w puli usługi Batch.

Przerwane 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ł spot jest wywłaszczony, 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 Spot, jednocześnie zapewniając, że w czasie działania 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 oraz dodatkowe przykłady 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ę są zmiennymi do odczytu i zapisu, 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 Liczba docelowa dedykowanych węzłów obliczeniowych dla puli. Określony jako cel, ponieważ pula nie zawsze może uzyskać żądaną liczbę węzłów. Na przykład, jeśli docelowa liczba dedykowanych węzłów zostanie zmieniona w wyniku oceny autoskalowania, zanim pula osiągnie początkowy cel, może się zdarzyć, że pula tego celu nie osiągnie.

Pula na koncie utworzonym w trybie usługi Batch może nie osiągnąć zamierzonego celu, jeśli zamierzony cel przekroczy limit węzła konta usługi Batch lub 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.
$DoceloweWęzłyNiskiegoPriorytetu Docelowa liczba węzłów obliczeniowych typu Spot dla puli. Określony jako cel, ponieważ pula nie zawsze może uzyskać żądaną liczbę węzłów. Jeśli na przykład docelowa liczba węzłów Spot zostanie zmodyfikowana w wyniku oceny autoskalowania zanim pula osiągnie początkowy cel, pula może nie dotrzeć do celu. Pula może również nie osiągnąć celu, jeśli cel przekracza węzeł konta Batch lub limit przydziału rdzeni dla konta.

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 Zdarzenie, które ma miejsce 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ń, co zapobiega marnowaniu wykonanej pracy.
- 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 przez usługę 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 związane z wydawaniem pracy 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 skutkować usunięciem węzłów, co pozostawi brak dostępnych węzłów do uruchamiania zadań związanych z wydaniem.

Napiwek

Te zdefiniowane przez usługę jako tylko do odczytu zmienne to obiekty, które zapewniają różne metody uzyskiwania dostępu do danych skorelowanych z nimi. 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.
$AktywneZadania 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 licznika $ActiveTasks. Dla zadania z wieloma instancjami, $ActiveTasks zawiera liczbę instancji ustawionych dla tego zadania.
$RunningTasks Liczba zadań w stanie uruchomienia.
$ZadaniaOczekujące Suma wartości $ActiveTasks i $RunningTasks.
$ZakonczoneZadania Liczba zadań zakończonych pomyślnie.
$NieudaneZadania Liczba zadań zakończonych niepowodzeniem.
$TaskSlotsPerNode Liczba slotów zadaniowych, których można użyć do uruchamiania współbieżnych zadań na pojedynczym 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.

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:

  • podwójny
  • doubleVec
  • doubleVecList
  • sznurek
  • timestamp: struktura złożona zawierająca następujące człony
    • rok
    • 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)
  • przedział czasowy
    • PrzedziałCzasu_Zero
    • CzasTrwania_100ns
    • PrzedziałCzasu_Mikrosekunda
    • InterwałCzasowy_Milisekunda
    • PrzedziałCzasu_Sekunda
    • PrzedziałCzasu_Minuta
    • TimeInterval_Godzina
    • InterwałCzasu_Dzień
    • PrzedziałCzasu_Tydzień
    • PrzedziałCzasu_Rok

Operacje

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

Operacja Obsługiwane operatory Typ wyniku
podwójny operator +, -, *, / podwójny
Podwójny operator przedziału czasu * przedział czasu
doubleVec , operator podwójny +, -, *, / doubleVec
doubleVec operator doubleVec +, -, *, / doubleVec
timeinterval operator podwójny *, / przedział czasu
przedział czasowy operator przedział czasowy +, - przedział czasu
przedział czasowy operator sygnatura czasowa + znacznik czasu
timestamp , operator timeinterval + znacznik czasu
sygnatura czasowa operator sygnatura czasowa - przedział czasu
operator podwójny -, ! podwójny
operator przedział czasu - przedział czasu
podwójny operator <, <=, ==, =, >>, != podwójny
ciąg operator ciąg <, <=, ==, =, >>, != podwójny
sygnatura czasowa operator sygnatura czasowa <, <=, ==, =, >>, != podwójny
przedział czasowy operator przedział czasowy <, <=, ==, =, >>, != podwójny
podwójny operator &&, || podwójny

Testowanie liczby zmiennoprzecinkowej za pomocą ternarnego operatora (double ? statement1 : statement2) skutkuje tym, że wartość niezerowa jest traktowana jako true, a zero jako false.

Funkcje

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

Funkcja Typ zwracany opis
avg(doubleVecList) podwójny Zwraca średnią wartość dla wszystkich wartości w doubleVecList.
ceil(double) podwójny Zwraca najmniejszą wartość całkowitą nie mniejszą niż podwójna.
ceil(doubleVecList) doubleVec Zwraca wektor złożony z poszczególnych składników ceil doubleVecList.
zaokrąglenie_w_dół(double) podwójny Zwraca największą wartość całkowitą nie większą niż podwójna.
floor(doubleVecList) doubleVec Zwraca wektor złożony z poszczególnych składników floor doubleVecList.
len(doubleVecList) podwójny Zwraca długość wektora utworzonego na podstawie elementu doubleVecList.
lg(double) podwójny Zwraca logarytm o podstawie 2 z liczby zmiennoprzecinkowej typu double.
lg(doubleVecList) doubleVec Zwraca wektor złożony z poszczególnych składników lg doubleVecList.
ln(podwójne) podwójny Zwraca dziennik naturalny podwójnej wartości.
ln(doubleVecList) doubleVec Zwraca wektor złożony z poszczególnych składników ln doubleVecList.
log(double) podwójny Zwraca logarytm dziesiętny z liczby zmiennoprzecinkowej typu double.
log(doubleVecList) doubleVec Zwraca wektor złożony z poszczególnych składników log doubleVecList.
max(doubleVecList) podwójny Zwraca wartość maksymalną w doubleVecList.
min(doubleVecList) podwójny Zwraca wartość minimalną w doubleVecList.
norm(doubleVecList) podwójny Zwraca normę dwójkową wektora utworzonego na podstawie doubleVecList.
percentyl(doubleVec v, double p) podwójny Zwraca element percentylowy wektora v.
rand() podwójny Zwraca wartość losową z zakresu od 0,0 do 1,0.
range(doubleVecList) podwójny Zwraca różnicę między wartościami min i max w doubleVecList.
zaokrąglij(double) podwójny Zwraca najbliższą wartość całkowitą do wartości podwójnej (w formacie zmiennoprzecinkowym), zaokrąglając przypadki w połowie drogi od zera.
zaokrąglij(doubleVecList) doubleVec Zwraca wektor złożony z poszczególnych składników round doubleVecList.
std(doubleVecList) podwójny Zwraca odchylenie standardowe próbki dla wartości w doubleVecList.
zatrzymaj() Zatrzymuje ocenę wyrażenia autoskalowania.
sum(doubleVecList) podwójny Zwraca sumę wszystkich składników doubleVecList.
time(string dateTime="") znacznik czasu Zwraca znacznik czasu bieżącego czasu, jeśli nie przekazano żadnych parametrów, lub znacznik czasu ciągu znaków dateTime, jeśli zostanie on przekazany. Obsługiwane formaty danych i czasu to W3C-DTF i RFC 1123.
val(doubleVec v, double i) podwójny Zwraca wartość elementu znajdującego się na pozycji i w wektorze v, z zerowym indeksem początkowym.

Niektóre funkcje opisane w poprzedniej tabeli mogą akceptować listę jako argument. Lista rozdzielona przecinkami jest dowolną kombinacją double 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], to wywołanie avg(v) jest równoważne z wywołaniem avg(1,2,3). Wywołanie avg(v, 7) jest równoważne wywołaniu 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
- $BieżąceWęzłyNiskiegoPriorytetu
- $PreemptedNodeCount
- $UsableNodeCount

Te zmienne zdefiniowane przez usługę są przydatne do wprowadzania korekt w oparciu o użycie zasobów węzła:
- $CPUPercent
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
- $ZadaniaOczekujące
- $ZadaniaZakończoneSukcesem
- $NieudaneZadania

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 próbkami.

Metody

Formuły automatycznego skalowania 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 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.

Próbka to 30 sekund 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 $CPUPercent.GetSample(TimeInterval_Minute * 10) zwróciłby 20 próbek, 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.
Funkcja GetSamplePeriod() Zwraca częstotliwość próbkowania w historycznym zestawie danych.
Funkcja Count() Zwraca łączną liczbę próbek w historii metryk.
CzasRozpoczęciaHistorii() 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] ). Ponieważ metoda GetSample kończy się niepowodzeniem, jeśli procent zwróconych próbek jest mniejszy niż określony samplePercent, możesz najpierw użyć metody GetSamplePercent, aby to 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 ich udostępnieniem (i odczytaniem przez) formuły 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

Kiedy samplePercent jest przekazywany do metody GetSample() lub wywoływana jest metoda GetSamplePercent(), procent oznacza porównanie między całkowitą możliwą liczbą próbek zarejestrowanych przez usługę Batch a liczbą 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 być dostępnych tylko 15 próbek, które formuła autoskalowania może odczytać. 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 powiększają i zmniejszają pule poprzez dodawanie lub usuwanie węzłów. Ponieważ węzły kosztują pieniądze, upewnij się, że twoje formuły korzystają z zaawansowanej metody analizy opartej na wystarczających danych. Zaleca się użycie analizy typu trendu w formułach. Ten rodzaj zwiększa i zmniejsza pule zasobów 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. Gdy wymuszasz niepowodzenie oceny formuły, instrukcja dla Batch polega na zaprzestaniu kontynuowania oceny formuły, jeżeli nie jest dostępna określona procentowa liczba próbek. W takim przypadku nie wprowadza się żadnych zmian w rozmiarze puli. Aby określić wymagany procent próbek do pomyślnego przeprowadzenia oceny, określ go jako trzeci parametr w GetSample(). 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óbek, zawsze należy określić przedział czasu z czasem początkowym okresu przeszukiwania, 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.

Napisz formułę autoskalowania

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, na których są wykonywane zadania. Jeśli to konieczne, poczekaj na zakończenie zadań przed usunięciem węzłów.

Pierwsze polecenie w formule zwiększa liczbę węzłów podczas wysokiego użycia procesora. 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 wartości $totalDedicatedNodes z powyższego polecenia.

$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 dopilnuj, aby węzły nie zostały usunięte, dopóki ich zadania nie zostaną ukoń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łą automatycznego skalowania 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 od minuty, ale raczej ma na celu stopniowe dostosowywanie rozmiaru puli przy uruchamianiu obciążenia.

Utwórz pulę z obsługą automatycznego skalowania przy użyciu SDK usługi Batch

Skalowanie automatyczne puli można skonfigurować przy użyciu dowolnego z zestawów SDK usługi Batch, interfejsu API REST usługi Batch, poleceń cmdlet programu Batch PowerShell i Batch CLI. W tej sekcji przedstawiono przykłady dla platformy .NET i języka Python.

.SIEĆ

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

  1. Utwórz pulę za pomocą 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ą 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 zainicjowaną instancją 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 właściwości AutoScaleEnabled 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 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 pakietu .NET SDK, odwiedź repozytorium szybkiego startu dla .NET Batch w serwisie GitHub.

Pyton

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 Batch Python Quickstart repository na 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 składania żą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 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 użyto biblioteki Batch .NET w języku C#, aby umożliwić autoskalowanie 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 na myexistingpool, to po wykonaniu poniższego kodu platformy .NET jego formuła autoskalowania zostaje zastąpiona zawartością myNewFormula.

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

Zaktualizuj interwał autoskalowania automatycznego

Aby zaktualizować interwał oceny dla istniejącej puli z włączonym autoskalowaniem, ponownie włącz autoskalowanie z nowym interwałem. Aby na przykład ustawić interwał oceny autoskalowania na 60 minut dla puli, która jest już włączona z autoskalowaniem w .NET:

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

Oceń formułę autoskalowania

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 jednowierszowa formuła $TargetDedicatedNodes = 0. Następnie użyj jednej z następujących opcji, aby ocenić formułę, którą chcesz przetestować:

Poniższy przykład Batch .NET 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 procesó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.

W Batch .NET właściwość CloudPool.AutoScaleRun ma kilka właściwości, które zawierają informacje o najnowszym automatycznym skalowaniu wykonanym na puli:

W interfejsie API REST, informacje o puli obejmują najnowsze dane o przebiegu automatycznego skalowania w właściwości autoScaleRun.

Poniższy przykład w języku C# używa biblioteki Batch platformy .NET do wyświetlania informacji o ostatnim uruchomieniu autoskalowania 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 także sprawdzić historię automatycznego skalowania, wysyłając zapytanie o 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 pory 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 liczba węzłów jest ustawiona na 10.

$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ć, aby uwzględniało lokalną strefę czasową, dodając time() do wyniku TimeZoneInterval_Hour z przesunięciem UTC. Na przykład, użyj $curTime = time() + (-6 * TimeInterval_Hour); czasu górskiego letniego (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 również uwzględnia 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 okresu istnienia 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