4. 业务负载画像与迁移优先级

把业务从旧平台迁到 AMD EPYC 数据中心平台,最容易犯的错误是“按主机清单排队迁移”。主机清单只反映物理归属,不反映业务对资源的真实依赖。真正决定迁移顺序的,是业务负载画像:这台虚拟机或这个容器到底在消耗什么、对什么最敏感、迁移后最可能在哪一项上出问题。EPYC 平台的核心变化在于核心密度、内存通道数、NUMA 拓扑和 PCIe 通道数都与旧平台不同,因此同一类负载在新平台上的表现差异会被放大。先画像、再分批,才能把风险控制在可回退的范围内。

四类负载画像的判定依据

负载画像不靠业务名称猜测,而靠可采集的指标组合。建议在迁移前至少采集 7~14 天的稳态数据,避开月末结算、大促等峰值窗口,否则画像会被瞬时峰值带偏。判定时重点看四组指标:CPU 使用率与就绪时间、内存占用与内存带宽、磁盘 IOPS 与吞吐、以及延迟敏感度(P99 响应时间、超时率、跨 NUMA 访问比例)。

负载类型典型指标特征EPYC 平台关注点迁移风险
CPU 密集型CPU 使用率长期 >60%,就绪时间高,内存与 IO 占用低核心数、CCX/CCD 拓扑、频率与功耗墙中,主要看 vCPU 与物理核映射
内存密集型内存占用 >70%,内存带宽接近通道上限,CPU 中等内存通道数、NUMA 节点、每通道 DIMM 配置高,跨 NUMA 会显著掉性能
IO 密集型磁盘 IOPS/吞吐高,队列深度大,CPU 与内存中等PCIe 通道、NVMe 直通、存储控制器队列中高,取决于存储路径是否变化
延迟敏感型P99 敏感,超时率对抖动极敏感,资源占用未必高NUMA 本地性、中断亲和、频率稳定性最高,抖动即业务受损

需要强调的是,一台业务可能同时具备两类特征,例如数据库既吃内存又对延迟敏感。此时应取“最敏感的那一类”作为画像主标签,其余作为约束条件。画像结论要落到具体对象上:虚拟机名、容器工作负载名、绑定的 NUMA 节点、依赖的存储卷,而不是只写“某业务系统”。

从画像到迁移批次

画像完成后,按“风险从低到高、依赖从少到多”的原则排批次。第一批放 CPU 密集型中无状态、可快速重建的负载,用来验证新平台的计算性能和调度策略;第二批放 IO 密集型,验证存储路径和 PCIe 带宽;第三批放内存密集型,重点验证 NUMA 绑定和内存带宽;最后一批放延迟敏感型,此时平台已经过多轮验证,抖动风险最低。每批之间保留观察窗口,确认无回退再进入下一批。

负载画像 → 迁移批次决策图 采集稳态指标 → 判定主标签 → 按风险排批次 → 逐批验证 指标采集(7~14天) CPU使用率 / 就绪时间 内存占用 / 内存带宽 IOPS / 吞吐 / 队列深度 P99延迟 / 超时率 主标签判定 取“最敏感”一类为主标签 其余作为约束条件 落到具体VM/容器/NUMA 避免用业务名猜测 四类负载画像 CPU密集型 核心/拓扑/功耗墙 内存密集型 通道/NUMA/带宽 IO密集型 PCIe/NVMe/队列 延迟敏感型 NUMA本地/中断亲和 迁移批次(风险由低到高) 批次1:CPU密集型 无状态、可快速重建 验证:核心性能/调度 观察:就绪时间、频率 回退:镜像重建即可 风险:低 批次2:IO密集型 存储路径可能变化 验证:PCIe/NVMe带宽 观察:IOPS、队列深度 回退:切回原存储卷 风险:中高 批次3:内存密集型 NUMA绑定是核心 验证:通道/带宽/本地性 观察:跨NUMA访问比例 回退:恢复原NUMA策略 风险:高 批次4:延迟敏感型 抖动即业务受损 验证:P99/超时率/亲和 观察:中断分布、频率 回退:整批回切 风险:最高 每批之间保留观察窗口:确认无回退、无性能劣化、无超时上升,再进入下一批。 延迟敏感型必须最后迁移,且迁移前完成 NUMA 绑定与中断亲和策略的预验证。

画像采集与判定的实际操作

在 Linux 虚拟机上,可以用一组命令快速拿到画像所需的核心数据。以下命令在业务稳态期执行,连续采集 7 天,每天取同一时段样本,避免峰值干扰。

# CPU 使用率与就绪时间(每秒采样,持续 60 秒)
vmstat 1 60 | awk 'NR>2 {cpu+=$13; r+=$1; n++} END {print "CPU使用率:",cpu/n"%","平均就绪:",r/n}'

# 内存占用与 NUMA 分布
numastat -p $(pgrep -f 业务进程名) | head -20

# 磁盘 IOPS 与吞吐(以 sdb 为例)
iostat -x 1 60 | awk '/sdb/ {print "r/s:",$4,"w/s:",$5,"rMB/s:",$6,"wMB/s:",$7}'

# 延迟敏感度:P99 响应时间(以应用日志为例)
grep "response_time" app.log | awk '{print $NF}' | sort -n | awk '{a[NR]=$1} END {print "P99:",a[int(NR*0.99)]"ms"}'

判定时给出明确阈值,避免主观。例如:CPU 使用率持续高于 60% 且内存占用低于 50%,判为 CPU 密集型;内存占用高于 70% 且 numastat 显示跨节点访问比例超过 20%,判为内存密集型;磁盘 IOPS 高于 5000 或吞吐高于 200MB/s 且 CPU 低于 50%,判为 IO 密集型;P99 超过业务 SLA 的 80% 且对抖动敏感,判为延迟敏感型。这些阈值是示例,实际应结合业务 SLA 调整。

画像结论建议记录为一行结构化数据:对象名 | 主标签 | 关键指标值 | 约束条件 | 建议批次。例如:web-node-07 | CPU密集型 | CPU 72% / 内存 38% | 无状态 | 批次1。这样迁移排期可以直接按批次字段排序,不需要二次判断。

批次迁移中的验证与回退

每批迁移完成后,不要只看“服务是否启动”,而要看画像中对应的关键指标是否落在预期区间。CPU 密集型批次重点看就绪时间和单核性能是否下降;IO 密集型批次重点看 IOPS 和队列深度是否因 PCIe 路径变化而劣化;内存密集型批次重点看跨 NUMA 访问比例是否上升;延迟敏感型批次重点看 P99 和超时率是否抖动。任何一项超出预设阈值,就应暂停下一批并回退当前批。

延迟敏感型负载不要与内存密集型负载放在同一批迁移。两者都会争抢 NUMA 本地性和内存带宽,同时迁移会让故障归因变得困难。建议至少间隔一个观察窗口,确认前一批稳定后再启动。

最后,迁移批次不是一次性的。业务负载会随版本迭代、流量增长而变化,原本的 CPU 密集型可能演变为内存密集型。建议每季度重新采集一次画像,更新批次归属,让迁移优先级始终与真实负载保持一致。