如何在同一香港服务器上用KVM + BGP网络做多站点隔离与AI推理负载调度的实战方案

今年618活动前夕,我们的跨境电商网站流量激增,还要承载一个 AI 推荐引擎(PyTorch + TensorRT)实时计算个性化商品推荐。由于香港机房带宽和国际路由优势明显,我决定把 Web 站点、AI 推理服务和测试环境 都放在同一台 Dell R740xd 上,通过 KVM 虚拟化和 BGP 网络 实现隔离与调度。
现实问题是,单纯把所有服务堆在物理机上,会遇到几个麻烦:
- AI 推理服务 CPU/内存瞬时吃满,可能影响前端网站延迟
- 跨境 BGP 网络不隔离,一旦某个服务跑大流量,容易影响整体访问
- 多租户管理混乱,升级或回滚新模型时容易影响线上站点
于是,我决定把整套环境容器化和虚拟化结合,通过 KVM + SR-IOV 网络直通 + FRR BGP 路由 来解决资源和网络隔离问题。
一、基础环境准备与规划
1. 硬件与网络条件
服务器:Dell R740xd
- 双 Xeon Gold 6226R
- 512GB 内存(升级过)
- 4 块 NVMe SSD(做 Ceph RBD Cache)
- NVIDIA A30 GPU * 2(AI 推理用)
网卡:Intel X710-DA4 (4x10G) 支持 SR-IOV
机房:MEGA-i,BGP 多线 1Gbps,虚拟 ASN
网络规划如下:
| 功能 | 网络类型 | 备注 |
|---|---|---|
| Web 前端 | BGP 公网 | SR-IOV 直通子功能网卡 |
| AI 推理服务 | 内网 + BGP 公网 | 用 VLAN 隔离,BGP 控制出口 |
| 管理与迁移 | 内网专用 | 不对外开放 |
2. KVM 与宿主机配置
宿主机使用 Ubuntu 22.04 + libvirt + qemu-kvm:
apt install qemu-kvm libvirt-daemon-system virt-manager -y
启用 SR-IOV 支持(Intel X710 网卡):
echo 4 > /sys/class/net/enp3s0f0/device/sriov_numvfs
我创建了 4 个 VF(Virtual Function)给不同虚拟机直通,用于独立跑 BGP。
二、KVM 多站点隔离部署
我把服务器划分为三个核心虚拟机:
- vm-web01:跨境电商主站
- vm-ai01:AI 推理服务(TensorRT + Triton Inference Server)
- vm-sandbox:测试与灰度环境
VM 配置示例
virt-install \
--name vm-web01 \
--vcpus 16 --memory 65536 \
--disk path=/var/lib/libvirt/images/web01.qcow2,size=200 \
--os-variant ubuntu22.04 \
--network type=direct,source=enp3s0f0v0,model=virtio \
--network network=isolated,model=virtio \
--graphics none
公网使用 SR-IOV VF 直通,保证带宽和延迟
内网使用 libvirt isolated network,做管理和 AI 数据通信
三、虚拟机内 BGP 网络与路由策略
每台虚拟机都跑独立的 FRR 实例,实现 BGP 路由独立学习和策略控制。
1. vm-web01(主站)
接收默认路由
向机房 BGP 公告电商网站的 /32 VIP
/etc/frr/frr.conf:
router bgp 65530
bgp router-id 203.0.113.10
neighbor 203.0.113.1 remote-as 65531
!
address-family ipv4 unicast
network 203.0.113.10/32
neighbor 203.0.113.1 route-map web-pref out
exit-address-family
2. vm-ai01(AI 推理服务)
不直接暴露公网,只通过 CDN 或 API 网关访问
通过策略控制只走特定 BGP 出口
route-map ai-out permit 10
set local-preference 50
这样可以让 AI 大流量走 PCCW/HGC,避免占用国内链路。
四、AI 推理负载调度与资源隔离
痛点:AI 推理任务负载波动极大,有时一次模型批量推理能吃掉 90% GPU 和 70% 内存,容易拖慢同机网站。
1. 使用 cgroup 与 numa pinning
在 KVM 配置文件中固定 AI 虚拟机 CPU 和 NUMA 节点:
<cputune>
<vcpupin vcpu='0' cpuset='0-7'/>
<vcpupin vcpu='1' cpuset='0-7'/>
</cputune>
<numatune>
<memory mode='strict' nodeset='0'/>
</numatune>
AI VM 与 Web VM 完全隔离 CPU 和内存,避免争抢。
2. GPU 直通与共享
AI 虚拟机直接直通 NVIDIA A30 GPU,利用 vfio-pci:
echo 0000:81:00.0 > /sys/bus/pci/devices/0000:81:00.0/driver/unbind
echo vfio-pci > /sys/bus/pci/devices/0000:81:00.0/driver_override
这样即便 AI 服务满载,Web VM 不受影响。
3. 动态调度与负载平衡
我写了一个简单的调度脚本,用 libvirt API 根据负载调整 AI VM 的 vCPU 数:
import libvirt, psutil
conn = libvirt.open('qemu:///system')
vm = conn.lookupByName('vm-ai01')
cpu_load = psutil.cpu_percent(interval=5)
if cpu_load > 80:
vm.setVcpusFlags(24, libvirt.VIR_DOMAIN_VCPU_LIVE)
这样可以根据高峰期自动增加 vCPU,低谷期减少,节省资源。
五、遇到的问题与解决方案
BGP 会话中断导致服务不可达
问题:某次 VM 重启时 FRR 没拉起,导致 BGP 广播消失,Web 瞬时不可达
解决:用 systemd 配合 bgpd 守护,增加 Restart=always,并在宿主机用 Keepalived 做浮动 IP。
AI VM GPU 占用导致宿主机 IO 抖动
问题:TensorRT 批量加载模型时 IO 激增
解决:NVMe 做直通 + Ceph RBD 缓存分层,AI VM 独立 IO 通道
多 BGP 出口策略冲突
问题:Web 和 AI VM 同时向机房通告路由时,社区标签没区分导致路由错选
解决:为不同 VM 设置不同 BGP 社区号,如 65531:100 给 Web,65531:200 给 AI
六、最终效果
- Web 站点延迟稳定,国内 70 - 90ms,欧美 160 - 220ms
- AI 推理延迟可控,批处理平均 50ms
- 资源隔离后,高峰期 CPU 使用率从 95% 降到 70%
- 故障隔离性提升,AI 模型热更新不会影响电商站点
通过这套 KVM + BGP 多线 + SR-IOV + AI 推理隔离 的方案,我基本实现了在同一台香港服务器上完成 多业务负载并行、跨境访问优化、以及 AI 推理高峰期隔离调度 的目标。