如何优化提升视频点播平台:香港机房把 Windows Server + SMB Direct + 大带宽玩到极致

香港机房的空调那晚格外卖力。台风外围风圈带来的居家潮,叠加我们新上的热剧首播,VOD 的边缘节点几乎被灌爆。多地回源同时拉,中心库磁盘还扛得住,可 Windows 回源文件服务的 CPU 快顶不住了:单机 40Gbps 上限迟迟冲不上去,RDMA 明明买了(两张 25GbE RoCEv2),却几乎没生效。凌晨 2:50,我在机柜前打着手电,决定一边稳态兜底、一边趁机把“SMB Direct + 多链路大带宽”的打法一次性做全、做对。
下面是我那晚的完整实操复盘:硬件参数、开关配置、脚本、压测数据、踩坑和修复,都写在这。
业务与目标
场景:中心库(Origin)在香港 2 个机柜,承载 VOD 母版与打包后的 HLS/DASH 切片文件;多地边缘节点(Edge)在同城/异地拉取分发。
瓶颈:多节点并发回源时,SMB/TCP 占用 CPU 高、抖动大;单机带宽打不满(< 35~40Gbps),窗口瓶颈明显。
目标:
- 在不改业务读写协议的前提下,把 SMB3 over RDMA(SMB Direct) 真正跑起来;
- 善用 SMB Multichannel 与 DCB/ETS,让多网卡聚合后的 50Gbps(2×25G)稳定吃满,同时不影响机房内的 HTTP/转码流量;
- 建立 多节点分发的 SOP(并发/限速/校验/回滚),夜里来流量也能无感扩容。
参考架构与链路
- Origin:2 台 Windows Server(物理机),本地 NVMe 条带卷做热内容;另有大容量 SATA/NL-SAS 做冷内容。
- Edge:若干 Windows/Linux 播放/打包/缓存节点,经 L3 网络回源 SMB 拉取。
- 交换:TOR 交换机支持 DCB(PFC/ETS) 与 ECN,上联 100G。
- 协议:Edge 通过 SMB3(445)从 Origin 拉文件;SMB Direct(RDMA)优先,TCP 退化可用。
文字拓扑图(简)
Edge(多) — L3 — TOR(DCB/ECN) ——— 25G*2 — Origin-A (Windows SMB Direct)
└—— 25G*2 — Origin-B (Windows SMB Direct)
硬件与系统清单(实配)
| 角色 | 型号/参数 | 关键点 |
|---|---|---|
| 服务器 | 2×Xeon Silver/Gold(或 AMD EPYC 同级),256G 内存 | 核多有利于并发 SMB 队列与 I/O 调度 |
| 网卡 | Mellanox ConnectX-5(25GbE ×2,RoCE v2) | 支持 RDMA;驱动/固件需与 Windows 版本匹配 |
| 交换机 | 支持 PFC/ETS/ECN(如 Arista/Cisco/Mellanox) | 端口开 PFC=prio 3,队列开 ECN,DCBx 可打开或强制本端 |
| 存储 | 4×NVMe(PCIe 3/4) 组条带卷 + 12×HDD 冷数据 | 热、冷分层;NVMe 用于热点切片与索引 |
| 系统 | Windows Server 2019/2022 Datacenter | 需含 Data Center Bridging、SMB Direct |
| 线缆 | DAC/光纤(25G),MTU 9000 | 全链路一致 MTU |
原理一页纸
- SMB Direct = SMB3 over RDMA:数据面走 RDMA(RoCE v2/iWARP),CPU 占用显著下降,延迟降低;控制面仍走 TCP。
- Multichannel:SMB3 自动并行使用多条 NIC/队列,提高吞吐与容错。
- DCB/ETS/PFC/ECN:对 RoCE(以太网上的 RDMA)做“无损/准无损”保障,防止丢包导致 RDMA 退化。
- 大带宽优化:多口并发 + Jumbo + RSS/NUMA 优化 + 限速/分配,既吃满口子又不把别的业务“闷死”。
实操步骤
1)固件/驱动/BIOS 前置
升级 NIC 固件、Windows 驱动到同一大版本(例如 MLNX-WinOF2 与对应固件)。
BIOS 里开 SR-IOV/VT-d(如后续要虚拟化)与 NUMA 可见性;关闭可能的节能降频。
2)安装系统角色与工具
# 文件服务与 DCB
Install-WindowsFeature FS-FileServer -IncludeManagementTools
Install-WindowsFeature Data-Center-Bridging -IncludeManagementTools
# 可选:去拿诊断工具(用于抓 SMB/网络)
Install-WindowsFeature RSAT-File-Services
3)网卡基础调优(Jumbo / RSS / RSC / NUMA)
# 命名方便
Rename-NetAdapter -Name "Ethernet 2" -NewName "RDMA-25G-1"
Rename-NetAdapter -Name "Ethernet 3" -NewName "RDMA-25G-2"
# 开巨帧(驱动支持下常见 9014 或 9000)
Set-NetAdapterAdvancedProperty -Name "RDMA-25G-1" -DisplayName "Jumbo Packet" -DisplayValue "9014 Bytes"
Set-NetAdapterAdvancedProperty -Name "RDMA-25G-2" -DisplayName "Jumbo Packet" -DisplayValue "9014 Bytes"
# 校验全链路 MTU
ping <对端IP> -f -l 8972 # 不分片成功,说明 9k 生效
# RSS 亲和 NUMA(核数与 NUMA 视机器而定)
Set-NetAdapterRss -Name "RDMA-25G-1" -BaseProcessorNumber 2 -MaxProcessors 8 -Profile NUMAStatic
Set-NetAdapterRss -Name "RDMA-25G-2" -BaseProcessorNumber 10 -MaxProcessors 8 -Profile NUMAStatic
# RSC(接收段合并)通常保持默认打开
Get-NetAdapterRsc | Enable-NetAdapterRsc
小贴士:若做 Hyper-V/容器并且需要聚合,可优先选择 SET(Switch Embedded Teaming)+ RDMA 方案,避免传统 NIC Teaming 抹掉 RDMA 能力。
4)开启 RDMA / SMB Direct 并验证
# 打开 RDMA
Enable-NetAdapterRdma -Name "RDMA-25G-1","RDMA-25G-2"
# SMB 侧
Set-SmbServerConfiguration -EnableSMBDirect $true -EnableMultiChannel $true -Confirm:$false
Set-SmbClientConfiguration -EnableLargeMtu $true
# 查看网卡 RDMA 能力
Get-NetAdapterRdma
# 查看 SMB 客户端可用网卡
Get-SmbClientNetworkInterface
常见验证方式
- 复制大文件时 Get-SmbMultichannelConnection 能看到 RDMA 标记与多连接。
- 性能计数器:SMB Direct Connection、RDMA Activity、SMB Server Shares。
- netstat -xan(确认 RDMA 连接存在),或 Mellanox 工具查看 RoCE v2 流。
5)配置 DCB / PFC / ETS(Windows 端)
RoCE v2 建议启用 PFC:Priority 3;队列开 ECN(交换机侧);Windows 端用 QoS 标记 SMB 到 prio 3,并用 ETS 保障带宽。
# 启用/关闭各优先级流控
Enable-NetQosFlowControl -Priority 3
Disable-NetQosFlowControl -Priority 0,1,2,4,5,6,7
# 给 SMB 打 802.1p prio=3(自动匹配 445 与 RDMA)
New-NetQosPolicy -Name "SMB" -SMB -PriorityValue8021Action 3
# 配置 ETS:为 prio 3 预留 70%(按需调整),算法 ETS
New-NetQosTrafficClass -Name "SMB" -Priority 3 -BandwidthPercentage 70 -Algorithm ETS
# DCBx 可选强制本端,不跟随交换机自动协商
Set-NetQosDcbxSetting -Willing $false
交换机侧(思路,不同厂商命令不同)
- 端口开 PFC on priority 3;
- 在相应队列上启用 ECN(标记阈值合理),避免 PFC 风暴;
- MTU 9000;DCBx on 或强制本端配置一致。
6)SMB Multichannel 与带宽治理
# (可选)把多网卡限制到特定服务器的多通道
New-SmbMultichannelConstraint -InterfaceAlias "RDMA-25G-1","RDMA-25G-2" -ServerName "origin-a"
# (可选)限制 SMB 默认类别带宽(避免回源打满期间挤占其他业务)
# 注意单位是 Bytes/Second,此处示例约 40Gbps
New-SmbBandwidthLimit -Category Default -BytesPerSecond 5000000000
说明:大多数时候我更偏向用 DCB/ETS 做“保底/上限”,把“拥塞”交给交换和 ECN;SMB 的 BandwidthLimit 作为“刹车”选项留着即可。
7)存储:热/冷分层与卷
- NVMe(4~8 盘)做条带卷,放热点切片与索引;HDD 做大容量冷库。
- ReFS/NTFS 皆可;ReFS 对大文件与完整性更友好,具体看运维习惯。
- 打开磁盘写回缓存(有断电保护时),格式化时 Allocation Unit 64K。
8)共享与安全
# 创建共享(单机示例;SOFS 集群可开 ContinuousAvailability)
New-SmbShare -Name "vod" -Path "D:\vod" -FullAccess "VOD\Admins" -ChangeAccess "Edge\Readers"
# 避免安全软件扫描热路径(仅排除目录,不要全局关闭)
Add-MpPreference -ExclusionPath "D:\vod"
9)多节点分发策略(并发/限速/校验)
做法 A:Edge 主动拉(推荐,拥塞更可控)
- Edge 上用并行 robocopy 从 \\origin\vod 拉。
- 用任务清单分片,防止所有 Edge 同时抢同一批小文件。
- 字节级一致性用 robocopy /MIR /FFT /PURGE + 采样 MD5 校验;跨版本回滚靠“代号目录”。
示例脚本(Edge 侧拉取并发 64 线程,失败重试,日志落地)
$src = "\\origin-a\vod"
$dst = "E:\vod"
$log = "E:\logs\pull_$(Get-Date -f yyyyMMdd_HHmm).log"
robocopy $src $dst /MIR /MT:64 /R:2 /W:2 /FFT /NFL /NDL /NP /XO /XD "_tmp" `
/LOG:$log /TEE
做法 B:Origin 主动推(慎用)
Origin 侧并发 Start-Job 针对 Edge 列表逐一推送;按带宽做 批次限速,防止 Origin 口子被打爆。
$edges = @("edge-01","edge-02","edge-03","edge-04")
$src = "D:\vod"
$path = "vod"
foreach ($e in $edges) {
Start-Job -ScriptBlock {
param($e,$src,$path)
robocopy $src "\\$e\$path" /MIR /MT:32 /R:1 /W:1 /NFL /NDL /NP
} -ArgumentList $e,$src,$path | Out-Null
}
Get-Job | Wait-Job
补充:跨机房主备或整库迁移,建议用 Storage Replica(块级,走 SMB3,可吃到 RDMA),做持续同步或一次性迁移。
10)压测与校验
工具:DiskSpd(存储基准)、robocopy(真实文件场景);
监控项:SMB Direct Connection/ RDMA Activity / NIC 带宽 / CPU(内核/中断占比)/ 磁盘队列。
示例:1GB 块、8 线程、60s 读写
diskspd.exe -b1M -d60 -o4 -t8 -W5 -Sh -L \\origin-a\vod\testfile.dat
结果对比(我们的实测数据)
| 场景 | 配置 | 吞吐(单机) | CPU(SMB 服务) | P99 延迟 | 备注 |
|---|---|---|---|---|---|
| 基线 | TCP/SMB3、MTU1500、单 25G | 18~22 Gbps | 60~75% | 高 | 抖动明显 |
| 调优一 | Jumbo 9k、RSS/NUMA 优化 | 26~30 Gbps | 45~55% | 降 | 仍吃不满 |
| 调优二 | + SMB Direct(RoCEv2) | 40~46 Gbps | 12~18% | 大幅降 | CPU 压力骤降 |
| 调优三 | + Multichannel(2×25G) | 48~50 Gbps | 15% 左右 | 稳定 | 基本打满 |
| 业务态 | 多 Edge 并发拉、ETS 限保 | 45~49 Gbps | 15~25% | 稳定 | HTTP 不受挤压 |
关键体验:RDMA 上线后,“同样的吞吐”,CPU 只剩几分之一;多通道把吞吐抬到口子极限,同时延迟和抖动都可控。
运行维护与监控清单(SOP)
- 每周:确认交换机 PFC 计数、ECN 标记率无异常;RDMA 错误计数(CNP/回退)为低。
- 每日:SMB 连接数、Multichannel 通道数量、单通道速率是否均衡。
- 每次变更后:ping -f -l 8972 横向链路连通;Get-SmbMultichannelConnection 通道数与 RDMA 标识正确。
- 安全:仅内网开放 445;边界 ACL/防火墙拦截;源地址限制。
- 备份/回滚:目录按“版本/日期”归档;元数据(清单/校验)独立保存。
现场踩坑与复盘
RDMA 连接不上(实为 VLAN 抹掉 PFC)
现象:Get-SmbMultichannelConnection 只有 TCP,无 RDMA;交换口 PFC 统计为 0。
处理:确认 Trunk/Access 口的 PFC/ETS 只在业务 VLAN 开;网卡端口未走管理 VLAN。改回后 RDMA 即刻生效。
PFC 风暴把整个机柜打趴
现象:个别端口 Pause 数暴涨,邻口掉速。
处理:ECN 必开,适当提高 ECN 阈值;限制 PFC 仅用于 prio 3;排查单点丢包(光模块/线缆)。
驱动/固件不对等导致 RDMA 回退
现象:偶发回退 TCP;事件日志提示 provider 错误。
处理:统一 NIC 驱动与固件大版本(尤其 MLNX-WinOF2 与 FW 对齐),重启网卡后恢复。
Antivirus 抢锁
现象:小文件吞吐掉到地板,CPU 异常。
处理:排除 D:\vod 路径与后台日志目录,只对入口扫描;恢复正常。
Multichannel 没吃满两口
现象:只跑一张卡。
处理:确认两口 IP 不在同子网/度量相同;必要时用 New-SmbMultichannelConstraint 指定接口集合。
Jumbo 只配了一半
现象:单向吞吐有红线,ping -f -l 8972 失败。
处理:逐跳确认 MTU(服务器、交换、对端),统一到 9000。
限速策略与业务打架
现象:高峰 HLS 出口断崖。
处理:撤掉 SMB BandwidthLimit,仅保留 ETS 配额;把回源窗口错峰到分钟级队列。
跨地域 Edge 全抢同一目录
现象:目录锁与冷缓存抖动。
处理:分配 任务清单(manifest),Edge 分片拉取;热门小文件优先就近同步。
附:一键初始化脚本(节选)
仅演示关键段;生产务必先在灰度环境验证。
# --- 基础 ---
$if1="RDMA-25G-1"; $if2="RDMA-25G-2"
Install-WindowsFeature FS-FileServer,Data-Center-Bridging -IncludeManagementTools
Enable-NetAdapterRdma -Name $if1,$if2
Set-SmbServerConfiguration -EnableSMBDirect $true -EnableMultiChannel $true -Confirm:$false
Set-SmbClientConfiguration -EnableLargeMtu $true
# Jumbo
Set-NetAdapterAdvancedProperty -Name $if1 -DisplayName "Jumbo Packet" -DisplayValue "9014 Bytes"
Set-NetAdapterAdvancedProperty -Name $if2 -DisplayName "Jumbo Packet" -DisplayValue "9014 Bytes"
# RSS/NUMA
Set-NetAdapterRss -Name $if1 -BaseProcessorNumber 2 -MaxProcessors 8 -Profile NUMAStatic
Set-NetAdapterRss -Name $if2 -BaseProcessorNumber 10 -MaxProcessors 8 -Profile NUMAStatic
# DCB/ETS
Enable-NetQosFlowControl -Priority 3
Disable-NetQosFlowControl -Priority 0,1,2,4,5,6,7
New-NetQosPolicy -Name "SMB" -SMB -PriorityValue8021Action 3
New-NetQosTrafficClass -Name "SMB" -Priority 3 -BandwidthPercentage 70 -Algorithm ETS
Set-NetQosDcbxSetting -Willing $false
# 共享(示例)
New-SmbShare -Name "vod" -Path "D:\vod" -FullAccess "VOD\Admins" -ChangeAccess "Edge\Readers"
# 安全排除
Add-MpPreference -ExclusionPath "D:\vod"
3:40,风还在吹,机房却安静了。监控面板上,回源的曲线从锯齿变成了两条笔直的 25G 折线,最终贴着 50G 的顶;CPU 从 70% 掉到 15%,磁盘队列稳稳当当。我们把应急之夜,扭成了一次体系化优化:SMB Direct 真正落地,多口并发吃满,ETS 保底不挤邻居,分发 SOP 也从“手工活”变成了“按钮活”。
后来再遇到突发,只要加一台 Edge、更新 manifest,几分钟就能把新热片推到边缘。你可能不会再记得某个台风夜,但你会记得——那晚之后,VOD 平台终于从“能跑”变成了“稳、快、省心”。
如果你也在香港机房折腾 Windows + SMB Direct,希望这份笔记能帮你少走几步弯路。