Práticas recomendadas de FinOps para computação
Este artigo descreve uma coleção de práticas comprovadas de FinOps para serviços de computação. Ele fornece orientação sobre como otimizar custos, melhorar a eficiência e obter informações sobre seus recursos de computação no Azure. As práticas são categorizadas com base no tipo de serviço de computação, como máquinas virtuais (VM), Serviço Kubernetes do Azure (AKS) e Azure Functions.
Azure Kubernetes Service
A seção a seguir fornece uma consulta do Azure Resource Graph (ARG) para clusters AKS. A consulta ajuda você a obter informações sobre suas VMs.
Consulta - cluster AKS
Esta consulta ARG recupera informações detalhadas sobre clusters AKS em seu ambiente do Azure.
Categoria
Gestão de recursos
Consulta
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
Máquinas virtuais
As máquinas virtuais (VMs) do Azure são um dos vários tipos de recursos de computação escalonáveis sob demanda que o Azure oferece. Normalmente, você escolhe uma VM quando precisa de mais controle sobre o ambiente de computação do que as outras opções oferecem.
Uma VM do Azure oferece a flexibilidade da virtualização sem ter que comprar e manter o hardware físico que a executa. No entanto, você ainda precisa manter a VM executando tarefas, como configurar, aplicar patches e instalar o software que é executado nela.
Recursos relacionados:
- Sobre máquinas virtuais
- Preços de máquinas virtuais
- Documentação da máquina virtual
- serviços da Azure para computação escalável a pedido
Desalocar máquinas virtuais
Recomendação: Desalocar VMs para evitar cobranças por recursos de computação não utilizados. Evite parar VMs sem deslocalizá-las.
Sobre VMs não em execução
As VMs têm 2 estados não em execução: Interrompido e Deslocalizado.
As VMs paradas foram desligadas de dentro do sistema operativo (por exemplo, usando o comando shutdown). As VMs interrompidas são desligadas, mas o Azure ainda reserva recursos de computação, como CPU e memória. Como os recursos de computação são reservados e não podem ser usados por outras VMs, essas VMs continuam a incorrer em encargos de computação.
As VMs desalocadas são interrompidas por meio de APIs de gerenciamento de nuvem no portal do Azure, CLI, PowerShell ou outra ferramenta de cliente. Quando uma VM é deslocalizada, o Azure libera os recursos de computação correspondentes. Como os recursos de computação são liberados, essas VMs não incorrerão em encargos de computação; no entanto, é importante observar que tanto as VMs paradas quanto as desalocadas incorrem em encargos não computáveis, como encargos de armazenamento de discos.
Identificar VMs paradas
Use a seguinte consulta do Azure Resource Graph (ARG) para identificar VMs interrompidas que não foram deslocalizadas. Ele recupera detalhes sobre seu estado de energia, local, grupo de recursos e ID de assinatura.
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
Aproveite os descontos de compromisso
Recomendação: Aproveite os descontos de compromisso para economizar até 72% em comparação com os custos da lista.
Sobre os descontos de compromisso
Os descontos de compromisso são incentivos financeiros oferecidos a organizações que se comprometem a usar os serviços do Azure por um período ou período especificado, geralmente um ou três anos. Ao concordar com uma quantidade fixa de uso ou gasto (custo) para o período, as organizações podem beneficiar-se de descontos significativos (até 72%) em comparação com os preços de lista. Os descontos são aplicados a recursos elegíveis, ajudando as organizações a economizar em seus custos de nuvem e, ao mesmo tempo, fornecendo flexibilidade e previsibilidade em seu orçamento.
Para saber mais sobre descontos de compromisso, consulte a capacidade de otimização de tarifa .
Meça a cobertura do desconto de compromisso para máquinas virtuais
Utilize a seguinte consulta do hub FinOps para medir a cobertura geral do desconto por compromisso de VM.
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
Use a consulta a seguir para medir a cobertura por VM.
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
Para saber mais sobre hubs FinOps, consulte .
Consulta - Detalhes do conjunto de dimensionamento da máquina virtual
Esta consulta analisa os Conjuntos de Escala de Máquina Virtual em seu ambiente do Azure com base em sua SKU, prioridade de VM spot e política de combinação de prioridades. Ele fornece insights para otimização de custos e estratégias de gerenciamento de recursos.
Categoria
Gestão de recursos
Consulta
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
Consulta - Análise de tipo de processador de máquina virtual
Esta consulta identifica o tipo de processador (ARM, AMD ou Intel) usado por VMs em seu ambiente do Azure. Ele ajuda a entender a distribuição de VMs em diferentes arquiteturas de processador, o que é útil para otimizar o desempenho da carga de trabalho e a eficiência de custos.
Categoria
Gestão de recursos
Consulta
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
Procura mais?
Perdemos alguma coisa? Gostaria de ver algo acrescentado? Adoraríamos saber mais sobre quaisquer perguntas, problemas ou soluções que você gostaria de ver abordadas aqui. Crie um novo problema com os detalhes que você gostaria de ver incluídos aqui.
Conteúdos relacionados
Recursos relacionados:
Produtos relacionados:
Soluções relacionadas:
- Relatórios do Power BI do kit de ferramentas FinOps
- Hubs FinOps
- Pastas de trabalho FinOps
- Motor de otimização