虚拟机支持本地nvme ssd

2023-10-26

提起存储都是血泪史,不知道丢了多少数据,脑子首先想到的就是《你说啥》洗脑神曲,我就像那个大妈一样,千万个问号?????????????.........

hdd是啥?ssd又是啥?

mbr是啥?gpt又是啥?

primary partion是啥?logical partion又是啥?

sata是啥?scsi又是啥?

sas又是啥?nvme又是啥?

它们和pcie又是什么关系?

hardware raid是啥?firmware raid是啥?software raid又是啥?

intel rst中raid/ahci模式又有啥区别?为啥raid模式双系统linux安装时找不到盘?

需求

第一高并发低时延,第二隔离。

用于特定业务运算时临时数据过多过大,在内存中放不下,要临时写到硬盘中,这些数据不需要长久保存,只要能快速大量写和读就行。

虚拟机用的nvme ssd盘的大小和数据在创建虚拟机时指定,不用支持动态添加nvme ssd和虚拟机带nvme ssd热迁移,nvme ssd数据不做多副本。

调研

先看nvme是什么东东,从它的spec入手。

居然支持sr-iov和namespace,sr-iov代表着硬件资源切分和隔离,并且是标准pcie设备,可以passthrough给虚拟机的,namespace看起来和sr-iov差不多,硬件级别的虚拟,两者什么区别暂时不明白。

高并发低时延:

性能高要求至少跳过host上的image format和file system处理,不能再把虚拟机的硬盘当作一个image文件,而是直接让qemu调用host内核的block layer或者操作硬件。

  • pcie passthrough

  • qemu userspace nvme driver

  • spdk

  • 一个raw disk给虚拟机,虚拟机里分区和创建文件系统

隔离:

有软件隔离和硬件隔离,硬件隔离是最安全的。

  • lvm

  • 虚拟机独占一个nvme ssd

  • nvme namespace

资源利用率:

除了满足用户需求还得考虑资源的充分利用,争取把本地nvme ssd的空间充分利用起来。

  • lvm

  • nvme namespace

nvme mdev太超前了,不知道硬件和软件是否支持。

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! ! 

验证

测试机器上有9块nvme ssd,一块系统ssd挂sata接口下,另外8块挂pci下,前四块4T,后四块2T。

lspci -s b2:00.0 -vvv查看发现Capabilities中没有Single Root I/O Virtualization (SR-IOV),上网一查看来是真不支持。

试着在一块nvme ssd上创建两个namespace报错,上网找找,一对型号是支持的,得升级firmware。

找升级工具,安装 yum install ./intelmas-1.5.113-0.x86_64.rpm,升级intelmas load -intelssd 7

在第7块ssd是划分4个500G namespace
nvme detach-ns /dev/nvme7 -n 1 -c 0
nvme delete-ns /dev/nvme7 -n 1
nvme reset /dev/nvme7
nvme create-ns /dev/nvme7 -s 975175680 -c 975175680 -f 0 -d 0 -m 0
nvme attach-ns /dev/nvme7 -n 1 -c 0
nvme create-ns /dev/nvme7 -s 975175680 -c 975175680 -f 0 -d 0 -m 0
nvme attach-ns /dev/nvme7 -n 2 -c 0
nvme create-ns /dev/nvme7 -s 975175680 -c 975175680 -f 0 -d 0 -m 0
nvme attach-ns /dev/nvme7 -n 3 -c 0
nvme create-ns /dev/nvme7 -s 975175680 -c 975175680 -f 0 -d 0 -m 0
nvme attach-ns /dev/nvme7 -n 4 -c 0
nvme reset /dev/nvme7

在系统上看到确实成了4块nvme ssd。

但pci设备没有多,至少说明pci passthrough是不行的,估计有了sr-iov结合namespace就可能单独passthrough了,passthrough不行退而求其次试试qemu userspace nvme driver。

#qemu nvme userspace driver
intel_iommu=on iommu=pt
echo 0000:b2:00.0 > /sys/bus/pci/devices/0000:b2:00.0/driver/unbind
echo 8086 0a54 > /sys/bus/pci/drivers/vfio-pci/new_id
lspci -s 0000:b2:00.0 -vvv
#虚拟机1
/usr/libexec/qemu-kvm -machine pc-q35-rhel7.3.0,accel=kvm,usb=off,dump-guest-core=off \ 
-cpu host -m 16384 -device piix3-usb-uhci,id=usb -device usb-tablet,id=input0,bus=usb.0,port=1 -vnc :0 \
--monitor stdio -device virtio-scsi-pci,id=vs0 \ 
-drive file=/home/huiwei/linux0.vmdk,format=vmdk,id=drive0,if=none -device scsi-hd,drive=drive0 -device virtio-scsi-pci,id=vs1 \
-drive file=nvme://0000:b2:00.0/1,format=raw,id=drive1,if=none -device scsi-hd,drive=drive1
#虚拟机2
/usr/libexec/qemu-kvm -machine pc-q35-rhel7.3.0,accel=kvm,usb=off,dump-guest-core=off -cpu host -m 16384 -device piix3-usb-uhci,id=usb -device usb-tablet,id=input0,bus=usb.0,port=1 -vnc :1 --monitor stdio -device virtio-scsi-pci,id=vs0 -drive file=/home/huiwei/linux1.vmdk,format=vmdk,id=drive0,if=none -device scsi-hd,drive=drive0 -device virtio-scsi-pci,id=vs1 -drive file=nvme://0000:b2:00.0/2,format=raw,id=drive1,if=none -device scsi-hd,drive=drive1

报错了,看来也行。

qemu-kvm: -drive file=nvme://0000:b2:00.0/2,format=raw,id=drive1,if=none: Failed to open VFIO group file: /dev/vfio/80: Device or resource busy

不了解以为是什么高大上的东西,想想也是,不可能两个qemu进程同时驱动这个pci设备。

The difference between <disk type='nvme'> and <hostdev/> is that the latter is plain host device assignment with all its limitations (e.g. no live migration), while the former makes hypervisor to run the NVMe disk through hypervisor's block layer thus enabling all features provided by the layer (e.g. snapshots, domain migration, etc.). Moreover, since the NVMe disk is unbinded from its PCI driver, the host kernel storage stack is not involved (compared to passing say /dev/nvme0n1 via <disk type='block'>) and therefore lower latencies can be achieved.

再退而求其次,创建两台虚拟机分别用不同的namespace。

#虚拟机1
/usr/libexec/qemu-kvm -machine pc-q35-rhel7.3.0,accel=kvm,usb=off,dump-guest-core=off \
-cpu host -m 16384 -device piix3-usb-uhci,id=usb \
-device usb-tablet,id=input0,bus=usb.0,port=1 -vnc :0 \
--monitor stdio -device virtio-scsi-pci,id=vs0 \
-drive file=/home/huiwei/linux0.vmdk,format=vmdk,id=drive0,if=none \
-device scsi-hd,drive=drive0 -device virtio-scsi-pci,id=vs1 \
-drive file=/dev/nvme7n1,format=raw,id=drive1,if=none -device scsi-hd,drive=drive1
#虚拟机2
/usr/libexec/qemu-kvm -machine pc-q35-rhel7.3.0,accel=kvm,usb=off,dump-guest-core=off -cpu host -m 16384 -device piix3-usb-uhci,id=usb -device usb-tablet,id=input0,bus=usb.0,port=1 -vnc :1 --monitor stdio -device virtio-scsi-pci,id=vs0 -drive file=/home/huiwei/linux1.vmdk,format=vmdk,id=drive0,if=none -device scsi-hd,drive=drive0 -device virtio-scsi-pci,id=vs1 -drive file=/dev/nvme7n2,format=raw,id=drive1,if=none -device scsi-hd,drive=drive1

libvirt用如下格式

<disk type='block' device='disk'>
<driver name='qemu' type='raw'/>
<source dev='/dev/nvme7n1'/>
<target dev='sdb' bus='scsi'/>
</disk>

虚拟机里多了一块硬盘,能正常分区和创建文件系统,并且读写。

最后删除虚拟机,擦除数据。

nvme format -s1 /dev/nvme7n1
nvme format -s1 /dev/nvme7n2

方案

总体上来说,pci passthrough一个nvme ssd只能给一个虚拟机用,qemu userspace nvme driver也存在这个问题,还要求升级libvirt版本到6.0.0,存在过度资源浪费,排除这两种用法。

spdk要求有hugepage,要求qemu支持vhost user,得升级qemu版本,nvme ssd独占给spdk进程,对spdk不熟悉。

lvm多了一层会引入额外的性能损耗。

nvme namespace可以把nvme ssd分成flavor中指定大小的namespace,虽然还是同一个pci设备,但在host上看到的就是一个个单独的硬盘,由物理硬件做隔离和加速。

所以选择nvme namespace,/dev/nvme0n1 via <disk type='block'>,最终效果如下,一个专用qemu iothread处理这块nvme raw block。

给虚拟机的存储控制器用virtio-scsi,主要是考虑到虚拟机和物理机对硬盘命名方式一致,而且一般物理机上用scsi controller,在物理机上应用有可能针对scsi用过优化,用virtio-scsi保证用户从物理机顺利迁移到虚拟机上。

virtio-scsi后端继续用qemu virtio scsi,kernel vhost-scsi用的少,而且我们用的host centos kernel没有编译进去(CONFIG_VHOST_SCSI is not set)。

开发

部署时所有非系统用nvme ssd盘都划分成500G大小的namespace,nova-compute要能发现nvme ssd盘namespace,并且上报给nova控制面,nova控制面写到数据库,

创建虚拟机时flavor中指定本地ssd大小,支持1500,2500,3500,4500的规格,nova-scheduler调度时考虑本地ssd盘资源,用过的在数据库中做标志,删除虚拟要时擦除数据。

os-brick是否可以发现和管理nvme?

pynvme又能做什么,nova是否可能调用pynvme而非执行命令?

nvme-cli是否有对应的python库?

虚拟机内规划好ssd和目录对应关系,或者用lvm管理ssd。

参考文献

https://community.intel.com/t5/Solid-State-Drives/Intel-NVME-SR-IOV-support/td-p/624319

https://nvmexpress.org/resources/nvm-express-technology-features/nvme-namespaces/

https://www.intel.com/content/www/us/en/support/articles/000038017/memory-and-storage/data-center-ssds.html

https://opendev.org/openstack/os-brick

https://github.com/pynvme/pynvm

原文链接:https://zhuanlan.zhihu.com/p/354633464

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

虚拟机支持本地nvme ssd 的相关文章

  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • 如何使用最小起订量模拟私有只读 IList 属性

    我试图嘲笑这个列表 private readonly IList
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • C++0x 初始值设定项列表示例

    我想看看这个现有代码示例如何利用 C 0x 初始化列表功能 示例0 include
  • 是否有可能将 *.pdb 文件包含到发布版本中以查看错误行号?

    我做了一个项目 所有设置都是默认的 当我在调试模式 构建配置 调试 下运行它并遇到异常时 它转储到我的自定义日志记录机制 其中包含错误行号 但是当我运行发布构建时 记录相同的异常 没有行号 只有方法抛出和记录调用堆栈 是否有可能在发布配置
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • C# 反序列化过程中创建指向父对象的指针

    我有这样的课程 Serializable public class child public Parent parent Serializable public class Parent public List
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 如何解决文件被另一个进程使用的问题?

    我一直在 VS NET 2010 中调试 没有任何问题 但现在无法建造 我收到错误 Unable to copy file filename to bin Debug filename The process cannot access t
  • 在 Windows 上使用 C/C++ 开发时省略 msvcr100.dll?

    是否可以在 Windows 上使用 C C 进行开发而不链接到 msvcr100 dll 我知道这是 Windows 的标准 c 库 但我想知道如果我没有安装 Visual Studio 或 Redistributable 软件包 我的计算
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码

随机推荐

  • 原型模式

    原型模式 根据实际案例分析原型模式的优点 浅克隆 代码示例 测试分析 深克隆 代码示例 测试 分析原型模式的优点 Spring框架中原型模式案例 业务与原型模式的落地示例 根据实际案例分析原型模式的优点 在传统模式下 假设需要克隆对象 动态
  • Unity3D Texture to Sprite

    unity3d中截屏转化为sprite using UnityEngine using System Collections using UnityEngine UI public class Demo MonoBehaviour publ
  • vue实现下载文件

    最最简单的vue实现下载文件 用vue实现调取后端接口从服务器下载文件 话不多说直接上代码 1 首先第一步改下axios的配置 const axios axios create config axios interceptors reque
  • HTTP

    一 安全特性 在上篇文章中 我们了解到HTTP在通信过程中 存在以下问题 通信使用明文 不加密 内容可能被窃听 不验证通信方的身份 因此有可能遭遇伪装 而HTTPS的出现正是解决这些问题 HTTPS是建立在SSL之上 其安全性由SSL来保证
  • 【插件】谷歌浏览器插件 visio在线打开vsdx文件 .vsdx文件在线查看

    提供一个下载地址 谷歌插件下载 步骤1 输入 visio viewer 2 选择版本 我选择的是V4 4 点击下载 3 根据123步骤点击进入扩展程序 4 打开刚才下载的文件并解压 解压后打开找到crx结尾的文件 把该文件拖入扩展程序 点击
  • IDEA的下载和使用安装

    一 IDEA的下载 IDEA下载地址 https www jetbrains com idea download section windows IDEA 分为两个版本 旗舰版 Ultimate 和社区版 Community 二 安装过程
  • 射频中的 S参数 总结

    S参数简介 S参数 也就是散射参数 是微波传输中的一个重要参数 S12为反向传输系数 也就是隔离 S21为正向传输系数 也就是增益 S11为输入反射系数 也就是输入回波损耗 S22为输出反射系数 也就是输出回波损耗 S参数作为描述线性无源传
  • typescript 基础类型注解

    TypeScript 基础类型 序号 数据类型 关键字 描述 1 任意 any 声明为 any 的变量可以赋予任意类型的值 2 数值 number 双精度 64 位浮点值 它可以用来表示整数和分数 3 字符串 string 一个字符系列 使
  • Qt中QPushButton设置按钮的文本位置

    特定样式 引言 解决方法 总结 引言 今天碰到一个动态创建的QPushButton添加到布局中 我需要设置按钮的文本距离边框的距离 按照以往自己设置的与边框的距离的方式设置的样式 没有起到任何作用 前提是 qss文件能正常加载 其它控件都正
  • Qt中对TCP粘包的处理

    当时用TCP协议传输数据时 经常出现粘包的现象 当服务器向客户端发送数据之后 客户端还没有接收数据的时候 这段时间数据在什么地方 1 服务器 服务器已经发出数据了 2 网线 数据应该在内存 怎么会在网线里面 又没有内存 3 客户端 是的 这
  • GoFrame框架入门教程一(下载框架)

    本地环境 1 Windows 2 go版本 1 17 3 编辑器 GoLand 2021 3 2 新建项目 Environment 处填写 GOPROXY https goproxy cn 使用 go mod文件管理项目包 module g
  • sqli-labs————less 22

    Less 22 简单测试 username admin password aaa 查看一下源代码如下
  • linux系统离线安装miniconda3 及创建python环境

    在linux系统中安装python开发环境 一般采取安装miniconda的方法 不建议安装anaconda miniconda是一个anaconda的轻量级 默认只有python跟conda 有时候出于安全性考虑 服务器不允许连接外网 因
  • STM32一键下载电路设计原理

    先放原理图 补充 图中的BOOT0通过10K的电阻接到地 再解释为什么这么设计 STM32启动方式 BOOT0和 BOOT1用于设置 STM32的启动方式 见下表 BOOT0 1 BOOT1 0 串口下载模式 BOOT0 0 BOOT1 X
  • 聚类(K-means)实现手写数字识别

    其他实现手写数字识别的方法 1 KNN实现手写数字识别 2 卷积神经网络 CNN 实现手写数字识别 3 全连接神经网络实现手写数字识别 4 聚类 K means 实现手写数字识别 2 实验数据是老师收集了所有人的手写数字图片 且经过处理将图
  • 使用checkpoint遇到的问题

    使用checkpoint时 警告使用checkpoint时 警告UserWarning None of the inputs have requires grad True 原因 使用checkpoint 不能放在第一个位置 或者说放在第一
  • 如何采用conda配置python虚拟环境

    文章目录 一 创建python虚拟环境 二 配置刚创建的虚拟环境 三 将虚拟环境配置到相应项目 一 创建python虚拟环境 首先选中要配置环境的文件 如下 在此处输入cmd按回车 此处我创建一个环境名为hands3dtext 环境版本为3
  • 机器人毕业设计题目推荐/康复机器人、(三、四、五、六度机器人)、焊接机器人、履带式搜救机器人、管道机器人、关节机器人、码垛机器人、焊接机器人、爬壁机器人、扫地机器人、喷涂机器人、搬运机器人……

    机器人毕业设计题目共有2000多套 部分列表如下 上肢康复机器人结构设计 全套 本科毕业设计 论文 CAD图纸 开题报告 任务书 三自由度机械手 工业机器人 说明书 CAD图纸 三自由度焊接机器人设计 毕业设计说明书 论文 12份CAD图纸
  • Windows下安装Qt5.12.8(1)

    一 下载 Qt5 12 8 Index of archive qt 5 12 5 12 8 下载其他版本将链接对应数字替换即可 windows下载 exe linux下载 run mac下载 dmg 二 安装 1 双击下载后的可执行程序 点
  • 虚拟机支持本地nvme ssd

    提起存储都是血泪史 不知道丢了多少数据 脑子首先想到的就是 你说啥 洗脑神曲 我就像那个大妈一样 千万个问号 hdd是啥 ssd又是啥 mbr是啥 gpt又是啥 primary partion是啥 logical partion又是啥 sa