DeepSeek 3FS 源码解读——客户端篇
文件系统客户端作为应用或者用户访问文件系统的入口,其实现方式决定了用户最终实际能体验到的性能上限,客户端面对的情况更为复杂,代码量也不容小觑。为了充分发挥后端性能,3FS 的客户端部分经过精心设计和实现。 在了解 3FS 实现前,先介绍下并行文件系统的客户端实现方式。客户端根据实现方式和访问协议的不同,大致可以分为以下几类: 内核模块:将文件系统的访问逻辑实现为 POSIX 标准内核模块,用户只需要在使用时通过 modprobe 命令将客户端内核模块加载到内核中,然后通过 mount 指令指定选项或者配置文件挂载到 VFS 系统中,即可像使用本地文件系统一样访问远端的网络并行文件系统,...
DeepSeek 3FS 源码解读——RPC 篇
趁热打铁,这回我们看看 3FS 的 RPC 子系统是如何搭建的。粗略分析后,3FS 没有采用类似 Protocol Buffers 或者 Flatbuffers 等 IDL 语言,而是大量使用了 C++ 模板以及宏实现了一套简易的反射机制,并且使用 C++ 20 Concepts 和编译时 constexpr 使一些模板逻辑更清晰易读,从而使开发者用宏就能在 C++ 源代码中定义出 RPC 的请求回复结构体,以及 RPC 服务接口定义。这一块又是相当能体现 DeepSeek “妖”的代码风格,如果说协程部分是现代 C++,那么 RPC 框架的代码就是后现代 C++,不禁让人感叹这是人能写...
DeepSeek 3FS 源码解读——磁盘 IO 篇
请先阅读:DeepSeek 3FS 源码解读——协程篇 书接上回,作为一个文件系统,磁盘 IO 也是非常重要的一环。在大致浏览了源码后,个人发现 3FS 中,发起磁盘 IO 的可能是前台服务客户端读写的线程、负责链式复制的线程、也有可能是后台的垃圾回收线程。同时,和网络 IO 充分协程化不太一样,磁盘 IO 基本是由线程池来完成同步 IO 操作,而且读 Chunk 实际数据使用了 AIO 来异步读取,但是写数据则调用了同步 IO。这也就意味着 3FS 没有采用目前高性能存储系统使用的 Run To Completion 模型。因此,我们需要分析一下,磁盘的 IO 是怎样调度,又是怎样将同...
DeepSeek 3FS 源码解读——协程&RDMA篇
重磅文件系统项目 3FS 在 DeepSeek 轰轰烈烈的开源周压轴登场,补齐了计算、网络以外的最后一块拼图——存储。和之前精巧的极致压榨性能或者提供巧妙算法的开源库不同,3FS 是完整的涉及多种节点、结合多种外部节点的高速并行文件系统,其代码结构清晰、模块间解耦程度高,充分利用了现代 C++ 的语言特性优化性能和代码可读性,还结合了 Rust 语言编写核心存储引擎,展现了 DeepSeek 工程师对复杂工程极强的驾驭能力。尽管已经提供了详尽的设计文档,其复杂程度对于想要阅读学习 3FS 项目的爱好者提出了不小的挑战。本文尝试一步步抽丝剥茧,在官方提供的设计文档之外,提供一些阅读源码的技...
分布式存储入门学习路线
分布式存储一方面是从传统的单机存储发展而来,解决单机存储的性能和容量瓶颈,另一方面它最终还是由单机存储引擎通过网络组合成一个大型分布式系统。在此基础之上还需要包装接口,对外提供对象存储、块存储、文件存储、并行存储多种多样的产品形态方便用户使用。 所以学习的话可以先从基本的操作系统方面出发,了解单机存储系统上的 IO 栈,先尝试用 QEMU 搭建一个 Linux 内核的调试环境,用 gdb 尝试去打断点,了解一次 read/write 系统调用的时候,操作系统是怎么处理一个 IO 请求的。比如了解 ext4 等文件系统的数据在内存和磁盘上是通过什么数据结构组织、索引和缓存的(LS...
系统研究者福利——CloudLab 免费裸金属集群使用入门
什么是 CloudLabOSDI、FAST 或者 SOSP 顶会文章里经常能看到作者是在 CloudLab 上做实验的。这是美国的大学和科研机构联合搭建的裸金属服务器集群,对科研工作者是免费开放使用的。和普通的云服务器不同的是,在上面申请的节点都是裸金属的,没有任何虚拟化,研究人员可以直接以 root 权限操控物理硬件。而且在 CloudLab 机型文档可以看到,它提供的硬件种类多样,有带 GPU 的也有带 FPGA 的机型,甚至还有带 BlueField 智能网卡的机器,方便科研人员探索不同的计算机系统架构。每次申请新的节点时都会恢复机器上硬件和软件的配置,所以也不用担心研究过程会对其...
2023 阿里云暑期实习总结
2022 年秋招的凌冽寒风刮到了 2023 年的春招实习,经过漫长又折磨的面试流程,终于有幸得到了珍贵的阿里云 OSS 对象存储实习 offer。或许是因为阿里系的集团拆分战略调整,尽管在三月底就完成了面试流程,主管也在四月初给了明确的通过,意向书还是拖到了五月中旬才发出,等入职已经是五月底了。 当初煎熬的等待过程中,四月中还拿了字节的 SDN 部门实习 offer 以及 RisingWave 的存储引擎实习 offer,对我来说都是很大的诱惑。但最后还是对这个能跟 AWS S3 掰手腕的系统的技术架构更感兴趣,所以还是选择了这个老牌产品。 在学校的时候也仔细阅读过阿里云在 FAST ...
使用 C++ 20 协程封装 UCX
@王润基 在 这篇文章 里介绍了如何使用 Async Rust 封装 UCX 通信库。在那篇文章中,rjgg 已经介绍过 UCX 的机制,这里就不再重复。和 Rust 相提并论的 C++ 20 中也提供了 co_await 等异步编程语法关键词,我们可不可以也用它来封装异步通信、降低编程复杂度,而性能开销又有多大呢?答案是:可以,而且是零开销封装! 和 Rust 的异步 Future 需要一个 Runtime 负责 poll 不同,C++ 的协程仅仅是帮助编译器进行代码变换的一个语法,也就是说 C++ 的协程实际上是不需要借助类似 Tokio 等通用运行时来驱动协程运行,而是可以完全由用...
使用 C++20 协程实现 RDMA 操作
C++ 20 中的协程非常适合封装异步操作,可以像 JavaScript 或者 Rust 那样按照顺序的方法去编写异步代码。没有协程的时候,异步操作往往是通过回调函数的方式来实现的。这就要求我们手动将程序的状态保存起来,然后在回调操作的时候重新恢复之前的执行状态。对于一些简单的操作而言,手动保存状态也可以接受,但是这不 scalable。当一个函数涉及到很多异步操作的话,手动管理保存状态就会显得很繁琐。此外,由于操作被拆分成多个回调函数,在编写代码的时候逻辑会显得比较零散,既不方便编写,也不方便阅读。 协程实际上就是将状态的打包和回调函数的编写交给编译器来实现,这样程序员就可以用顺序而且...
使用 libav 实现四人同屏直播效果
前几天加的一个学校原神群里想趁原神躲猫猫活动之前在群里举办一个躲猫猫大赛,一开始是想大家简单各自比一比,然后记录分数就好。不过这样就太没意思了,躲猫猫活动里经常有人有骚操作,如果能够直播就好了。而且躲猫猫是四个人玩,观众如果能看到猎手和游侠的位置,就更有意思了。按理来说,如果大家都在校园网内,那么直播是很简单的,我只需要在我的电脑上开一个 OBS,然后让大家推流到我的电脑,我再推流合成后的画面,但是此时已经是寒假,很多人已经回家了,所以这个办法马上就被否决了。大家此时又想到了用会议软件来实现多人同屏,可是目前国内常用的飞书还有腾讯会议都不支持多人同时共享屏幕,而 Zoom 虽然支持,但并...