之前UFS仅支持NFSv4.0协议,只能提供给Linux主机使用。针对用户需要在Windows主机使用UFS的需求,近日,UCloud优刻得升级UFS产品功能,支持SMB和NFSv3接入协议。存量UFS实例能够直接使用NFSv3协议挂载,新建UFS实例时则可以选择接入NFS或者SMB。从而使UFS拥有了全量接入Windows主机的能力,让Windows用户也能充分利用UFS分布式文件系统创造价值。
下图为UFS整体io处理架构。
SMB介绍和支持
SMB(Server Message Block)是一种网络文件共享协议,用于共享文件和打印机等资源,Windows主机广泛使用该协议进行文件的共享。当前UFS接入支持的协议版本有CIFS,SMB2.0,SMB2.1,SMB3.0。
和本地搭建SMB服务比较,UFS拥有以下优势:高容量,弹性扩展,可支持最高PB级别的容量按需进行扩容;高可靠,数据存储有跨机器、跨机架的三个副本;高可用,整体服务路径均采用节点多实例设计和部署,没有单机故障的隐患。
通过SMB协议挂载访问UFS,Windows用户可以使用UFS分布式文件系统进行海量视频素材的存储和编辑等。
NFSv3提升小文件操作的吞吐
Linux和Windows主机均可以使用NFSv3挂载UFS文件系统,在大批量操作小文件的场景下,NFSv3相对于NFSv4.0性能更好。
以下我们分别介绍两种协议版本读取文件的流程。
NFSv4.0读取文件流程:
1. 打开文件:PUTFH设置文件父目录file handle(文件系统内唯一标识文件对象),OPEN打开指定文件,GETFH获取打开文件的file handle,ACCESS检查文件访问权限,GETATTR获取文件属性信息。
2. 确认Open-Owner(可选):如果server需要confirm,客户端再发起OPEN_CONFIRM。
3. 读取数据:PUTFH设置文件file handle,使用返回的stateid读取文件。
4. 关闭打开文件:PUTFH设置文件file handle,关闭stateid指定的文件。
NFSv3读取文件流程:
1. 查询文件:LOOKUP查询指定目录下的文件,返回文件file handle和属性信息。
2. 确认访问权限:ACCESS检查文件是否有访问权限。
3. 读取数据:使用文件file handle读取数据。
得益于NFSv4.0引入的COMPOUND Procedure,额外支持状态的NFSv4.0协议RPC交互数量一般也和NFSv3一样多。但是为什么NFSv4.0大批量操作小文件的性能会远远差于NFSv3?为了支持状态,NFSv4.0打开文件需要提供Open-Owner,协议中规定针对每个Open-Owner,同一时刻只能发起一个相关请求;在Linux内核实现中,同一个用户的进程会共用同一个Open-Owner,因此在大量小文件读写的情况下,文件的打开流程会变成串行操作,影响性能。所以在大批量操作小文件并且没有文件锁需求的场景下,NFSv3相比NFSv4.0可以大幅度提高性能。
以下针对小文件夹的读写场景分别在NFSv3和NFSv4.0挂载下进行了测试。测试环境为Centos8.3虚机,测试文件为Linux内核源码包,有8w+文件。
下面的表格为测试结果,可以看出在大批量操作小文件的情况下NFSv3比NFSv4.0性能好得多。
某知名在线英语教育公司使用UCloud GPU云主机进行AI训练,训练数据存储在UFS分布式文件系统中,最开始这家公司的客户端使用的是NFSv4.0挂载,使用过程中发现训练性能不理想,在没有达到硬件瓶颈的情况下,并发运行多个训练任务也并没有显著减少训练时间。经过排查后发现,NFS挂载读取吞吐较低,用户的训练数据小文件居多,监控数据中看到大量的open请求,导致读取数据性能差。更换使用NFSv3挂载后,没有额外的open开销,训练速度提升了至少2倍。
总结和展望
UFS分布式文件系统的接入能力升级,支持了Windows主机使用,加速了用户特定场景的使用功能。UFS还在进行产品私有化的开发工作,未来会研发并行文件系统,以更低的io时延,更高的吞吐,支撑HPC场景应用。