虚拟机支持本地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 的相关文章

随机推荐

  • 原型模式

    原型模式 根据实际案例分析原型模式的优点 浅克隆 代码示例 测试分析 深克隆 代码示例 测试 分析原型模式的优点 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