Najlepsze praktyki FinOps dotyczące obliczeń

W tym artykule opisano kolekcję sprawdzonych rozwiązań FinOps dotyczących usług obliczeniowych. Zawiera wskazówki dotyczące optymalizowania kosztów, poprawy wydajności i uzyskiwania wglądu w zasoby obliczeniowe na platformie Azure. Praktyki są podzielone na kategorie na podstawie typu usługi obliczeniowej, takiej jak maszyny wirtualne, usługa Azure Kubernetes Service (AKS) i usługa Azure Functions.


Azure Kubernetes Service

Azure Kubernetes Service (AKS) upraszcza wdrażanie aplikacji konteneryzowanych i zarządzanie nimi. Oferuje bezserwerowy Kubernetes, zintegrowane środowisko CI/CD oraz zabezpieczenia i mechanizmy nadzoru klasy korporacyjnej.

Powiązane zasoby:

Zapytanie: szczegóły klastra AKS

To zapytanie ARG pobiera szczegółowe informacje o klastrach Azure Kubernetes Service (AKS) w Twoim środowisku Azure.

Kategoria

Zarządzanie zasobami

Zapytanie

resources
| where type == "microsoft.containerservice/managedclusters"
| extend AgentPoolProfiles = properties.agentPoolProfiles
| mvexpand AgentPoolProfiles
| project
    id,
    ProfileName = tostring(AgentPoolProfiles.name),
    Sku = tostring(sku.name),
    Tier = tostring(sku.tier),
    mode = AgentPoolProfiles.mode,
    AutoScaleEnabled = AgentPoolProfiles.enableAutoScaling,
    SpotVM = AgentPoolProfiles.scaleSetPriority,
    VMSize = tostring(AgentPoolProfiles.vmSize),
    nodeCount = tostring(AgentPoolProfiles.['count']),
    minCount = tostring(AgentPoolProfiles.minCount),
    maxCount = tostring(AgentPoolProfiles.maxCount),
    location,
    resourceGroup,
    subscriptionId,
    AKSname = name

Korzystanie z maszyn wirtualnych typu Spot w klastrach AKS

Zalecenie: Korzystaj z maszyn wirtualnych Spot dla pul agentów usługi AKS, aby obniżyć koszty obliczeniowe w przypadku obciążeń odpornych na awarie i podatnych na przerwanie.

Informacje o maszynach wirtualnych typu Spot w usłudze AKS

Maszyny wirtualne Spot wykorzystują niewykorzystane zasoby platformy Azure po znacznie niższych kosztach. Gdy platforma Azure musi odzyskać zasoby, infrastruktura Azure usuwa maszyny wirtualne Spot. Maszyny wirtualne typu Spot są przydatne w przypadku obciążeń, które tolerują przerwy w działaniu, takich jak zadania przetwarzania wsadowego, środowiska programistyczne i testowe oraz duże zadania obliczeniowe.

Klastry usługi AKS, które korzystają z automatycznego skalowania, ale nie wykorzystują maszyn wirtualnych Spot, mogą ponosić wyższe koszty, niż jest to konieczne. Włączając maszyny wirtualne typu spot dla obciążeń przerywanych, można znacznie obniżyć koszty obliczeń. To zalecenie dotyczy tylko klastrów, w których działają obciążenia mogące tolerować przerwy. Nie wszystkie obciążenia są odpowiednie dla maszyn wirtualnych typu spot.

Note

Centra FinOps mogą automatycznie identyfikować klastry AKS bez maszyn wirtualnych Spot w ramach opcjonalnej rekomendacji. Dowiedz się więcej.

Zapytanie: klastry AKS bez maszyn wirtualnych Spot

Użyj następującego zapytania ARG, aby zidentyfikować klastry AKS z włączoną funkcją automatycznego skalowania, które nie korzystają z maszyn wirtualnych Spot.

Kategoria

Optimization

Zapytanie

resources
| where type == 'microsoft.containerservice/managedclusters'
| mvexpand AgentPoolProfiles = properties.agentPoolProfiles
| where AgentPoolProfiles.enableAutoScaling == true
    and isnull(AgentPoolProfiles.scaleSetPriority)
| project
    ResourceId = id,
    AKSName = name,
    ProfileName = tostring(AgentPoolProfiles.name),
    VMSize = tostring(AgentPoolProfiles.vmSize),
    NodeCount = tostring(AgentPoolProfiles.['count']),
    MinCount = tostring(AgentPoolProfiles.minCount),
    MaxCount = tostring(AgentPoolProfiles.maxCount),
    Region = location,
    ResourceGroupName = resourceGroup,
    SubscriptionId = subscriptionId

Maszyny wirtualne

Maszyny wirtualne platformy Azure to jeden z kilku typów na żądanie skalowalnych zasobów obliczeniowych, które platforma Azure oferuje. Zazwyczaj wybierasz maszynę wirtualną, gdy potrzebujesz większej kontroli nad środowiskiem obliczeniowym niż inne opcje.

Maszyna wirtualna Azure umożliwia swobodne korzystanie z wirtualizacji bez konieczności kupowania i utrzymywania fizycznego sprzętu potrzebnego do jej działania. Jednak nadal musisz obsługiwać maszynę wirtualną, wykonując zadania, takie jak konfigurowanie, stosowanie poprawek i instalowanie na nim oprogramowania.

Powiązane zasoby:

Zwolnienie maszyn wirtualnych

Zalecenie: Cofnij przydział maszyn wirtualnych, aby uniknąć nieużywanych opłat za zasoby obliczeniowe. Unikaj zatrzymywania maszyn wirtualnych bez ich dealokacji.

Informacje o nieaktywnych maszynach wirtualnych

Maszyny wirtualne mają dwa stany nieaktywne: Zatrzymano i Dezaktywowano.

Zatrzymane maszyny wirtualne zostały zamknięte z poziomu systemu operacyjnego (na przykład za pomocą polecenia Zamknij). Zatrzymane maszyny wirtualne są wyłączone, ale platforma Azure nadal rezerwuje zasoby obliczeniowe, takie jak procesor CPU i pamięć. Ponieważ zasoby obliczeniowe są zarezerwowane i nie są dostępne do użycia z innymi maszynami wirtualnymi, te maszyny wirtualne nadal generują opłaty za obliczenia.

Maszyny wirtualne, którym cofnięto przydział, są zatrzymywane za pomocą interfejsów API zarządzania chmurą w portalu Azure, CLI, PowerShell lub innym narzędziu klienckim. Kiedy maszyna wirtualna jest zdezaktywowana, Azure zwalnia odpowiednie zasoby obliczeniowe. Ponieważ zasoby obliczeniowe są zwalniane, te maszyny wirtualne nie generują opłat za obliczenia. Należy jednak pamiętać, że zarówno zatrzymane, jak i deaktywowane maszyny wirtualne nadal powodują naliczanie opłat niezwiązanych z obliczeniami, takich jak opłaty za przechowywanie danych na dyskach.

Note

Centra FinOps mogą automatycznie wykrywać zatrzymane maszyny wirtualne, które nie zostały zwolnione. Dowiedz się więcej.

Identyfikowanie zatrzymanych maszyn wirtualnych

Użyj następującego zapytania usługi Azure Resource Graph (ARG), aby zidentyfikować wyłączone maszyny wirtualne, które nie zostały zdealokowane. Pobiera szczegółowe informacje o stanie zasilania, lokalizacji, grupie zasobów i identyfikatorze subskrypcji.

resources
| where type =~ 'microsoft.compute/virtualmachines'
| extend PowerState = tostring(properties.extended.instanceView.powerState.displayStatus)
| where PowerState !in =('VM deallocated', 'VM running')
| project
    ResourceId = id,
    PowerState,
    Region = location,
    ResourceGroupName = resourceGroup,
    SubscriptionId = subscriptionId

Zastosowanie rabatów na zobowiązania

Zalecenie: Skorzystaj z rabatów za zobowiązanie, aby zaoszczędzić do 72% w porównaniu z cenami z cennika.

Informacje o rabatach na zobowiązania

Rabaty na zobowiązania to zachęty finansowe oferowane organizacjom, które zobowiązują się do korzystania z usług platformy Azure przez określony okres lub okres, zazwyczaj jeden lub trzy lata. Zgadzając się na stałą kwotę zużycia lub wydatków na dany okres, organizacje mogą korzystać ze znaczących rabatów (do 72%) w porównaniu z cenami listowymi. Rabaty są stosowane do kwalifikujących się zasobów, pomagając organizacjom zaoszczędzić na kosztach chmury, zapewniając jednocześnie elastyczność i przewidywalność budżetowania.

Aby dowiedzieć się więcej na temat rabatów na zobowiązania, zapoznaj się z możliwością optymalizacji stawek w .

Pomiar pokrycia rabatu z tytułu zobowiązania na maszynę wirtualną

Użyj następującego zapytania z centrum FinOps, aby zmierzyć ogólne pokrycie rabatu zobowiązań dla maszyn wirtualnych.

Costs
| where ResourceType =~ 'Virtual machine'
| where x_SkuMeterCategory startswith 'Virtual Machines'
//
// Join with prices to filter out ineligible SKUs
| extend tmp_MeterKey = strcat(substring(ChargePeriodStart, 0, 7), x_SkuMeterId)
| project tmp_MeterKey, EffectiveCost, PricingCategory, CommitmentDiscountCategory, ResourceName, x_ResourceGroupName, SubAccountName, BillingCurrency
| join kind=leftouter (
    Prices
    | where x_SkuMeterCategory startswith 'Virtual Machines'
    | summarize sp = countif(x_SkuPriceType == 'SavingsPlan'), ri = countif(x_SkuPriceType == 'ReservedInstance')
        by tmp_MeterKey = strcat(substring(x_EffectivePeriodStart, 0, 7), x_SkuMeterId)
    | project tmp_MeterKey, x_CommitmentDiscountSpendEligibility = iff(sp == 0, 'Not Eligible', 'Eligible'), x_CommitmentDiscountUsageEligibility = iff(ri == 0, 'Not Eligible', 'Eligible')
) on tmp_MeterKey
| extend x_CommitmentDiscountUsageEligibility = iff(isempty(x_CommitmentDiscountUsageEligibility), '(missing prices)', x_CommitmentDiscountUsageEligibility)
| extend x_CommitmentDiscountSpendEligibility = iff(isempty(x_CommitmentDiscountSpendEligibility), '(missing prices)', x_CommitmentDiscountSpendEligibility)
//
// Sum costs
| summarize
    TotalCost = sum(EffectiveCost),
    OnDemandCost = sumif(EffectiveCost, PricingCategory == 'Standard'),
    SpotCost = sumif(EffectiveCost, PricingCategory == 'Dynamic'),
    CommittedCost = sumif(EffectiveCost, PricingCategory == 'Committed'),
    CommittedSpendCost = sumif(EffectiveCost, CommitmentDiscountCategory == 'Spend'),
    CommittedUsageCost = sumif(EffectiveCost, CommitmentDiscountCategory == 'Usage')
    by x_CommitmentDiscountUsageEligibility, x_CommitmentDiscountSpendEligibility, BillingCurrency
| extend OnDemandPercent = round(OnDemandCost / TotalCost * 100, 2)
| extend CoveragePercent = round(CommittedCost / TotalCost * 100, 2)
| extend CoverageUsagePercent = round(CommittedUsageCost / TotalCost * 100, 2)
| extend CoverageSpendPercent = round(CommittedSpendCost / TotalCost * 100, 2)
| order by CoveragePercent desc

Użyj następującego zapytania, aby określić kosztów przypadających na maszynę wirtualną, uwzględniając zniżki z tytułu zobowiązań.

Costs
| where ResourceType =~ 'Virtual machine'
| where x_SkuMeterCategory startswith 'Virtual Machines'
//
// Join with prices to filter out ineligible SKUs
| extend tmp_MeterKey = strcat(substring(ChargePeriodStart, 0, 7), x_SkuMeterId)
| project tmp_MeterKey, EffectiveCost, PricingCategory, CommitmentDiscountCategory, ResourceName, x_ResourceGroupName, SubAccountName, BillingCurrency
| join kind=leftouter (
    Prices
    | where x_SkuMeterCategory startswith 'Virtual Machines'
    | summarize sp = countif(x_SkuPriceType == 'SavingsPlan'), ri = countif(x_SkuPriceType == 'ReservedInstance')
        by tmp_MeterKey = strcat(substring(x_EffectivePeriodStart, 0, 7), x_SkuMeterId)
    | project tmp_MeterKey, x_CommitmentDiscountSpendEligibility = iff(sp == 0, 'Not Eligible', 'Eligible'), x_CommitmentDiscountUsageEligibility = iff(ri == 0, 'Not Eligible', 'Eligible')
) on tmp_MeterKey
| extend x_CommitmentDiscountUsageEligibility = iff(isempty(x_CommitmentDiscountUsageEligibility), '(missing prices)', x_CommitmentDiscountUsageEligibility)
| extend x_CommitmentDiscountSpendEligibility = iff(isempty(x_CommitmentDiscountSpendEligibility), '(missing prices)', x_CommitmentDiscountSpendEligibility)
//
// Sum costs by resource
| summarize
    TotalCost = sum(EffectiveCost),
    OnDemandCost = sumif(EffectiveCost, PricingCategory == 'Standard'),
    SpotCost = sumif(EffectiveCost, PricingCategory == 'Dynamic'),
    CommittedCost = sumif(EffectiveCost, PricingCategory == 'Committed'),
    CommittedSpendCost = sumif(EffectiveCost, CommitmentDiscountCategory == 'Spend'),
    CommittedUsageCost = sumif(EffectiveCost, CommitmentDiscountCategory == 'Usage')
    by ResourceName, x_ResourceGroupName, SubAccountName, x_CommitmentDiscountUsageEligibility, x_CommitmentDiscountSpendEligibility, BillingCurrency
| extend OnDemandPercent = round(OnDemandCost / TotalCost * 100, 2)
| extend CoveragePercent = round(CommittedCost / TotalCost * 100, 2)
| extend CoverageUsagePercent = round(CommittedUsageCost / TotalCost * 100, 2)
| extend CoverageSpendPercent = round(CommittedSpendCost / TotalCost * 100, 2)
| order by CoveragePercent desc

Aby dowiedzieć się więcej na temat hubów FinOps, zapoznaj się z hubami FinOps.

Zapytanie: Szczegóły zestawu skalowania maszyn wirtualnych

To zapytanie analizuje zestawy skalowania maszyn wirtualnych w środowisku Azure na podstawie ich SKU, priorytetu maszyn wirtualnych typu spot i polityki mieszanych priorytetów. Udostępnia szczegółowe informacje na temat strategii optymalizacji kosztów i zarządzania zasobami.

Kategoria

Zarządzanie zasobami

Zapytanie

resources
| where type =~ 'microsoft.compute/virtualmachinescalesets'
| extend SpotVMs = tostring(properties.virtualMachineProfile.priority)
| extend SpotPriorityMix = tostring(properties.priorityMixPolicy)
| extend SKU = tostring(sku.name)
| extend resourceGroup = strcat('/subscriptions/', subscriptionId, '/resourceGroups/', resourceGroup)
| project id, SKU, SpotVMs, SpotPriorityMix, subscriptionId, resourceGroup, location

Migracja do zarządzanych dysków

Zalecenie: Migrowanie maszyn wirtualnych przy użyciu dysków niezarządzanych do dysków zarządzanych w celu zwiększenia niezawodności, uproszczenia zarządzania i przygotowania do wycofania dysków niezarządzanych.

Informacje o dyskach niezarządzanych

Dyski niezarządzane przechowują pliki VHD jako obiekty blob typu page na kontach usługi Azure Storage, co wymaga samodzielnego zarządzania pojemnością, wydajnością i zabezpieczeniami tych kont. Dyski zarządzane upraszczają zarządzanie dyskami, przejmując za Ciebie zarządzanie kontami magazynowymi, zapewniając większą niezawodność dzięki zestawom dostępności, bardziej szczegółową kontrolę dostępu oraz obsługę nowszych funkcji, takich jak szyfrowanie dysków i chwilowe zwiększanie wydajności. Microsoft ogłosił wycofanie dysków niezarządzanych, więc migracja na dyski zarządzane jest zarówno optymalizacją kosztów, jak i krokiem zgodności.

Note

Koncentratory FinOps mogą automatycznie identyfikować maszyny wirtualne przy użyciu dysków niezarządzanych. Dowiedz się więcej.

Identyfikowanie maszyn wirtualnych z dyskami niezarządzanymi

Użyj następującego zapytania usługi ARG, aby zidentyfikować maszyny wirtualne, które nadal używają dysków niezarządzanych.

resources
| where type =~ 'microsoft.compute/virtualmachines'
| where isnull(properties.storageProfile.osDisk.managedDisk)
| project
    ResourceId = tolower(id),
    ResourceName = name,
    OsDiskVhd = tostring(properties.storageProfile.osDisk.vhd.uri),
    Region = location,
    ResourceGroupName = resourceGroup,
    SubscriptionId = subscriptionId

Zapytanie: Analiza typu procesora maszyny wirtualnej

To zapytanie identyfikuje typ procesora (ARM, AMD lub Intel) używany przez maszyny wirtualne w środowisku platformy Azure. Pomaga to zrozumieć dystrybucję maszyn wirtualnych w różnych architekturach procesora, co jest przydatne do optymalizacji wydajności obciążeń i wydajności kosztów.

Kategoria

Zarządzanie zasobami

Zapytanie

resources
| where type == 'microsoft.compute/virtualmachines'
| extend vmSize = properties.hardwareProfile.vmSize
| extend processorType = case(
    // ARM Processors
    vmSize has "Epsv5"
        or vmSize has "Epdsv5"
        or vmSize has "Dpsv5"
        or vmSize has "Dpdsv", "ARM",
    // AMD Processors
    vmSize has "Standard_D2a"
        or vmSize has "Standard_D4a"
        or vmSize has "Standard_D8a"
        or vmSize has "Standard_D16a"
        or vmSize has "Standard_D32a"
        or vmSize has "Standard_D48a"
        or vmSize has "Standard_D64a"
        or vmSize has "Standard_D96a"
        or vmSize has "Standard_D2as"
        or vmSize has "Standard_D4as"
        or vmSize has "Standard_D8as"
        or vmSize has "Standard_D16as"
        or vmSize has "Standard_D32as"
        or vmSize has "Standard_D48as"
        or vmSize has "Standard_D64as"
        or vmSize has "Standard_D96as", "AMD",
    "Intel"
)
| project vmName = name, processorType, vmSize, resourceGroup

Używanie Korzyść użycia hybrydowego platformy Azure dla maszyn wirtualnych Windows

Zalecenie: Włącz Korzyść użycia hybrydowego platformy Azure dla maszyn wirtualnych Windows, aby zmniejszyć koszty licencjonowania przy użyciu istniejących licencji Windows Server lokalnych.

Informacje o Korzyść użycia hybrydowego platformy Azure dla Windows

Korzyść użycia hybrydowego platformy Azure umożliwia korzystanie z lokalnych licencji Windows Server z pakietem Software Assurance lub subskrypcją Windows Server do uruchamiania maszyn wirtualnych Windows w Azure przy obniżonych kosztach. Zamiast płacić za pełną licencję Windows Server z każdą maszyną wirtualną, możesz przenieść istniejące licencje i płacić tylko za podstawowy koszt obliczeniowy. To zalecenie ma zastosowanie tylko wtedy, gdy Organizacja ma licencje lokalne Windows Server.

Note

FinOps hubs mogą automatycznie identyfikować maszyny wirtualne z systemem Windows bez Korzyść użycia hybrydowego platformy Azure jako opcjonalne zalecenie. Dowiedz się więcej.

Zapytanie: maszyny wirtualne z systemem Windows bez Korzyść użycia hybrydowego platformy Azure

Użyj następującego zapytania ARG, aby zidentyfikować maszyny wirtualne z systemem Windows i zestawy skalowania maszyn wirtualnych, które nie korzystają z Korzyść użycia hybrydowego platformy Azure. Zapytanie wyklucza subskrypcje deweloperskie/testowe, które są już objęte licencjonowaniem w obniżonej cenie.

Kategoria

Optimization

Zapytanie

resourcecontainers
| where type =~ 'Microsoft.Resources/subscriptions'
| where tostring(properties.subscriptionPolicies.quotaId) !has 'MSDNDevTest_2014-09-01'
| project SubscriptionName = name, subscriptionId
| join (
    resources
    | where type =~ 'microsoft.compute/virtualmachines'
        or type =~ 'microsoft.compute/virtualMachineScaleSets'
    | where tostring(properties.storageProfile.osDisk.osType) == 'Windows'
        or tostring(properties.virtualMachineProfile.storageProfile.osDisk.osType) == 'Windows'
    | where tostring(properties.['licenseType']) !has 'Windows'
        and tostring(properties.virtualMachineProfile.['licenseType']) != 'Windows_Server'
    | project
        ResourceId = id,
        ResourceName = name,
        VMSize = tostring(properties.hardwareProfile.vmSize),
        LicenseType = tostring(properties.['licenseType']),
        Region = location,
        ResourceGroupName = resourceGroup,
        subscriptionId
) on subscriptionId
| project
    ResourceId,
    ResourceName,
    VMSize,
    LicenseType,
    Region,
    ResourceGroupName,
    SubscriptionName,
    SubscriptionId = subscriptionId

Korzystanie z Korzyść użycia hybrydowego platformy Azure dla maszyn wirtualnych SQL

Zalecenie: włącz Korzyść użycia hybrydowego platformy Azure dla maszyn wirtualnych SQL Server, aby zmniejszyć koszty licencjonowania przy użyciu istniejących licencji SQL Server lokalnych.

Informacje na temat usługi Korzyść użycia hybrydowego platformy Azure dla maszyn wirtualnych SQL

Korzyść użycia hybrydowego platformy Azure dla SQL Server umożliwia korzystanie z lokalnych licencji SQL Server z pakietem Software Assurance w celu uruchamiania maszyn wirtualnych SQL Server w Azure przy obniżonym koszcie. Ta korzyść dotyczy wersji Standard i Enterprise (wersje Developer i Express są już bezpłatne i nie wymagają Korzyść użycia hybrydowego platformy Azure). To zalecenie ma zastosowanie tylko wtedy, gdy Twoja organizacja ma licencje lokalne SQL Server z pakietem Software Assurance.

Note

FinOps hubs może automatycznie identyfikować maszyny wirtualne SQL bez Korzyść użycia hybrydowego platformy Azure jako zalecenia. Dowiedz się więcej.

Zapytanie: maszyny wirtualne z programem SQL Server bez Korzyść użycia hybrydowego platformy Azure

Użyj następującego zapytania ARG, aby zidentyfikować SQL Server maszyny wirtualne, które nie korzystają z Korzyść użycia hybrydowego platformy Azure. Zapytanie wyklucza subskrypcje deweloperskie/testowe i wersje Developer/Express.

Kategoria

Optimization

Zapytanie

resourcecontainers
| where type =~ 'Microsoft.Resources/subscriptions'
| where tostring(properties.subscriptionPolicies.quotaId) !has 'MSDNDevTest_2014-09-01'
| project SubscriptionName = name, subscriptionId
| join (
    resources
    | where type =~ 'Microsoft.SqlVirtualMachine/SqlVirtualMachines'
        and tostring(properties.['sqlServerLicenseType']) != 'AHUB'
    | project
        ResourceId = id,
        ResourceName = name,
        LicenseType = tostring(properties.['sqlServerLicenseType']),
        SQLVersion = tostring(properties.['sqlImageOffer']),
        SQLSKU = tostring(properties.['sqlImageSku']),
        Region = location,
        ResourceGroupName = resourceGroup,
        subscriptionId
) on subscriptionId
| join (
    resources
    | where type =~ 'Microsoft.Compute/virtualMachines'
    | project
        ResourceName = tolower(name),
        VMSize = tostring(properties.hardwareProfile.vmSize),
        subscriptionId
) on ResourceName
| where SQLSKU != 'Developer' and SQLSKU != 'Express'
| project
    ResourceId,
    ResourceName,
    VMSize,
    LicenseType,
    SQLVersion,
    SQLSKU,
    Region,
    ResourceGroupName,
    SubscriptionName,
    SubscriptionId = subscriptionId

Prześlij opinię

Daj nam znać, jak nam idzie, wystawiając krótką recenzję. Te recenzje służą do ulepszania i rozszerzania narzędzi i zasobów FinOps.

Jeśli szukasz czegoś konkretnego, zagłosuj na istniejący lub utwórz nowy pomysł. Podziel się pomysłami z innymi osobami, aby uzyskać więcej głosów. Skupiamy się na pomysłach z największą większością głosów.


Powiązane zasoby:

Powiązane produkty:

Powiązane rozwiązania: