00:05
Hello,大家好,我是小兵,今天给大家分享dells用户态文件系统Dis IO全路径,希望大家喜欢。这是我的第二个视频,希望大家喜欢。Hello,大家好,我是小兵,今天。大家。带来的技术分享是DES用户态文件系统的一个全路径。啊。首先,这。这是呃,总结的一个文档,然后大概浏览一下,我们分为一个大的一个简介部分。他主要是讲一些架构,然后另外是详细展开一下用户态文件系统的一个IO全路径。
01:07
然后。我们主要是。参考了一下。参考了一下这篇文章,DELL存储性能可扩展性研究,这也是一一篇PDF的论文哈,然后另外一个就是呃,我这边基于DELL是官方的一个项目,定期同步的master分支,然后做了呃编译的缓存调试脚本,还。呃,增加了一些调试文档之类的,然后。嗯。呃。呃,咱们开始吧,嗯。呃,DELL用户文件系统。呃,它是一个开源的,一个扩展的,可扩展的一个存储系统带钥匙。他根本上是设计用于在在用户空间,太用户空间支持呃。
02:04
嗯。呃,存储类,呃,就是说那个叫做呃。存储持久内存和MV存储。然后。Dells ly500的基准测试中都表现比较好,因为我们看到排名靠前的基本很多都是基于DELL来做的,呃,项目。嗯,因为大钥匙是从头开始设计的,它充分利用了现代的存储硬件SM MV me,呃,还有以后的CISSD。呃,他是。将它先进的那个低级建筑API。呃,相对于传统的基于process的呃并行文件系统有更高的LPS和扩展可扩展性。呃。虽然说大家是提供了post抽样层,它可以直接以自定义IO中间件,比如说MPIOHDFS,还有几个AI分析框架集成。
03:06
它可以提供比更多的功能。我们本次的I流程也主要是基于DELL process容器之上的,用DFSAPI呃作为入口来对存储后端进行一个IO的访问。这是dells的系统的整个一个架构的缩略图。上面是客户端的一些API,比如说de ne。内部Li。呃,它可以通过r DMA liric访问到我们的存储引擎。嗯,然后这边有,呃,元数据是低延迟的IO,还有索引啊查询啊,在左边走的是PMDK。嗯,也就是持久内存的一个开发库,嗯,通过内存的统一内存接口来访问我们的3DX point memory。
04:04
嗯,也许是奥腾吧,然后。右边的话是走大块数据的话,呃,走我们的sbdk MV me的一些接口来访问我们的MB的盘,然后。呃,这是一个典型的一个他的一个,呃,内存条的插法这边,比如说我们有两个那个CPU和CPU0和CPU1,他们是采用对称的形式。嗯,就是一个号腾会对一个普通的,呃内存。然后。嗯,大致浏览一下。然后我们。就讲。I路径吧,用不太的文件系统哪有路径?它前置条件就是说我们需要先启动dells服务器,还有拉起DES引擎,创建存储池容器,以及通过DEF挂载容器到我们的一个文件系统的分区。比如说我这里是temple sb。
05:13
嗯,我们创建词就是。呃,DG,然后。然后我们再查回来就是list,然后我们创建容器是类似的create container。然后我们。把它查询出来,看有没有创建成功。然后我们可以将。呃,容器挂载到某个分区,比如挂载分区是这个分区,然后我们的词是SXB,然后contain s XB,然后我们查一下有没有挂载成功。然后我们写文件可以通过自己写一些APP,通过write来写。这个分区或者说通过DD命令来写,然后我们先大概看一下这个时序图吧。
06:00
可能这个示意图有点不清晰。然后我们打开那个项目。去哪一个?没放大。首先我们从APP开始,然后到FS到Li f,然后到FDFS这样的一个路径来按照这个顺序来讲一下啊。然后我们比如说调一个right接口APP描写,使自己写到这个呃文件中,然后我们。就是文件系统这一层的话,它就是调那个buffer。拍barber,然后走到 libf3的话。他这边会。
07:01
因为我们那个Mo的时候,它会起一个循环处理的一个线程。比如说的一个worker。To。我们在就是执行mount的时候,它这里会取一个路,就是有一个while出里面会一直去。监听。我们看到它这里start one的时候,这个地方会起一个线程to work在这个线程里面。
08:02
那现在里面。会一直去。通过fus接口fuse身形的去处理这个buffer。在这个处理里面,我们。在这个处理里面,我们有right的话,它会通过这个,呃,通过do red buffer,还有一个op red buffer,所以op red buffer的话,就是我们提前注册好的。也就会调到我们的那个,呃,Diff的cp right这个函数里面来,然后我们就调过来。
09:01
也是走到我们的这个地方,Dpu是CPU在这里,它然后紧接着它会往下走。在这里包括说是一些。呃,分配本地的一些缓冲区。然后。做一个拷贝,就是把那个用户的数据给拷贝过来,然后。嗯,我们先大致说一下这个流程,然后待会就是把你们的细节再过一下啊。就是说,然后就是说他调那个DFS的一个right接口。的话调到那个right。学术组。然后他通过创建一个task。然后执行那个调度写数组的任务到那个DFS这一层DFS。DS这边的话。收到那个的话,他执行那个DC就写数组IO,呃。他走到A模块,A模块的话这边开始。
10:01
这里写数组,写数组的时候,他先计算那个分布式k dktribute k。然后它创建分散比SGL,然后又创建一个任务。呃,比如创建对象,更新任务,然后他这里会出差依赖任务,这个是主任务,这个是IO。Task,这个是依赖任务,主任务要等依赖任务执行完才能够开始执行主任务。然后。批量执行调度。批量的任务,一个调度执行,就把我们这个任务给发起这个任务,然后他就会执行对象更新任务,这个时候还在那个客户端DPS进里面,那这个时候嗯,到了opg这一层的话,会校验请求,然后比如说将任务压站,然后设置一些e po口,还有一些其他的参数。还有包括对STL进行一些校验,然后做一个任务的一个出战,出战了之后,然后呃。
11:01
这个时候他提交对象更新,提交对应更新的话。然后。这边有个又初始化的一个任务,然后初始化对象更新任务,他的opc是那个r p CF data,然后这个时候根据分片查找转发的一个目标。呃,比如说准备读写用的大块内存。嗯。到一个关键的函数,就是对象的一个请求,散出就散出对象企业请求,它会准备读写和执行对象分片的一个读写。然后到了那个对象封面读写的时候。呃,他这边会设置目标,就是我要往哪个地方写哪个写到哪个组,哪个tag,哪个rank,然后他通过网络的RPC发给引擎。与send的send的,然后这边有一个回调,大家是RPCCB,这是一个公用的一个呃,RPC的一个回调,然后这个时候就呃,通过就到我们的那个引擎这一这一侧了,通过网络走到我们引擎这边来,然后服务端。
12:06
对,对象的一个读写处理器,就是DSOG,呃,RW handle,然后这个时候它会进入到SRV的RBG,就服务端的对象处理,服务端的对象处理的话是他先访问VSVS前的一些检查,然后比如说处理器语言,然后。呃,两阶段提交的一个leader的一个开始,然后。他执行leader的一个执行,执行的就是这个对象在所有目标执行对象更新的一个操作,然后他也会执行一次,仅执行一次本地对象的读写,然后接着就往下就准备更新VS。呃,比如准备快的IO,其实就是一个IO描述就是BIIO这个模块的ID lo description prepare IO。D的一个post提交快。
13:01
然后到我们的内存直接访问DW。然后再往下就是m m me的,RWMB的,就执行n me的一个读写。MV读写的话,调的是SSPDK的接口,比ST bklob IO write通过SSPD的接口来写这个blob二进制大对象。然后当我们的那个这边写的话,写完了,他这边是异步,由于是异步的,它是通过回调函数来的,那写完之后这边就是说。呃,他写了之后,这个直接就往下一步了,然后比如说他完成对象的读写请求,然后。这o bw computer,然后。呃,对象读写完成更新延迟计数器,然后它会发送回复,然后释放资源,发送回复的话就是说通过那个reply给网上层,然后逐层回调,然后做一些回调的处理,最终给到那个APP。的一个回复。然后我们看到还有一点。
14:03
还有一点就是说,呃,S spdklo I就到了SSPDK项目,SSPD项目的话,后面单独出一期节目,呃,给大家讲一下,分享一下,然后他调了个red blocks,通过SSP写m me落盘。嗯,这边也是有一个回调,这个回调的话,它主要是BKK的写回调。比如说RW complete读写回调,然后完成那个D做一个预写日志的完成,或者说数据的一个完成,这块还没有细化,后面呃会跟大家细化。然后这个是一个粗略的图。然后,但是我们。再讲一下里面一些细节。刚才讲了这一块。
15:00
就是说把这一块的内容给。这一块其实就是一些更细节的一些,呃,比如说内存拷贝的一些。然后这个就是一个梳理的流程图,刚刚写输出。OK,我们从从这里。这个图已经讲过了,然后从这个流程简图开始吧。再来过一下。就比如说我们,嗯。用不态文件系统的一个流程。然后客户端他写数据给他write一个。4B的一个数据,然后调到那个VF。最终调过来先。通过FF调过来。在这里这里的话,它会执行一个拷贝,拷贝用户的数据。其实这里面的一些结构的话,用数据。
16:01
用数据也是向量缓冲区,就是那种B分V的结构,BV的话,它里面有一个内存地址,还有一个目标向量缓冲区的内存长度,数据长度。他会考虑到这个上面来。拷贝上来之后呢,再往下的话,它往下就往下传了,往下沉调,就是调df right的时候把那个SGL。SQL就是我们刚才执行拷贝的时候,SQL里面就已经有数据了,然后。然后通过那个EV。把这些传上去。他把这个EV事件也传下去了,EV事件和这个SGL往下传。其实这里的话就是说这边咨询完了之后,他会通过一个呃唤醒希望信号点来唤醒我们的那个EQ事件队列。做了一个轮询。再往下的话就是说。嗯。就是STL转那个I描述。转成那个RG就是range every数组的一个范围,它里面有多少个?每个的一个起始索引,一个长度。
17:06
这边是S9。成为的一个详细的一个分布。然后这边是掉下来,就像刚才说的那样。但我们看到这里面有很多都在用这个什么T下划线开始的task create啊,Ts task register啊,还有什么task schedule啊,这是一个里面通用的一个异步任务调度框架。这个后面单独给大家分享。嗯。这也就是刚才的一些内容,然后。顺着这个,然后第二个right了下来。通过这个object update task下来,然后。也是这样走下来。提交对象更新对。这里是发送那个数据过来。
18:02
OK,他这里是到那个服务端的对象RW。嗯,就是。服务端对象读写控制器。OK,我们过一下详细的。客服上写数据。好,这边。分配缓冲区,然后。这次会消除那个原数据缓存。这里面一个slave,这是相当于一个内存的一个分配器分配提前分配器小的那个slave。也是用了类似于伙伴算法的一个实现。这边会初始化线程,然后初始化链表。把一时间队列给造出来。这次回调,然后。对面扛完出。卡完了用户的数据之后往下下一层调调d FS right。系统问题,系统然后。
19:00
这边有一些细节创建任务啊,做一些转换。这边是写完了之后才解锁那个信号量唤醒线程。唤醒的是一个progress线程,其实就是一个po的线程。然后这边可不可以写输出。这个写数组的话就是。通过这个地方创建了一个任务,一步任务,然后调到这边来写。其他设置一些操作码,然后开始又创建任务,然后这个地方是开始算那个分key。对面。身份不是的key。算完之后再下面再次计算,然后重建这个距离表,再往下走。最终他会走到。Task,然后高端对象更新,对象更新的话。我下了还有一个。大push,还有sta pop的逻辑,就是任务压站和出站的一个逻辑。这也是那个TC框架带的。我们其实都可以借鉴这里面的通用框架,然后再往下出来之后提交对象的更新。
20:07
这边再往下走。会做一些医师的标志的一些判断。这个那个提供的人。写在往下,他会这个函数也比较关键,就是说。对象的分片。然后转成那个要转发到哪个目的。转发的目标,也就是根据分片查找,转发的目标里面好像是一个二分查找还是什么的。然后分别目标查询,然后。获取到目标对象。再去二分查找。然后。然后这边他要求转发给容器的leader,他会自上这个。Container leader。然后这边。再往下。再往下的话,就是说一个。
21:02
和find out最关键的那个请求删出。删除主要是执行那个,一个是准备函数prepare,然后一个是呃,实际执行的这个分片读写对象分片读写到这里了。全面图写,然后。他们获取吃。我去煮。T rank获取到之后。创建一个。呃,RPC,然后开始填充读写的结构。跳过ec没有用,一用到ec。然后。这边。开始调那个RP的。就。因为我们这里有那个o po的。操作码,然后被那个NG收到了RPC的话,它会有一个。回调函数来处理,就是这个。服务端的一个对象,读写处理器。
22:00
通过这个NPC关联起来,然后自己这些再往下的话,就是访问A前的各种检查。他会执行一次本地的戏。然后他一个。更新目标RPC。指定这个跟进目标。处理。会做一些检查嘛,这里面其实一些比较业务的细节,大致看了一下。然后再往下的话是处理传入操作的机源状态。然后上下是那个15开始。Leader begin,然后在所有目标的执行对象更进操作。在这里。这样对应操作,然后它首先会执行仅直信息是本地对象读写就这里。这边的话执行那个local读写。
23:03
我这下面会走到一个。Bio的逻辑,Bio的是IIO描述的一个拷贝。一提交异步的一个BL的一个提交,然后再往下。的话就是d ma读写,还有MV的读写。最终是走到SDK的。I'right。Probably I'written。完成之后就会掉这个W回调,所以说整个那个。Dells的。用户态文件系统I的一个路径。呃,就是这些了。看还有没有其他的。然后的话就是说参考了一个。博客还有一个。一个项目,其他的就没了。然后顺便可以提一下,就是我平时在那个。
24:02
嗯。看代码就是梳理代码,是怎么快速的梳理出这些?呃,逻辑的呢,主要是通过Vs code的一个gdb touch,还有GDB,就是比如说我可以给大家演示一下。比如说我们通过一个浪。DES系统。我们其他那个调试里面。我这里做了一些配置。它可以直接。比如说这里有断点,我们可以直接下一步,下一步。看他这个。下一步。然后这个关于这个浪级的配置的话,我可以给大家看一下。
25:01
SQ的浪的话,我们是通过那个attach到那个N级,就是当你需要调哪一块的话,你就切到哪一个那个进程上去调试就行了,这样的效率非常高。比如说我们的二,其实就是。呃,用这个GDP的二塔。然而他就到某个进程号,这个要改一下,然后。改上去之后,你在这边打了端点,比如我在这个地方打了一个端点,就是说是在那个。呃,对象的一个本地读写。内部图写这个地方打了一个断点,然后当他当你这边执行的那个写的时候,它满足条件就在这里,断点断在这里,断在这里之后呢。断这里之后,我们就可以用那种单步的一些命令来调试,比如说就是单步往下,或者说是。
26:06
对,比如说我演示一下吧,然我这里就用快捷键了哈,就比如说按那个F10,下一步他就一步一步这样往下走,我们要进某个函数,直接按那个F。F4就进得去了,这样你很快就可以对一个那个。呃,代码的一个关键路径,进行一个快速的梳理。OK,今天的技术视频就到此结束。希望大家喜欢。
我来说两句