找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

3710

积分

1

好友

502

主题
发表于 2026-2-12 12:59:10 | 查看: 32| 回复: 0

去年二月,DeepSeek 对外开源了 3FS,其基于 RDMA 的架构设计实现了极高吞吐,在 100Gb 网络下能用 Fio 跑满带宽,成为业界关注的标杆。微信 WFS 团队第一时间跟进学习,但我们面临的现实问题是:内部庞大的存量集群环境并不支持 RDMA 通信。因此,我们没有盲目追随 RDMA,而是将焦点转向了传统 TCP 网络下的吞吐极限优化,启动了 WFS Ultra 极限性能优化项目。最终,在同等 200Gb 网络环境中,我们实现了 Fio 吞吐超越 RDMA 加持的 3FS。目前该优化已在内部稳定运行半年,本文将详细分享其核心优化思路。

性能数据

测试环境如下:

  • Client: 1 台 T0-CM6AX
  • Server: 6 台 T0-CM6AX (WFS 与 3FS 同环境部署)

经过优化,WFS 可以轻松打满 200G 网卡带宽。从下面的 Fio 测试结果可以看到,带宽达到了 21.7 GiB/s (约 23.2 GB/s),完全占满了 200Gb 的理论带宽。

Fio测试结果:带宽21.7GiB/s,IOPS 22.2k,延迟分布统计

此外,在针对 DirectIO 与 BufferIO 不同块大小的读吞吐测试中,WFS 经过本次优化后,对比 3FS 均展现出明显的性能优势。从目前公开的资料看,WFS 是业界首个能够在传统网络下,不依赖 RDMA,仅凭 TCP 协议栈就能用 Fio 跑满 200Gb 网卡的分布式文件系统。

DirectIO 性能对比
DirectIO下,WFS与3FS在256k和1m块大小下的MB/s性能对比柱状图

BufferIO 性能对比
BufferIO下,WFS与3FS在256k和1m块大小下的MB/s性能对比柱状图

关键优化点

Run-To-Completion 线程模型

在 Fuse 使用场景中,传统线程由 libfuse 创建,不具备协程环境。这使得老版本 wfsfuse 采用同步等待线程模型:每个读请求占用一个线程,线程必须同步等待 RPC 调用返回才能继续工作。想要提升性能,就只能开启大量线程,这会造成严重的资源浪费和线程切换开销。为了实现高效的 Run-To-Completion 线程模型,我们实施了两项核心优化。

深度定制的 ultra-core 异步网络组件
首先,我们将 libfuse 的读接口改造为异步形式,完成非阻塞化。改造后,线程不再因等待 RPC 响应而阻塞,可以持续处理任务,大幅提升整体效率。通过重新设计接口调用逻辑,引入 ultra-core 的异步回调机制,读请求的发起与结果处理得以解耦。线程发起请求后无需等待,可以立即处理下一个任务,当请求结果返回时,再通过回调函数进行后续处理。这种对 TCP/IP 网络栈的深度异步化改造,是提升吞吐的关键。

libfuse异步改造前后架构对比图:从同步等待改为异步响应

libfuse/ultra-core 实施一致绑核策略
我们将 ultra-core 异步网络组件与 libfuse 的线程逻辑深度整合,通过将线程绑定到特定的 CPU 核心,避免线程在多个 CPU 核心之间频繁切换。这一措施有效减少了 CPU Cache Miss 的概率,进一步提升了线程的执行效率,使得整个请求处理流程在逻辑上近似于在一个线程内执行完毕。

libfuse线程与ultra-core线程协作流程图:请求入队、异步回调、循环处理

全链路零拷贝

读写可插拔架构
Linux 系统提供了多种数据收发方式,性能与适用场景各异。为了快速验证各种方案的优化效果,我们设计并实现了 ultra-core 读写可插拔架构。该架构允许我们灵活替换不同的数据读写方案,通过对比测试,最终选定客户端采用 splice、服务端采用 sendfile 的组合方案作为读吞吐极限性能优化方案。

ultra-core通用核心层与业务逻辑层架构图,展示Client与Server模块划分

UcWrapper、UcWorker基类与不同策略实现的继承关系图

老版本 WFS 在数据传输过程中存在大量的 CPU 拷贝操作,造成了严重的性能损耗。因此,性能优化的核心目标就是实现全链路零拷贝。

客户端零拷贝
客户端原有的数据传输链路中总共存在 5 次拷贝:内核 socket → 用户空间 → 反序列化 → 缓存 → fuse buffer → /dev/fuse。每一次拷贝都消耗 CPU 资源,拖慢速度。通过 ultra-core 网络组件配合 splice 接口,并结合自定义网络协议格式,我们实现了零拷贝传输。新流程简化为:内核 socket --(splice move)--> /dev/fuse,直接绕过了用户空间的多次拷贝。

服务端零拷贝
服务端原有的数据传输链路存在 3 次拷贝:内核 disk → 用户空间 → 序列化 → 内核 socket。多次拷贝导致服务端 CPU 负载高,限制带宽提升。我们采用 sendfile 接口,彻底消除了用户空间和内核空间的数据拷贝。数据从内核 disk 通过 DMA 传输到 page cache,再通过 SG-DMA 直接传输到 NIC。整个过程完全由 DMA 完成,不占用 CPU 资源,大幅降低了服务端的 CPU 消耗。这种极致的零拷贝优化,是性能突破的核心。

服务端sendfile零拷贝架构图:数据从SSD经DMA到page cache,再经SG-DMA到NIC

经过优化,全链路总共减少了 8 次 CPU 拷贝。服务端启用 sendfile 模式后,性能表现极为出色,跑满 200Gb 带宽仅占用 3 个 CPU 核心。但该模式存在一个缺点:不支持实时 CRC 校验。为了规避这一风险,我们通过定期数据巡检的方式,来降低在该模式下访问到静默损坏数据的概率。

负载自适应预读

预读策略
预读是提升文件读取速度的有效手段。为了提高低并发下的读取速度,我们引入了预读机制。当系统探测到顺序读行为时,会主动发起 ReadAhead 操作,提前将后续可能需要的数据读取到内存中。但预读需要开辟额外内存,内存分配可能带来不可预期的抖动。我们采用内存池优化方案,预先分配固定大小的内存块,避免了运行时的内存申请与释放。由于内存有限,WFS 采用细粒度流式预读,在相同内存消耗下,最大程度提升单路文件吞吐。

ReadAheadMng架构图,包含顺序探测LRU池和预读对象LRU池

文件预读触发示意图:前台流量触发后台预读大块数据

负载自适应策略
其次,在多并发场景下,预读引入的额外 CPU Copy 会影响 Client 整体的读性能。针对这一问题,我们对预读机制实施了严格的限速策略,保证在高并发场景下,系统的吞吐性能不受影响。同时,系统内部会区分 BufferIO 和 DirectIO。BufferIO 模式下存在额外的 Page Cache 拷贝,叠加预读拷贝后性能下降会更严重。因此,我们在限速统计流量时,给 BufferIO 赋予更大的权重(例如 1.5倍),当系统负载较大时,自动停止预读操作,保障高并发场景下的带宽性能。这种动态调整策略,体现了高性能架构设计的灵活性。

SpeedControl流量控制示意图:根据流量统计和权重因子进行限速

三种预读策略性能对比柱状图:无预读、纯预读、负载自适应预读

优化应用场景

预热Overlap加速模型加载

在 AI 模型训练与推理场景中,模型加载耗时直接影响业务启动效率。我们将 WFS 的优化方案应用于此,通过预热 Overlap 策略,进一步实现了模型加载速度的大幅提升。该策略通过提前将模型数据加载到内存中,实现模型加载与框架初始化的并行执行,极大缩短了整体启动时间。测试数据显示,不同规模模型的参数加载耗时均有显著下降。

模型 Ceph加载耗时 WFS直接加载耗时 WFS预热优化耗时
DeepSeek-R1(642GB) 7分49秒 4分16秒 23秒
Qwen3-32B(62GB) 46秒 35秒 2秒
Qwen3-8B(16GB) 11秒 9秒 小于1秒

三种模型在不同加载策略下的耗时对比柱状图

异步化加速随机读

在高并发场景,或网络延迟较高的部署环境下,异步化改造对随机读性能的提升效果尤为显著。我们在内部生产环境实测,在相同并发条件下,WFS Ultra 版本的随机读性能相较于常规实现,差距可达 10 倍以上。

WFS Ultra与Ceph在4k/128和80k/128 IO大小下的随机读性能对比柱状图

总结

以上是 WFS 针对传统 TCP 网络的极限性能优化实践。通过 Run-To-Completion 线程模型、全链路零拷贝、负载自适应预读等关键优化,我们充分发挥了传统 TCP 网络的性能极限。最终在 200Gb 网络环境下,实现了 Fio 吞吐超越 RDMA 加持的 3FS,稳稳跑满 200Gb 网卡带宽。

相较于 3FS 依赖 RDMA 硬件的方案,WFS 的优化方案更具普适性,无需额外的硬件升级支持,为存量大规模集群的性能提升提供了可行路径。当然,我们也认识到 RDMA 在 KVCache 等延迟敏感场景、以及更大吞吐网卡环境下的性能上限优势,WFS 团队也正在完善这部分的支持。本文分享的实践,希望能为业界在传统网络环境下追求极致性能提供一些参考。更多类似的系统架构与性能调优讨论,欢迎关注云栈社区的技术论坛。




上一篇:清华联合团队发布UltraData分级治理体系,开源2.4T数据与4大工具
下一篇:2026年AI岗位选择指南:从算法工程到行业应用,转行入坑不迷路
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-23 11:42 , Processed in 0.700791 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表