İşlem için en iyi FinOps yöntemleri

Bu makalede, işlem hizmetleri için kanıtlanmış FinOps uygulamalarının bir koleksiyonu özetlenmektedir. Azure'da maliyetleri iyileştirme, verimliliği artırma ve işlem kaynaklarınızla ilgili içgörüler elde etme konusunda rehberlik sağlar. Uygulamalar sanal makineler (VM), Azure Kubernetes Service (AKS) ve Azure İşlevleri gibi işlem hizmeti türüne göre kategorilere ayrılmıştır.


Azure Kubernetes Service

Azure Kubernetes Service (AKS) kapsayıcılı uygulamaları dağıtmayı ve yönetmeyi kolaylaştırır. Sunucusuz Kubernetes, tümleşik bir CI/CD deneyimi ve kurumsal düzeyde güvenlik ve idare sunar.

İlgili kaynaklar:

Sorgu: AKS kümesi ayrıntıları

Bu ARG sorgusu, Azure ortamınızdaki AKS kümeleri hakkında ayrıntılı bilgileri alır.

Kategori

Kaynak yönetimi

Sorgu

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

AKS kümeleri için Spot VM'leri kullanma

Öneri: Aks aracı havuzları için Spot VM'leri kullanarak hataya dayanıklı, kesintiye neden olan iş yüklerinin işlem maliyetlerini azaltın.

AKS'deki Spot VM'ler hakkında

Spot VM'ler kullanılmayan Azure kapasitesinden önemli ölçüde daha düşük bir maliyetle yararlanır. Azure kapasiteye ihtiyacı olduğunda Azure altyapısı Spot VM'leri çıkartır. Spot VM'ler toplu işleme işleri, geliştirme/test ortamları ve büyük işlem iş yükleri gibi kesintileri işleyebilen iş yükleri için kullanışlıdır.

Otomatik ölçeklendirme kullanan ancak Spot VM'lerden yararlanmayen AKS kümeleri gerekenden fazla ödeme yapıyor olabilir. Kesintiye uğrayabilen iş yükleri için Spot VM'leri etkinleştirerek işlem maliyetlerini önemli ölçüde azaltabilirsiniz. Bu öneri yalnızca kesintileri tolere edebilen iş yüklerini çalıştıran kümeler için geçerlidir. Tüm iş yükleri Spot VM'ler için uygun değildir.

Note

FinOps hub'ları , bir kabul önerisi olarak Spot VM'leri olmayan AKS kümelerini otomatik olarak tanımlayabilir. Daha fazla bilgi edinin.

Sorgu: Spot VM'leri olmayan AKS kümeleri

Spot VM'leri kullanmayan otomatik ölçeklendirme etkinleştirilmiş AKS kümelerini tanımlamak için aşağıdaki ARG sorgusunu kullanın.

Kategori

Optimization

Sorgu

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

Sanal makineler

Azure sanal makineleri (VM'ler), Azure'ın sunduğu çeşitli isteğe bağlı, ölçeklenebilir bilgi işlem kaynaklarından biridir. Genellikle, bilgi işlem ortamı üzerinde diğer seçeneklerden daha fazla denetime ihtiyacınız olduğunda bir VM seçersiniz.

Bir Azure VM, onu çalıştıran fiziksel donanımı satın almanıza ve muhafaza etmenize gerek kalmadan size sanallaştırma esnekliği sunar. Ancak, yapılandırma, düzeltme eki uygulama ve üzerinde çalışan yazılımları yükleme gibi görevleri gerçekleştirerek VM'yi korumanız gerekir.

İlgili kaynaklar:

Sanal makineleri serbest bırakın

Öneri: Kullanılmayan işlem ücretlerinden kaçınmak için VM'leri serbest bırakma. VM'leri deallocate etmeden durdurmaktan kaçının.

Etkin olmayan VM'ler hakkında

VM'lerin iki etkin olmayan durumu vardır: Durduruldu ve Serbest Bırakıldı.

Durdurulan VM'ler işletim sisteminin içinden kapatıldı (örneğin, Kapat komutu kullanılarak). Durdurulan VM'ler kapatılır, ancak Azure cpu ve bellek gibi işlem kaynaklarını ayırmaya devam eder. İşlem kaynakları ayrılmış olduğundan ve diğer VM'lerle birlikte kullanılamadığından, bu VM'ler işlem ücretleri almaya devam eder.

Serbest bırakılmış VM'ler Azure portalında, CLI'da, PowerShell'de veya diğer istemci aracında bulut yönetimi API'leri aracılığıyla durdurulur. Bir VM serbest bırakıldığında Azure ilgili işlem kaynaklarını serbest bırakır. İşlem kaynakları yayınlandığından bu VM'ler işlem ücreti ödemez; ancak hem durdurulan hem de serbest bırakılan VM'lerin disklerden depolama ücretleri gibi işlemle ilgili olmayan ücretlendirmeler yapmaya devam ettiğini unutmayın.

Note

FinOps merkezleri, durdurulmuş ancak kaynakları serbest bırakılmamış VM'leri otomatik olarak tespit edebilir. Daha fazla bilgi edinin.

Durdurulan VM'leri tanımlama

Deallocate edilmemiş olan durdurulmuş VM'leri tanımlamak için aşağıdaki Azure Kaynak Grafı (ARG) sorgusunu kullanın. Güç durumu, konum, kaynak grubu ve abonelik kimliği hakkındaki ayrıntıları alır.

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

Taahhüt indirimlerini kullanma

Öneri: Liste maliyetlerine kıyasla en fazla 72% tasarruf etmek için taahhüt indirimlerini kullanın.

Taahhüt indirimleri hakkında

Taahhüt indirimleri, Azure hizmetlerini belirli bir süre veya dönem boyunca (genellikle bir veya üç yıl) kullanmayı taahhüt eden kuruluşlara sunulan finansal teşviklerdir. Kuruluşlar, dönem için sabit miktarda kullanımı veya harcamayı (maliyet) kabul ederek, liste fiyatlarına kıyasla önemli indirimlerden (en fazla 72%) yararlanabilir. Uygun kaynaklara indirimler uygulanarak kuruluşların bulut maliyetlerinden tasarruf etmelerine yardımcı olurken, bütçelerinde esneklik ve öngörülebilirlik sağlar.

Taahhüt indirimleri hakkında daha fazla bilgi edinmek için Oran iyileştirme özelliğine bakın.

Sanal makine taahhüdü indirim kapsamını ölçün

Genel VM taahhüt indirim kapsamını ölçmek için aşağıdaki FinOps hub sorgusunu kullanın.

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

Taahhüt indirimlerinin kapsamı dahil olmak üzere VM başına maliyet dökümünü ölçmek için aşağıdaki sorguyu kullanın.

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

FinOps hub'ları hakkında daha fazla bilgi edinmek için bkz. FinOps hub'ları.

Sorgu: Sanal makine ölçek kümesi ayrıntıları

Bu sorgu, Azure ortamınızdaki Sanal Makine Ölçek Kümelerini SKU'suna, spot VM önceliğine ve öncelik karışımı ilkesine göre analiz eder. Maliyet iyileştirme ve kaynak yönetimi stratejilerine yönelik içgörüler sağlar.

Kategori

Kaynak yönetimi

Sorgu

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

Yönetilen disklere geçme

Öneri: Güvenilirliği artırmak, yönetimi kolaylaştırmak ve yönetilmeyen disklerin kullanımdan kaldırılmasına hazırlanmak için yönetilmeyen diskleri kullanarak VM'leri yönetilen disklere geçirin.

Yönetilmeyen diskler hakkında

Yönetilmeyen diskler, VHD dosyalarını Azure Depolama hesaplarında sayfa blobları olarak depolar ve depolama hesabı kapasitesini, performansını ve güvenliğini kendiniz yönetmenizi gerektirir. Yönetilen diskler, depolama hesabı yönetimini sizin için işleyerek disk yönetimini basitleştirir; kullanılabilirlik kümeleriyle daha iyi güvenilirlik, daha ayrıntılı erişim denetimi ve disk şifreleme ve seri dağıtım gibi daha yeni özellikler için destek sağlar. Microsoft yönetilmeyen disklerin kullanımdan kaldırıldığını duyurdu, bu nedenle yönetilen disklere geçiş hem maliyet iyileştirme hem de uyumluluk adımıdır.

Note

FinOps hub'ları yönetilmeyen diskleri kullanarak VM'leri otomatik olarak tanımlayabilir. Daha fazla bilgi edinin.

Yönetilmeyen disklere sahip VM'leri tanımlama

Yönetilmeyen diskleri kullanmaya devam eden VM'leri tanımlamak için aşağıdaki ARG sorgusunu kullanın.

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

Sorgu: Sanal makine işlemci türü analizi

Bu sorgu, Azure ortamınızdaki VM'ler tarafından kullanılan işlemci türünü (ARM, AMD veya Intel) tanımlar. VM'lerin farklı işlemci mimarileri arasındaki dağılımını anlamanıza yardımcı olur ve bu da iş yükü performansını ve maliyet verimliliğini iyileştirmek için kullanışlıdır.

Kategori

Kaynak yönetimi

Sorgu

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

Windows VM'ler için Azure Hibrit Avantajı kullanma

Öneri: Mevcut şirket içi Windows Server lisanslarını kullanarak lisans maliyetlerini azaltmak için Windows VM'ler için Azure Hibrit Avantajı etkinleştirin.

Windows için Azure Hibrit Avantajı hakkında

Azure Hibrit Avantajı şirket içi Windows Server lisanslarınızı Yazılım Güvencesi veya Windows Server aboneliğiyle kullanarak Azure'da Windows VM'leri daha düşük bir maliyetle çalıştırmanızı sağlar. Her vm ile tam bir Windows Server lisansı ödemek yerine mevcut lisanslarınızı getirebilir ve yalnızca temel işlem maliyeti için ödeme yapabilirsiniz. Bu öneri yalnızca kuruluşunuzun uygun şirket içi Windows Server lisansları varsa geçerlidir.

Note

FinOps merkezleri, isteğe bağlı bir öneri olarak Azure Hibrit Avantajı’e sahip olmayan Windows VM’lerini otomatik olarak tespit edebilir. Daha fazla bilgi edinin.

Sorgu: Azure Hibrit Avantajı olmayan Windows sanal makineleri

Azure Hibrit Avantajı kullanmayan Windows VM'leri ve ölçek kümelerini tanımlamak için aşağıdaki ARG sorgusunu kullanın. Sorgu, zaten indirimli lisanslama içeren geliştirme/test aboneliklerini dışlar.

Kategori

Optimization

Sorgu

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

SQL VM'leri için Azure Hibrit Avantajı kullanma

Öneri: Mevcut şirket içi SQL Server lisanslarını kullanarak lisans maliyetlerini azaltmak için SQL Server VM'ler için Azure Hibrit Avantajı etkinleştirin.

SQL VM'leri için Azure Hibrit Avantajı hakkında

SQL ServerAzure Hibrit Avantajı> Azure'da SQL Server VM'leri daha düşük bir maliyetle çalıştırmak için Yazılım Güvencesi ile şirket içi SQL Server lisanslarınızı kullanmanıza olanak tanır. Bu avantaj Standard ve Enterprise sürümleri için geçerlidir (Geliştirici ve Express sürümleri zaten ücretsizdir ve Azure Hibrit Avantajı gerekmez). Bu öneri yalnızca kuruluşunuzun Yazılım Güvencesi ile uygun şirket içi SQL Server lisansları varsa geçerlidir.

Note

FinOps merkezleri, Azure Hibrit Avantajı olmayan SQL VM'lerini isteğe bağlı bir öneri olarak otomatik şekilde belirleyebilir. Daha fazla bilgi edinin.

Sorgu: Azure Hibrit Avantajı olmayan SQL VM'leri

Azure Hibrit Avantajı kullanmayan SQL Server VM'leri tanımlamak için aşağıdaki ARG sorgusunu kullanın. Sorgu geliştirme/test aboneliklerini ve Developer/Express sürümlerini dışlar.

Kategori

Optimization

Sorgu

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

Görüş bildirin

Hızlı bir incelemeyle nasıl olduğumuzu bize bildirin. Bu incelemeleri FinOps araçlarını ve kaynaklarını geliştirmek ve genişletmek için kullanırız.

Belirli bir şey arıyorsanız mevcut bir fikir için oy verin veya yeni bir fikir oluşturun. Daha fazla oy almak için başkalarıyla fikir paylaşın. En çok oyu alan fikirlere odaklanıyoruz.


İlgili kaynaklar:

İlgili ürünler:

İlgili çözümler: