用户态文件系统在高性能文件存储中的探索实践
当前,越来越多的文件系统在用户态开发,提升灵活性和开发效率的同时也带来了一定的性能损耗。与此同时,人工智能技术快速发展,AI 模型训练和推理依赖于高效的数据读写操作,高性能文件存储成为关键支撑。那么,用户态文件系统是否适用高性能文件存储场景,满足性能需求呢?
文件系统为应用程序提供了一个通用接口,极大地简化了应用程序对存储的访问。传统上,文件系统被实现为操作系统内核的一个模块。随着文件系统复杂度的提升,特别是在分布式文件系统兴起的背景下,越来越多新的文件系统转向在用户态进行开发,例如,Google File System、HDFS 以及开源的 GlusterFS 和 DAOS 等文件系统。
用户态文件系统具有诸多优势。首先,许多库和编程语言屏蔽了不同平台和内核版本之间的差异,使得用户态程序开发不需要为不同内核进行定制,为开发者提供了更友好的开发环境。其次,用户态程序在出现异常时,其影响范围相对有限,不会像内核态程序那样可能导致整个系统的崩溃。
尽管如此,由于用户态文件系统增加了额外的开销,关于其开发和使用仍然存在一些争论及权衡。对此,焱融科技进行了系列实验探索,本篇文章为您分享我们关于用户态文件系统的一些探索实践与思考。
有关性能损耗的思考
操作系统内核的 VFS 层通过提供通用接口,屏蔽了下层各类不同文件系统的实现差异。在用户态文件系统的实现中,最常见的方式是通过类似 FUSE(目前使用最为广泛的用户空间文件系统框架) 的机制,将内核文件系统接口导出到用户态。这种方式可以在不改变应用程序使用习惯的前提下,完成用户态文件系统的访问。
然而,这种方式使得整个文件系统访问流程更长了。由于文件系统访问路径变长,内存与 CPU 等方面的开销增加,从而导致整体系统资源开销上升,单位资源的访问性能下降。
FUSE 的性能瓶颈分析
接下来,我们对 FUSE 的实现流程和性能影响进行一个简单的分析。

FUSE high-level architecture
FUSE 的工作机制
当应用程序执行挂载的 FUSE 文件系统操作时:
内核 VFS 将操作路由到 FUSE 的内核驱动程序;
FUSE 驱动程序将用户请求提交到 FUSE 队列中;
FUSE 用户态守护程序通过队列获取请求并最终处理。
FUSE 内核维护了五个队列,包括 Interrupts、forgets、pending、processing 和 background。请求在任何一个时间点只会属于一个队列。
基于 FUSE 实现用户态文件系统的性能瓶颈主要体现在:
内核态与用户态切换:频繁的上下文切换导致性能损耗。
数据拷贝:从内核态到用户态的数据拷贝也是一个性能瓶颈。
队列限制:FUSE 每种队列只有一个实例,限制了并发处理能力。
这些因素导致 FUSE 在性能上有不小的损耗,特别是在基于 NVMe 高性能设备的文件系统下会呈现出性能瓶颈。
VDUSE:用户态文件系统的新选择
VDUSE (vDPA Device in Userspace) 作为一种新兴的方法为实现用户态文件系统提供了一个新的选择。它主要向虚拟机和容器工作负载提供软件定义的存储和网络服务。VDUSE 是一种基于软件的 vDPA 设备,vDPA 内核子系统是其背后的引擎,可以利用 vDPA 子系统为虚拟机和容器提供标准接口,对于用户态空间的应用程序非常有用。
vDAP 的开发初衷是帮助专用硬件实现 virtio 协议,其中硬件只需要支持 virtio 数据平面,vDAP 将供应商特定的控制平面转换为 virtio 控制平面。VDUSE 则将这一机制扩展到用户态,为应用程序提供高效的接口。

VDUSE 支持实现多队列,规避了 FUSE 在队列使用上的限制。从这一点来看,基于 VDUSE 实现的用户态文件系统可以更好地满足小块读写及小文件场景。同时,在容器化场景下,VDUSE 可以绕开宿主机器的内核,减少内核态与用户态切换的频率,从而优化整个 IO 路径上的执行效率。但是,尽管 VDUSE 可以优化 FUSE 部分性能短板,但仍有一些方面需要继续优化,例如应用进程到文件系统进程的数据拷贝开销。
焱融存储认为
在高性能文件系统中,存储集群为大量计算节点提供读写性能,文件系统客户端为所在计算节点的业务提供服务。在实验探索中,我们发现基于用户态实现的文件系统客户端,在单客户端性能上会有所下降,但随着计算节点规模增加,存储集群的整体性能仍然可以发挥到极致。
特别是在一些场景下,系统追求的首要目标是整体的计算能力,反映到存储系统中也就是系统的整体性能。在强调整体计算能力的场景中,例如在某些高性能计算任务中,系统追求的首要目标是最大化计算效率,此时用户态文件系统完全可以满足需求。
综合来看,用户态文件系统在简化开发和提升灵活性方面具备显著优势,同时为分布式存储和虚拟化场景提供了新的思路。随着数据中心和计算规模的持续扩大,基于用户态实现的文件系统不仅可以提供了运维的便利性,同时也能更快速地响应业务需求,满足存储用户日益复杂的存储访问需求。
评论