在 Azure IaaS 上搭建高性能工作负载:别只挑 VM 规格,要看整体系统

2026-05-21 32 预计阅读时间:1 分钟
来源:azure.microsoft.com AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:11 分钟

云上的性能瓶颈,往往不在 CPU 核数或内存大小本身,而在于计算、存储、网络三者之间的配合是否紧密。Azure 近期在 IaaS 层面推动的"系统级思路",核心就是一句话:别把 VM、磁盘、虚拟网络当成独立零件采购,而是把它们当作一个整体系统来设计。

这对跑 AI 训练、云原生微服务、关键业务数据库的团队尤其重要——单资源再强,如果网络吞吐跟不上磁盘 IOPS,或者 VM 型号和存储 SKU 不匹配,实际跑出来的性能会远低于账面规格。

为什么"单资源最优"不等于"系统最优"

一个常见误区:选了最大号的 VM(比如 Standard_E64is_v5),挂上最高档的 Premium SSD v2,再开加速网络,就觉得万事大吉。但实际部署中,以下问题频繁出现:

  • 磁盘 IOPS 和 VM 网络吞吐不匹配——Premium SSD v2 单盘最高 80K IOPS,但 VM 的缓存带宽和出口网络限流可能先到天花板。
  • 存储缓存策略没对齐——读写密集型数据库用了 None 缓存策略,白白丢掉了 VM 本地缓存带来的延迟优势。
  • 网络 MTU 和 RDMA 没启用——AI 训练集群节点间通信走标准 TCP,没利用 Azure 上 SR-IOV / RDMA 的低延迟通道。

系统级思路要求你在选型阶段就把这些耦合关系一起考虑,而不是事后补救。

三条关键配合规则

1. VM 型号决定存储和网络上限

Azure 每个 VM 系列对磁盘缓存带宽、最大磁盘数、网络带宽都有硬上限。选 VM 时要同时看这三张表:

关注维度 查什么 典型陷阱
磁盘缓存带宽 VM 系列文档中 "Max cached disk bandwidth" 选了高 IOPS 磁盘但 VM 缓存带宽只有几百 MB/s
未缓存磁盘带宽 "Max uncached disk bandwidth" 数据库日志盘用了 None 缓存,超出未缓存上限
网络带宽 "Max network bandwidth" 多盘并发读写,网络出口先打满

实操建议:如果你的工作负载是读写密集型数据库,优先选 Ebs_v5Ebsis_v5 系列——它们专门为存储带宽做了放大,缓存带宽远高于同级别通用系列。

2. 磁盘 SKU 和缓存策略要一起定

Premium SSD v2 支持你独立设定 IOPS 和吞吐量(按需求付费调节),但这不意味着你可以无限制往上拉——VM 的缓存/未缓存带宽上限仍然生效。

缓存策略选择逻辑:

  • 数据库数据盘(随机读写多)→ ReadWrite 缓存 + Premium SSD v2,把热块留在 VM 本地 SSD 缓存上。
  • 数据库日志盘(顺序写为主)→ None 缓存 + Premium SSD v2,避免缓存层引入写放大。
  • AI 训练临时数据ReadOnly 缓存 + Standard SSD(成本敏感,读多写少)。

3. 网络配置要匹配工作负载通信模式

  • AI/ML 集群:选支持 RDMA 的 VM 系列(如 HB / HC 系列),启用加速网络,节点间用 InfiniBand 通信。
  • 微服务网格:所有节点启用加速网络(EnableAcceleratedNetworking),减少虚拟交换机延迟。
  • 数据库主从复制:同可用性集/同放置组的 VM 之间网络延迟更低,用 Proximity Placement Group 收拢节点距离。

实战:一键部署一个系统级对齐的高性能数据库 VM

下面这个 Azure CLI + Bicep 组合示例,部署一台针对数据库工作负载优化过的 VM:存储带宽增强系列、Premium SSD v2 数据盘+日志盘、加速网络开启、放置在 Proximity Placement Group 内。

先创建资源组和放置组:

# 变量定义
RG_NAME="perf-db-rg"
LOCATION="eastus"
PPG_NAME="db-ppg"

# 创建资源组
az group create --name $RG_NAME --location $LOCATION

# 创建 Proximity Placement Group——收拢 VM 物理距离,降低网络延迟
az ppg create \
  --name $PPG_NAME \
  --resource-group $RG_NAME \
  --location $LOCATION \
  --intent-vm-sizes Standard_E32bs_v5

然后用 Bicep 模板部署 VM + 磁盘 + 网络:

// file: perf-db-vm.bicep
param vmName string = 'perf-db-vm01'
param location string = resourceGroup().location
param ppgName string = 'db-ppg'
param adminUsername string = 'azureuser'
param adminPassword string

// 加速网络 + PPG 对齐的 VM
resource vm 'Microsoft.Compute/virtualMachines@2024-03-01' = {
  name: vmName
  location: location
  properties: {
    proximityPlacementGroup: {
      id: resourceId('Microsoft.Compute/proximityPlacementGroups', ppgName)
    }
    hardwareProfile: {
      // Ebs_v5 系列:存储缓存带宽放大,适合数据库
      vmSize: 'Standard_E32bs_v5'
    }
    osProfile: {
      computerName: vmName
      adminUsername: adminUsername
      adminPassword: adminPassword
    }
    networkProfile: {
      networkInterfaces: [
        {
          id: nic.id
        }
      ]
    }
    storageProfile: {
      imageReference: {
        publisher: 'Canonical'
        offer: 'ubuntu-24_04-lts'
        sku: 'server'
        version: 'latest'
      }
      osDisk: {
        caching: 'ReadWrite'
        createOption: 'FromImage'
        managedDisk: {
          storageAccountType: 'PremiumV2_LRS'
        }
      }
      dataDisks: [
        // 数据盘:ReadWrite 缓存,随机读命中本地缓存
        {
          lun: 0
          caching: 'ReadWrite'
          createOption: 'Empty'
          diskSizeGB: 1024
          managedDisk: {
            storageAccountType: 'PremiumV2_LRS'
          }
        }
        // 日志盘:None 缓存,避免写放大
        {
          lun: 1
          caching: 'None'
          createOption: 'Empty'
          diskSizeGB: 256
          managedDisk: {
            storageAccountType: 'PremiumV2_LRS'
          }
        }
      ]
    }
  }
}

// 加速网络开启的 NIC
resource nic 'Microsoft.Network/networkInterfaces@2024-01-01' = {
  name: '${vmName}-nic'
  location: location
  properties: {
    enableAcceleratedNetworking: true  // 关键:跳过虚拟交换机,SR-IOV 直通
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          subnet: {
            id: subnet.id
          }
          privateIPAllocationMethod: 'Dynamic'
        }
      }
    ]
    networkSecurityGroup: {
      id: nsg.id
    }
  }
}

// 子网
resource vnet 'Microsoft.Network/virtualNetworks@2024-01-01' = {
  name: '${vmName}-vnet'
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: ['10.0.0.0/16']
    }
    subnets: [
      {
        name: 'default'
        properties: {
          addressPrefix: '10.0.0.0/24'
        }
      }
    ]
  }
}

resource subnet 'Microsoft.Network/virtualNetworks/subnets@2024-01-01' = {
  name: 'default'
  parent: vnet
  properties: {
    addressPrefix: '10.0.0.0/24'
  }
}

// NSG——仅放行 SSH 和数据库端口(示例用 5432)
resource nsg 'Microsoft.Network/networkSecurityGroups@2024-01-01' = {
  name: '${vmName}-nsg'
  location: location
  properties: {
    securityRules: [
      {
        name: 'ssh'
        properties: {
          priority: 100
          direction: 'Inbound'
          access: 'Allow'
          protocol: 'Tcp'
          sourcePortRange: '*'
          destinationPortRange: '22'
          sourceAddressPrefix: '*'
          destinationAddressPrefix: '*'
        }
      }
      {
        name: 'db-port'
        properties: {
          priority: 110
          direction: 'Inbound'
          access: 'Allow'
          protocol: 'Tcp'
          sourcePortRange: '*'
          destinationPortRange: '5432'
          sourceAddressPrefix: '10.0.0.0/16'
          destinationAddressPrefix: '*'
        }
      }
    ]
  }
}

部署命令:

az deployment group create \
  --resource-group $RG_NAME \
  --template-file perf-db-vm.bicep \
  --parameters adminPassword='<你的强密码>'

部署完成后,验证几个关键配置是否生效:

# 查看加速网络是否启用
az vm show \
  --resource-group $RG_NAME \
  --name perf-db-vm01 \
  --query "networkProfile.networkInterfaces[0].id" -o tsv | \
  xargs -I{} az network nic show --ids {} \
  --query "enableAcceleratedNetworking" -o tsv
# 期望输出: true

# 查看数据盘缓存策略
az vm show \
  --resource-group $RG_NAME \
  --name perf-db-vm01 \
  --query "storageProfile.dataDisks[].{Lun:lun, Caching:caching, SKU:managedDisk.storageAccountType}" -o table
# 期望输出:
# Lun  Caching      SKU
# 0    ReadWrite    PremiumV2_LRS
# 1    None         PremiumV2_LRS

# 查看 PPG 关联
az vm show \
  --resource-group $RG_NAME \
  --name perf-db-vm01 \
  --query "properties.proximityPlacementGroup.id" -o tsv
# 期望输出: 包含 db-ppg 的资源 ID

部署前的系统级检查清单

在提交部署之前,用这张清单逐项确认,避免"单资源强、整体弱":

检查项 确认内容
VM 系列与工作负载匹配 数据库 → Ebs_v5;AI 训练 → HB/HC;通用计算 → D/ES_v5
磁盘缓存带宽 ≥ 磁盘总 IOPS 需求 VM 文档中 "Max cached/uncached bandwidth" 是否覆盖你的磁盘规格总和
数据盘/日志盘缓存策略分开设置 数据盘 ReadWrite,日志盘 None
加速网络已开启 NIC 上 enableAcceleratedNetworking = true
AI 集群 RDMA 可用 选 HB/HC 系列,确认 InfiniBand 驱动已安装
PPG 或 Availability Zone 对齐 低延迟场景用 PPG;高可用场景用 Zone + 跨 Zone 复制
Premium SSD v2 IOPS/吞吐手动调优 部署后按实际负载用 az disk update 在线调节,不必重建

几个需要注意的边界

  • Premium SSD v2 目前不支持 Availability Zone 在部分区域,部署前用 az vm list-skus --location <region> --size Standard_E32bs_v5 --zone 确认。
  • 加速网络要求 VM 至少 4 vCPU,小型 VM(如 B 系列)无法开启。
  • PPG 会限制可用硬件池,如果组内 VM 数量过多,新 VM 可能因资源不足无法分配——建议一个 PPG 控制在 5-10 台 VM 以内。
  • 缓存策略在磁盘挂载后修改需要重启 VM,尽量在初始部署时就定好,避免生产环境中断。

云上高性能不是堆规格,而是让计算、存储、网络三层的上限互相撑住而不是互相拖拽。下次选 VM 之前,先翻一遍该系列的磁盘带宽和网络上限表,再决定磁盘 SKU 和缓存策略——这一步提前做,比事后调参数管用得多。


相关推荐