技术标签: linux 操作系统 filebench file system 论文悦读
导读:
ZoFS有针对NVM做什么优化吗?似乎并没有,最大的优势在于提出Coffer概念,就是让元数据能够在用户态进行管理。每个Coffer包含相同权限的NVM页面。ZoFS利用Intel MPK(Memory Protection Key)对页面进行保护。
Motivation的研究方法很有意思,发现权限相同的文件倾向于聚集在一起,因此提出Coffer概念。
这似乎是个通用的办法。ZoFS有针对NVM做什么优化吗?似乎并没有。应该是NVM使得页面可以直接映射到内存中,从而引发的一系列问题,没有针对NVM其他特性(读写)做优化。
NVM设备具有低延迟、字节级寻址能力,可以直接在用户态访问,这使得大量研究者开始研究基于NVM的用户态文件系统。但是现有的用户态NVM文件系统不能在用户态对元数据进行直接控制,从而不能够充分发挥DCPMM的性能,例如:
然而,用户态文件系统对元数据进行直接控制面临几大挑战:
挑战 1:如何确保各个文件的权限? 由于用户程序也位于用户态,因此用户程序可以轻松绕过权限检测,从而发动恶意攻击。
挑战 2:如何防止程序修改元数据? 如果在用户态可以直接对元数据发起修改,那么应用程序的各种BUG可以轻松地污染元数据,从而使得文件系统崩溃。
围绕这些挑战,作者提出解决思路:
梳理全文,其实最为核心问题在于:如何优雅地解决在用户态进行文件系统元数据修改面临的挑战?
现有的用户态文件系统不能在用户态对元数据做直接更新,因此存在较大的开销(见1. 背景)。因此,基于这个观察,本工作要提出一种用户态文件系统,它能够在用户态进行元数据的直接修改。
文件系统通过有限的系统调用与应用程序隔离开,从而确保访问权限的正确性。但为了能够在用户态进行文件系统元数据修改从而充分发挥NVM的性能,作者调研了多个真实系统环境下应用程序涉及文件的权限。细节不再赘述。观察得出的结论为:应用程序的文件权限基本相同,且少有修改(applications tend to store files with similar permissions that are rarely changed)。
基于这个观察,作者试图将所有相同权限的文件分成一组(因为他们占大多数),然后让文件系统的用户态库对该组文件有完全的控制权。如此一来,就能达到思路 1的目标:在用户态程序使用这些文件前,用户态文件系统检测该组文件的权限即可。
至于为什么不是以单个文件为粒度进行NVM空间管理,而是以这种组的方式进行管理,文章并未做出解释,博主猜测可能原因如下:
Coffer,金库,可以理解为前面提到的相同权限文件分组,不过这里有一点变化,Coffer是一系列权限相同的NVM页面的容器,这些页面被用于存放文件数据。
Coffer主要组成为:Root Page
,用于承载Coffer的元数据(非文件系统元数据,例如:Inode等);Root File
,一个根文件,也作为Coffer的入口。如果Root File
为常规文件,那么Coffer只存该文件相关的NVM页面,如果Root File
为目录文件,那么该目录下的所有子文件的NVM页面都可以存在相同的Coffer中。
如果子文件的权限与目录文件权限不同,那么子文件就不会与目录文件存在同一个Coffer中,此时,由目录文件的Dentry记录Cross-Coffer Reference将用于记录子文件所在的Coffer路径,见下图圈出来的部分)
Coffer是Treasury进行NVM空间管理的重要组成结构,Treasury可以理解为一个用户态文件系统架构,可以类比[FUSE文件系统](5分钟搞懂用户空间文件系统FUSE工作原理 - 知乎 (zhihu.com))架构。
Treasury,财政部,用于管理Coffer,并且提供用户态接口。由两部分组成:内核模块KernFS、用户态库FSLibs。其中,KernFS用于管理NVM空间:记录哪个NVM页面属于哪个Coffer、维护Coffer的元数据(Coffer的路径、Coffer的类别)等。KernFS视Coffer为黑盒子,它并不知道Coffer内存了什么或者文件的数据到底是如何组织的。
FSLibs是一系列文件系统库的合集,这些文件系统库又被称为uFSs,每种uFS可以管理某种类别的Coffer。本文后续设计的uFS即为ZoFS。uFS对Coffer的关系就好比一个文件系统对设备分区的关系(磁盘逻辑分成4个区,每个区可以采用不同的文件系统管理;NVM介质被划分为多个Coffer,每个Coffer也可以由不同的uFS管理)。
Coffer管理:Treasury给每个Coffer的Root Page
一个Coffer-ID
,用以唯一标识Coffer,并利用持久化哈希表(Path-Coffer Mappings)来保存Coffers。其中,哈希表的Key
为Coffer的路径、值是Coffer-ID
。这样一来,当上层发起路径请求时,可以通过查表快速找到对应的Coffer;
NVM空间管理:Treasury采用两级分配方式:首先分配一组NVM页面至Coffer,再由Coffer分配页面来保存数据和元数据。其页面分配情况由Page Allocation Table记录。具体Page Allocation Table结构如下图所示,在此不做赘述。
FSLibs是用户态文件系统库(uFSs)。通过预加载uFS库(.so),应用可以不用重新编译就能使用uFS。下图显示了FSLib在Treasury中的架构:
系统调用截胡:作者修改了glibc库,截胡了write
、open
等系统调用。被截胡的系统调用通过Dispatcher分发给不同的uFSs。为了区分文件是内核文件系统还是用户态文件系统,需要将文件系统路径与挂载点对比,如果是相对路径,则把该路径展开为绝对路径再进行对比。如果传入的是句柄,就通过句柄映射表进行辨别。
2022-9-13日更新:其实不需要修改glibc库,只需修改应用动态链接库即可完成介乎
句柄映射表(FD mapping table):为了区分用户态文件系统句柄与内核态文件系统句柄,Treasury在用户态维护了一个映射表,该映射表记录了被应用使用的句柄是属于用户态文件系统还是内核态文件系统。
软链接实现:把软链接文件指向的链接发给Dispatcher,递归该过程即可。但文章说到其他内核态文件系统的指向基于FSLibs文件的软链接存在问题,这里还不是很清楚存在什么问题。
KernFS以Coffer为粒度将NVM页面映射到用户态,此时,KernFS将申请的Coffer中所有页面利用MPK区域进行标记(例如都标记为Region 0),示意图如下:
这些区域(Region)在PKRU中最初都标记为不可访问。当用户态文件系统库想要访问一个Coffer时,它先修改PKRU寄存器,打开对该Coffer的访问权限。在修改完毕之后,其又会马上修改PKRU,关闭对该Coffer的访问权限。通过这种方式,只有在用户态文件系统库执行的时候,Coffer才可以被修改。而当应用程序中的bug踩到Coffer内存时,会由于MPK的保护产生Segmentation fault,防止其破坏Coffer中的结构。(参考SOSP 2019—SJTU-IPADS的集体见闻(Day-3),博主由于知识能力有限,难以用自己的语言表达出来)
sigsetjump
、siglongjump
以及SIGSEGV
信号处理机制来保证错误后能够返回错误值而不是使程序崩溃:在FSLibs的函数入口调用sigsetjump
,然后再SIGSEGV
的handler
中调用siglongjump
回到sigsetjump
位置,然后返回相应的错误值。WRPKRU
指令完成。注意,这里最多只有15个Coffer能够被同时映射到进程中,因为只有15个MPK区域是有效的(上图展示了16个区域,和这里描述的不太一样,可能是实现不太相同)。简单来说就是下面三种情况:
情况 1:如果修改的metadata只在单一Coffer内,则不会引起问题,这与传统文件系统一致;
情况 2:如果修改的metadata涉及多个Coffer,那么,如果一个线程跟随错误的metadata访问到另一个Coffer,那么MPK会抛出错误(完成错误隔离),否则见情况 3;
情况 3:如果受害线程访问到目标Coffer,还需要检查待访问文件路径与Coffer路径的一致性;
ZoFS的设计中规中矩,主要贡献还是在于Coffer和Treasury,这里简单描述下:
ZoFS用Lease Lock设计实现了基于Free List的NVM页面分配器,能够实现并发快速页面分配。个人觉得中规中矩。
ZoFS采用Lazy Consistency的方法进行错误恢复(类似fsck
的方式),但是值得说明的是,ZoFS没有保证数据的原子更新。
评估结果不用想也知道,全是好得不行的数据,原因很简单:
- 用户态文件系统绕过VFS接口,性能自然是比NOVA这类内核态文件系统好;
- 缓解了元数据更新的开销,能够直接在用户态修改文件元数据;(例如每次Append Data后要修改文件时间戳之类的)
本节主要过一遍他们做的实验,以说明这类文件系统要从那几个方面进行评估
其中,最值得研究的是图 7(g),该Workload的工作模式为:不同的线程在不同的目录下创建文件。此时,ZoFS性能不及NOVA,文章说这是由于他们的Coffer的页面扩充函数竞争所致。
接着,利用图7(e)的Workload做了一个分解实验展示性能的提升:
各项目的含义如下:
ZoFS: ZoFS文件系统
ZoFS-sysempty: ZoFS的变体,在文件写入前发送空的系统调用
xx-noindex: 文件系统不更新索引(由于存在覆盖写,需要大批量调整树结构)
xx-nocache: 文件系统利用ntstore
绕过Cache写
ZoFS-kwrite: ZoFS的变体,在内核态写
PMFS: PMFS文件系统
NOVA: NOVA文件系统
NOVAi: NOVA变体,避免CoW更新(原地更新还慢一点吗?)
下图的结果充分说明了:用户态文件系统相较内核态在性能上的优越性
不多说,ZoFS全是最牛的那一个。
这里文章做了两组微基准测试:
chmod
)rename
)ZoFS-1coffer代表不做Coffer的分裂(即,不同权限的页面也能保存在同一个Coffer中,只存在一个Coffer)。
结果表明,ZoFS的Cross-Coffer操作(Coffer分裂)会带来较大的开销,所以尽可能让文件的权限都不变吧。
本工作着眼于NVM用户态文件系统的元数据更新问题,提出Coffer、Treasury用户态文件系统新架构:将具有相同权限的NVM页面聚集在一起形成Coffer,并通过Treasury进行管理。同时,本文利用MPK对在用户态直接修改元数据进行保护,有效缓解了Stray Write、避免了错误传播。
不过,该工作个人感觉并没有针对NVM硬件特性进行独到的设计,也许该设计能够适用于所有能够将页面直接映射到用户态的存储设备。有关更多NVM文件系统的设计与实现博主将在未来的时间慢慢解读。最近写博客的动力实在不太大,更新较慢请多多包涵。OK,开始起飞
1.sudo apt-get update 更新源2.sudo apt-get -f install 修正依赖关系3.sudo apt-get upgrade 更新已安装的包【程序】4.sudo apt-get dist-upgrade 升级系统5.sudo apt autoremove 清理系统残留..._gm9000 ubuntu 升级导致软件无法注册
SpringMVC@GetMapping注释将 HTTP GET 请求映射到特定的处理程序方法。 它是一个组合的注释,用作@RequestMapping(method = RequestMethod.GET)的快捷方式。@GetMapping将从 GET 请求到index()方法的/根路径映射。 它返回纯文本@PostMapping注释将 HTTP POST 请求映射到特定的处理程序方法。 它是一个组合的注释,用作@RequestMapping(method = RequestMethod.POST
针对单个ipynb文件解决该问题如果你在jupyter_notebook_config.py中找不到NotebookApp.iopub_data_rate_limit=100000这一项,可用以下命令重新打开该ipynb文件,该命令的作用时暂时性的,不会永久解决jupyer notebook 问题。如果是Mac,在terminal上含有file.ipynb目录的文件处运行如下jupyter notebook --NotebookApp.iopub_data_rate_limit=10000000 _jupyter notebooknotebookapp.max_buffer_size 不存在
包装filter,返回的每个匹配文档相关性得分均等于boost参数值的。{ "query": { "constant_score": { "filter": { "term": { "user.id": "kimchy" } }, "boost": 1.2 } }}constant_score的参数filter: 你希望执行的Filter查询,每一个返回的文档都必须匹配这个查询,Filter查询不会计算相关度分数,为了提高_elasticsearc constant score
解决:修改pom.xml中spring和spring-jdbc的版本号,这是由于其中的重复依赖导致的。我之前的spring-jdbc版本是5.几,现在改成了4.3.20之后就好了!希望这篇文章能够帮助到大家!
前言「以下来自于小伙伴的总结,为第一人称,在此我们就不改了。」学历真的是一个敲门砖,所以能升学历的小伙伴,一定要记得升学历!对于很多没有学历优势的人来说,面试大厂是非常困难的,很多时候连面试的机会都得不到。所以能得到面试机会,一定要好好把握,面试前准备一定要准备好面试题之类的内容。作为一个二本的渣渣,能够通过简历,五轮面试,拿到 P6 的 offer,离不开《Java求职面试宝典》,分享出来,一起学习。目前活动领取面试PDF资料及面试宝典,文末领取资料大礼包,限时开奖!什么是面试宝典《J
主机A和主机B通信报文的转发过程1、主机A和主机B在同一网段中 主机A查看自己的ARP缓存,检查是否有主机B的IP到MAC的映射,如果有映射,构造报文,目的IP为主机B的IP,源IP为主机A的IP,目的MAC为主机B的MAC,源MAC为主机A的MAC,将报文发送给交换机C,交换机C进行MAC地址表学习,将主机A的MAC和报文入端口号记录下..._如果主机a与主机b位于同一网段,主机a与主机b通信,则()
在本文开始之前插播一个题外话,最近我正在找工作,如果重庆或远程有相关坑位介绍的话请私信我一下;同时还有两个测试妹子,有测试相关坑位也请联系我。非常感谢,事成后请吃大餐。版本更新最近 GScript 更新了 v0.0.11 版本,重点更新了:Docker 运行环境新增了 byte 原始类型新增了一些字符串标准库 Strings/StringBuilder数组切片语法:int[] b = a[1: l..._gscript语言
目录及文件的基本操作1. pwd描述:pwd 命令用于显示用户当前所处的工作目录。用法:pwd [选项]...选项:-P 显示链接的真实路径。eg:[root@qll ln-test]# pwd/root/ln-test[root@qll ln-test]# pwd -P/root/test/root/ln-test是 /root/test的链接文件夹,查询如下:[root@qll ln-test]# ll -h /root/ln-testlrwxrwxrwx. 1 ro_ls -d /usr可以显示“/usr”目录本身而不是其子目录的相关信息
我们来学习滑动手势。人类最擅长的就是使用工具,手机是我们人类内心世界的延伸,我们渴望拥有上帝的力量。所以我们自己创造了一个世界,互联网。我们可以控制里面所有的一切。现在我们来控制一张图片是怎么向右移动的。在现实世界,我们是怎么控制物体移动呢?是不是要给它施加一个方向的力,然后它就会朝我们遇到的方向移动。so,虚拟世界也一样,我们也要给我们对象一个力,让它移动。这就是滑动手势,一只我们看不见
原标题:程序员过情人节:教你做抖音同款表白程序!最近抖音上一个很简单的vbs告白编程代码视频火了,双击这个编程代码编写的软件后会弹出一个窗口显示一段话,点击确定后会显示下一句。这个小程序很有意思也很简单,不管以前学没学过编程都能学会!U妹现在就教给大家~首先在桌面新建一个txt文本,然后将代码复制进去,里面中文的内容可以根据自己的需求来修改,而英文和标点符号千万不要修改哦,改了就无法执行了。下面是..._抖音程序员素材
最近,关于躺平的讨论特别火。嗯,我是一向鼓励年轻人努力的,但扪心自问,我自己其实是已经半躺平的。我跟很多读者的父母年龄相差不大,身为70后,人过中年,早没什么雄心壮志,所追求的不过是身体健...