上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-08-06 09:04 阅读量:570


今年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 推理高峰期隔离调度 的目标。

目录结构
全文