导读:
- TRIO是一个新型用户态PM文件系统框架,其核心是将文件系统状态分离:Core State用于保存文件系统固有状态,由KernFS控制;Auxiliary State从Core State构建用户态LibFS。TRIO将LibFS可信域缩小至单个APP从而避免对其他LibFS产生影响:每个APP对应一个LibFS,LibFS不可被应用共享。不同LibFS对同一个文件的操作需要先通过Core State验证,才能移交给请求的LibFS。
- TRIO的观察比较简单,现有的用户态PM文件系统最大挑战在于对元数据的安全性保证。然而现有的方法要么性能不足(通过一个可信对象进行请求中转,需要进程间通信),要么不够安全(允许直接操作元数据,但缺乏元数据完整性验证机制)。TRIO采用缩小可信域范围+运行前验证的方式来解决这一问题:每个LibFS需要先通过Core State的验证,然后才能获得该文件的数据+元数据访问权。如果出现Corruption,那么后续的LibFS就无法通过验证,此时通过回滚操作恢复元数据完整的Core State,从而保证元数据安全。
- TRIO这篇文章的核心insight可以从很多角度考虑,个人认为比较有意思(虽然作者只从文件系统状态分离角度阐述,让人不明觉厉)。个人的理解该架构的本质是:缩小可信域范围(对比ZoFS的LibFS可信域范围为Coffer,TRIO为APP,避免LibFS共享)及运行前验证(已有的方法采用元数据运行时验证,即请求中转,或不验证直接访问)。
TRIO很鸡贼,因为Optane DCPMM退出市场了,所以他们首先介绍了通用NVM技术的关键特性:
为了避免与傲腾产生强关联性,TRIO列了一大堆现在的和未来的NVM,包括:battery-backed DRAM,CXL,battery-backed DRAM and flash memory。
Customization可以设计针对特殊负载的最优文件系统。主要优势来自于两个方面:
**Thread Model:**硬件、内核、可信任用户态进程是可信的,LibFS与应用是不可信的
Goal:用户态NVM文件系统需要避免LibFS与应用对元数据的攻击
已有方法:
现有的方法要么开销大,要么无法保证元数据安全,如何设计一个既高效又安全的用户态文件系统呢?
TRIO将文件系统状态分为两种:
TRIO由三部分组成:Per-APP LibFS、Kernel Controller以及可信Integrity Verifier。其中,Kernel Controller用于共享资源访问控制(例如:Inode、NVM页面等),Integrity Verifier用于在文件共享时验证Core State的有效性。
共享流程:① LibFS-A请求访问文件/foo,② Kernel Controller允许LibFS-A访问/foo的Core State,将对应页面映射到LibFS空间,③ LibFS根据/foo的Core State,构建Auxiliary State,④ 直接I/O,⑤ 在文件共享过程中,LibFS-A unmap文件,⑥ Kernel Controller向Integrity Verifier发送验证请求,⑧ 如果验证失败,Kernel Controller恢复/foo的Core State状态,⑨ 验证通过,Kernel Controller允许LibFS-B访问/foo的Core State,⑩ LibFS-B构建Auxiliary State并直接I/O
如何应对无意的BUG或者错误?
可以通过设计相应的Core State来避免这一问题,True。
为了显示TRIO架构的优越性,本文构建了ArckFS。整体架构如下图所示。这里值得说明的是,KVFS和FPFS是两个基于TRIO的Customization文件系统。这里可以看出,整个TRIO架构仍然类似SplitFS是一个堆叠式文件系统,LibFS通过mmap向上层提供POSIX-like I/O接口。
Core State提供了最基本的文件系统语义,提供数据索引,但不提供数据组织
当进行文件共享时,ArckFS LibFS的Auxiliary State会被释放。
Integrity Verifier参考e2fsck进行元数据完整性检测,主要进行如下四点验证:
错误修复:通过回滚到上一个Checkpoint来进行修复。
Checkpoint:Checkpoint发生在LibFS以写权限拿到文件映射之前,ArckFS会将文件的元数据(文件和目录的Index Pages、目录的Data Pages)都存下来。在文件共享过程中,如果检测失败,ArckFS会Notify LibFS来解决错误,如果无法解决,那么被映射的文件会变成只读。
Fix:出错的文件会被拷贝一份,然后回滚到上一个Checkpoint状态。
为了说明Customization的好处,本文设计了除ArckFS外两个文件系统,分别适应不同的负载。
TRIO中Customization同样具有局限性:Core State的Customization需要特权,例如,目前ArckFS的Core State并不支持Log-structured文件系统。
这里比较有意思的是TRIO架构带来的性能提升主要来源于直接数据/元数据访问以及OdinFS的多核拓展能力,因此,在大多数情况下ArckFS的性能应该都是最优的。TRIO的劣势在于File Sharing会带来较大的开销,包括map/unmap,verify以及rebuild auxiliary state。
ArckFS-nd代表无delegation。
|
|
|
| ------------------------------------------------------------ | ------------------------------------------------------------ |
FxMark测试结果表明ArckFS的可拓展性很好,这得益于其用户态元数据直接访问和细粒度锁结构。
两个应用Sharing同一个File,下面是测试结果,可以发现ArckFS性能下降极为严重。为了解决这个问题,ArckFS使用Trust-group来避免两个应用Sharing时的元数据检查。
下图是性能开销分析,可以看到主要开销来源于map/unmap以及verification
Filebench
Webproxy与Varmail本身就有scalability问题,因此这里只放到16线程。ArckFS性能很好。
LevelDB
Customization
这里要研究KVFS(针对小文件优化)以及FPFS(针对目录深度查询优化)的性能优势。分别在Webproxy和Varmail负载下进行测试。这里Webproxy每个文件有512MB,严重与KVFS预设场景不符,怀疑可能是笔误。Varmail负载创建了深度为20的目录。
测试结果表明这两种Customization的LibFS都能够进一步超过ArckFS性能。
本文通过TRIO架构:缩小LibFS可信域至APP + 运行前验证,解决了用户态PM文件系统元数据性能与安全问题,但与之换来的是更高昂的APP间文件共享开销。
Anyway,TRIO工作看起来不是特别复杂,且其贡献仍然聚焦于NVM,不过其中蕴含的思想与哲理:对文件系统状态划分及对Customization的探讨是值得借鉴与推广的。