云上的性能瓶颈,往往不在 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_v5 或 Ebsis_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 和缓存策略——这一步提前做,比事后调参数管用得多。