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

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

发布人:Minchunlin 发布时间:2025-09-05 11:21 阅读量:823


香港机房的空调那晚格外卖力。台风外围风圈带来的居家潮,叠加我们新上的热剧首播,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 BridgingSMB 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,希望这份笔记能帮你少走几步弯路。

目录结构
全文