SPDK NVMe vfio uio vhost相关概念及练手

本文介绍了SPDK的环境搭建及编译流程,并通过实例详细解释了如何使用SPDK进行vHost的创建与操作,同时对比了SPDK与传统分布式文件系统的主要区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分布式文件系统

dfs:对文件做索引

VFS

内核里面提供出来的各种各样的文件系统,比如

EXT3,EXT4,TEMPFS

大概是由上面三层组成

对外界访问的时候,第一层dfs只是个应用程序,对外界提供服务。

第二层VFS是操作系统Linux提供出来的这么一层,比如去操作EXT4、EXT3和TEMPFS的时候,它们每个文件系统的文件组织格式都是不一样的,那VFS是对外提供这么一层标准的接口,比如说调用open去打开文件,调用write去写文件,调用read去读文件,调用close去关闭文件,都是VFS提供这么关键的一层。

这些文件系统存储下面,不管是ext3、ext4等再往下层走,就是磁盘。磁盘和内存之间是如何互相访问的?这里有一个东西叫做PCI总线

NVMe,以前普通磁盘是一个磁头,NVMe提供的是多个磁头,大大的提升了访问速度,也就是硬件的速度大大升级,那么硬件速度大大升级后就会出现一个现象,软件速度跟不上,限制在软件上面。那么英特尔提供SPDK的方案,用来解决软件上缺失的问题。

1、SPDK环境搭建

vmware15.x

ubuntu 20.04

Linux内核版本5.4以上,为什么对内核也有要求,因为vfio的支持

vfio叫virtual functional IO,这是一个虚拟功能的IO,之前学习DPDK的时候学过uio。

NVMe是访问磁盘介质的一种方式

vfio和uio是纯软件的,

uio也是对于IO的操作,也就是对PCI总线地址的操作,PCI总线相当于高铁,比如从广州到北京,中间由N个站,每个站都有自己的地址,那么这个地址,那么这个地址对应的设备,uio就是对应这些设备,比如鼠标、磁盘、网卡都挂在PCIe上面,那么uio是提供一种在/proc/sys文件夹下面提供两个东西,一个是地址address,第二个就是size,访问这个设备对应的空间的时候,第一, 把这个地址read出来,然后对应的size有多大,这是uio给我们提供的交互方式。

vfio不一样,提供出来的是在/dev/vfio/vfio

安装好spdk后

ls /dev/vfio/vfio -l

会看到一个文件

spdk提供出来的也是一组,但是它的操作方式不一样,相当于open("/dev/vfio/vfio",)

分三级来看

第一是在内核中有个driver(或者叫module)叫做vfio,

第二就是设备文件,就是Linux启动后就有那么一个文件,这里就是/dev/vfio/vfio

第三就是在用户空间操作vfio的时候,提供一个库叫libvfio-user来操作第二层的设备文件

当你看到任何一个/dev下面有一个对应设备文件,都可以分3级来看,

第一级系统内核里面有一个模块,

第二级就是这个文件

第三级就是用户空间操作这个文件的lib库

2、SPDK的编译

参照 GitHub - spdk/spdk: Storage Performance Development Kit

下面中划线是视频测试部分,不需要看

然后为NVMe设备创建文件系统,(mkfs.ext4 /dev/nvme0n1)

然后挂载就可以用了(mount /dev/nvme0n1 /xxx/xxx/xxx)

接下来讲讲SPDK该如何操作

先终端命令行执行 lspci 看下

其中有一个 03:00.0 Non-Volatile memory controller:VMware Device 07f0

其中初始化SPDK环境 sudo scripts/setup.sh,主要是把SPDK里面对应的模块 内核文件加上。执行后会出现一个特别有意思的东西

 也就是系统里面默认的是uio,可以在启动的时候修改为支持vfio

 

上图:在uio的基础上采用PCI的地址去访问的,现在默认支持的还是uio

3、启动hello example

所有新的框架,先跑起来,

10%代码跟底层框架有关系,90%跟业务有关系

./scripts/gen_nvme.sh --json-with-subsystems > ./build/examples/hello_bdev.json

bdev就是 block device ,就是块设备,这个块设备跟Linux内核里面的块设备不是一个概念,

请注意这里的块设备就是所说的我们定义的就是用于一块存储空间,它跟Linux内核里面那个块设备不是一个概念,Linux内核里面的块设备就是说,我们创建一个driver,比如说对于磁盘或者对于U盘

创建一个驱动,而这里不是这个意思, 这里是提供出来就是SPDK里面对于我们存储的一块空间,然后规划了这么一个设备

可以看下hello_bdev.json的内容

cat ./build/examples/hello_bdev.json

{
    "subsystems":[
        {
            "subsystem":"bdev",
            "config":[
                "method":"bdev_nvme_attach_controller",
                "params":{
                    "trtype":"PCIe",
                    "name":"Nvme0",
                    "traddr":"000:03:00.0"                
                }            
            ]        
        }    
    ]
}

上面配置就是告诉SPDK,现在有一个设备,分配的设备是bdev,它是NVMe的,它的地址是多少,它的名字是什么

./build/examples/hello_bdev --json ./build/examples/hello_bdev.json -b Nvme0n1

在Linux系统里面提供异步写的方案有哪些?

1、比较老的方案aio(spdk提供的是aio)

2、现在可能用的不那么多的io_uring,但是它还是比较常用的

vhost

平时使用的Nginx配置多个server,反向代理,也叫vhost(virtual host是个逻辑关系)

启动一个vhost

./build/bin/vhost -c ./build/examples/hello_bdev.json

cat ./build/examples/hello_bdev.json

内容如下

"config":[
    {
        "method":"bdev_nvme_attach_controller",
        "params":{
            "trtype":"PCIe",
            "name":"Nvme0",
            "traddr":"0000:03:00.0"        
        }    
    }
]

上面配置,vhost启动的时候,一个NVMe就对应一个vhost。

vhost可以做几个呢?比如我们再加一个NVMe,可以是多个。

当然还有个客户端,去连接操作vhost,从而操作NVMe,

SPDK就是提供了vhost方案,对后面的NVMe提供一个存储的方案,对它里面的数据进行规划。

新开一个终端,在终端执行下面命令启动客户端

./scripts/spdkcli.py

 

vhost对应的就是 下图红色框框部分,可以理解为一个vhost后面带一块固态硬盘,SSD速度比较快,SDPK就是提供了这么一套方案。

分布式文件系统也是前面一个网络后面带一个存储,那么spdk的vhost和分布式文件系统有什么区别?

spdk最大的特点就是对于文件的存储以及文件的规划,它已经不再是分布式文件系统,分布式文件系统是这样的:只对文件本身进行规划,进行索引,至于文件具体存储的方式,比如数据源、数据的格式这些事管不了的,但是spdk不一样,它把对应的文件存储都做到了用户空间来了,就是把本身内核操作的东西,现在把它做到了用户空间,有我们自己去做、去控制,这样的一种方案,包括前面的网络也是(vhost,可以用DPDK),这是跟以往的分布式文件系统不一样的地方。

加入一个节点怎么做?

先ls看下

./scripts/spdkcli.py ls

 

从上图可以看出bdev对io提供了很多方法,aio malloc nvme rbd split_disk等

创建命令

./scripts/rpc.py bdev_malloc_create 64 512 -b Malloc0

执行后再ls看下

./scripts/spdkcli.py ls

 

创建后就可以对数据进行存储和修改

如何添加一个vhost?

./scripts/rpc.py vhost_create_scsi_controller --cpumask 0x1 vhost.0

执行后可以从另外一个终端(vhost进程)看到如下字样

 

可以用netstat anop|grep vhost来看下

上图的vhost-user server不是用户态协议栈,它是内核提供出来的

 

接下来为vhost.0分配位置

./scripts/rpc.py vhost_scsi_controller_add_target vhost.0 Malloc0

 

spdk-client提供一系列的命令,比如ls/cd等命令去操作vhost

rpc对vhost进行修改,如前面的./scripts/rpc.py vhost_scsi_controller_add_target vhost.0 Malloc0 这里面的vhost_scsi_controller_add_target就是SPDK源码里面的一个函数名

为了设计一款能够有效聚合校园生活信息的APP,首先需要从用户的需求出发,详细分析目标用户群体的特点和需求,即XXXX生的日常生活和学习需求。在此基础上,定义APP的核心功能和服务范围,包括但不限于选课指南、考试资源、兼职信息、生活充值等服务。 参考资源链接:[校园生活APP:服务XXXX生的创新创业计划](https://wenku.youkuaiyun.com/doc/7ji9n8gsq2?spm=1055.2569.3001.10343) 接下来,进行市场调研,了解同类APP的现状、优缺点以及目标用户对此类APP的使用体验反馈。这一步骤将帮助我们确定产品的差异化特征,并据此制定出创新点和改进方向。 根据调研结果,设计APP的架构和用户界面。架构设计要考虑到数据的高效采集、存储、处理和展示,以及第三方平台的接口对接。用户界面设计则需要注重用户体验,确保操作简便、界面友好。 确定技术路线后,开始APP的开发工作。开发过程中,选择合适的开发工具和框架,如React Native或Flutter等跨平台开发框架,可以快速构建iOS和安卓双端应用。对于数据聚合,可以利用爬虫技术定时从校园网站、合作伙伴网站等来源抓取信息,并存储服务器。开发中还应考虑到数据的安全性和隐私保护措施。 对于信息的更新及时性与准确性,可以设立后台管理系统,由专业团队负责日常的信息维护和更新,同时设置用户反馈机制,鼓励用户上报错误信息或提出建议。利用机器学习等技术优化信息分类和匹配准确性。 测试阶段,进行全面的系统测试、性能测试和用户测试,确保APP的稳定性和易用性。在APP上线后,进行持续的监控和迭代更新,根据用户反馈不断优化功能和提升服务质量。 总结来说,开发一款校园生活APP需要深入理解用户需求,合理规划产品功能,采用合适的开发技术和架构,并且注重后期的运营和维护。为了深入了解如何将这些步骤具体实现,建议参考《校园生活APP:服务XXXX生的创新创业计划》。这份文档不仅提供了产品规划的全面视角,还包括市场分析和运营策略,是解决当前问题的有力支持。 参考资源链接:[校园生活APP:服务XXXX生的创新创业计划](https://wenku.youkuaiyun.com/doc/7ji9n8gsq2?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值