————————————

作者简介

刘孝冬 Intel 高级软件工程师

专注于开源存储SPDK及ISA-L软件的开发。

————————————

随着数据中心规模的不断扩大与延展,硬件设备的运行维护已经成为信息技术企业与部门普遍重视的一环。随之而来的,是极为庞大的IT运维工作量。实现硬件设备的可维护,就需要灵活高效的监控与管理工具。

第一节

NVMe 设备工具

Linux中,有诸多的监控与管理工具来助力设备运维,如hdparm,ethtool, SmartCTL等;当然也有很多简单易用的系统工具,如lspci, lsblk, iostat。对于目前部署量越来越大的NVMe设备,最通用有效的工具莫过于Nvme-cli。

通过Nvme-cli, 使用者可以获取NVMe设备记录的各种LOG;可以查询当前设备状态;获取设备本身以及内部Namespace的配置信息;设置设备的各项功能;以及对设备做重启与格式化。

Nvme-cli在监控管理NVMe设备的主要过程,既是组织相关命令信息,通过对NVMe设备文件(/dev/nvmeX,/dev/nvmeXnY)发起IOCTL系统调用,将命令传入内核继而发送请求到NVMe设备上;待NVMe设备响应命令请求,发回响应后,再提取有效响应信息出来。所以Nvme-cli 众多命令的普遍格式是:

nvme []

第二节

SPDK Nvme-cli

SPDK是一组用于编写高性能,可扩展的用户模式存储应用程序的工具和库。它的基础是处在用户空间,轮询模式、异步、无锁的NVMe驱动程序。这为从用户空间应用程序直接访问NvmeSSD提供了零拷贝,高度并行的访问。在此基础上,SPDK还提供了完整的块堆栈作为用户空间库,该库能够执行与操作系统中块存储软件栈相同的许多操作。以及最上层的NVMe-oF,iSCSI和Vhost-user应用服务。

伴随着SPDK日益广泛的应用,NVMe设备的监控管理也成为了一个必要的需求。即处在用户空间应用程序的NVMe设备,如何能被用户监控管理。尤其是要便捷容易通用,那就要求Linux下常用的工具也能被SPDK所支持,尤其是Nvme-cli。

之前,SPDK 社区在Nvme-cli源码基础上,加入对特定于SPDK下NVMe设备的修改(http://github.com/spdk/nvme-cli),使得Nvme-cli用在该类设备上。但该实现方式如同在Nvme-cli进程内启动了一个SPDK实例(如图1所示),难以被合并到Nvme-cli的主分支上。

图1

用户自己编译与使用的过程略显繁琐(https://spdk.io/doc/nvme-cli.html):

  • 在编译过程中,需要将SPDK源码clone到nvme-cli下,并将相应SPDK库链接包含进nvme-cli的可执行文件中。

  • 根据使用情景的不同,需要创建并修改一个spdk.conf文件,并指定到nvme-cli命令行的参数中。

第三节

SPDK NVMe 字符设备

由于类似SPDK 版的Nvme-cli使用上的诸多不便,社区在寻找更佳的实现方式,来支持Linux上相关工具。

在SPDK v19.10 Release (https://spdk.io/release/2019/10/31/19.10_release/)中增加的一个新功能叫做NVMe 字符设备 (NVMe character device)。它基于CUSE实现,可以在Linux内核中为NvmeController和Nvme Namespace创建对应字符设备节点(即 /dev/spdk/nvmeX,/dev/spdk/nvmeXnY)。Nvme-cli 之类的工具可以无修改,直接使用这些模拟出的字符设备来监控管理SPDK下的NVMe设备。

由于此功能目前被认为是实验性的功能,所以需要在configure的时候,显式指定使能nvme-cuse,即在编译SPDKNVMe 驱动时,加入基于CUSE字符设备的支持。

SPDK 为NVMe 字符设备功能加入了两个RPC命令bdev_nvme_cuse_register与bdev_nvme_cuse_unregister。它们分别用于指定为某NVMe设备创建CUSE字符设备,和注销CUSE字符设备。当使用bdev_nvme_cuse_registerRPC命令后,SPDK会通过CUSE在路径/dev/spdk下,为NVMecontroller 创建 /dev/spdk/nvmeX, 并为其下Namespace创建/dev/spdk/nvmeXnY,如图2。

图2

第四节

Nvme-cli & SPDK NVMe 字符设备的使用

  • 首先,需要确认使用的SPDK版本至少为v19.10。编译前,指定使能nvme-cuse功能。

./configure --with-nvme-cuse&& make

  • 为SPDK分配内存资源和绑定NVMe设备。

./scripts/setup.sh

  • 准备包含NVMe设备的conf文件,并运行一个SPDK应用

./scripts/gen_nvme.sh >spdk.conf && ./test/app/bdev_svc/bdev_svc -c spdk.conf &

  • 使用SPDK nvme-cuse RPC命令为NVMe创建字符设备

./scripts/rpc.pybdev_nvme_cuse_register -n Nvme0

之后,可见路径/dev/spdk下出现SPDK 创建的NVMe字符设备:

  • nvme-cli使用指定的SPDK NVMe 字符设备。目前,大多数的nvme-cli命令可以通过这种方式执行。

nvme /dev/spdk/nvme0 []

第五节

SPDK NVMe CUSE 的局限性

SPDK社区期望能够无缝的将当前流行的监控管理工具应用在SPDK下的NVMe设备上。当前实现的SPDKNVMe 字符设备朝着这个目标迈进了一大步---- 诸多采用对NVMe字符设备路径文件发起IOCTL调用的工具和命令可以直接运行操作。

但它的依旧存在诸多局限性:

· 通过CUSE创建的NVMeNamespace路径文件属性是字符设备。但从常理上,其文件属性应该为块设备,例如Linux内核驱动创建的NVMeNamespace路径文件属性是块设备。虽然与IO命令不同,监控与管理操作不需要区分设备类型,但是在Nvme-cli中如果操作设备指定的是NVMeNamespace文件,代码是存在多处诸如S_ISBLK这样的设备类型检查。

以下两图分别是SPDK 通过CUSE创建的NVMe设备文件,和内核驱动创建的NVMe设备文件,对比可见NVMeNamespace路径文件属性的不同。

· /proc/diskstats 信息的缺失。诸多性能监控工具采用定期查看/proc/diskstats文件来获取存储设备的IO流量和负载情况。SPDK目前还未实现一个通用的信息注入方法,来将SPDK块设备或NVMe设备的相关信息实时写入/proc/diskstats。

SPDK当前的获取设备IO流量和负载信息的方法,是通过SPDKRPC 方法bdev_get_iostat。

· /sys/block/目录下相关文件的缺失。部分工具,如lsblk,是需要通过筛选读取/sys/block/目录下设备文件,来获取相关信息;对/sys/block/目录下设备相关的某些文件,写入内容,来操作设备。SPDK目前也没有实现简洁有效的方法,模拟导出自己的/sys/block/文件。

加我微信进技术交流群 转载须知

DPDK与SPDK开源社区公众号文章转载声明

推荐阅读

试试SPDK的trace

NVMe 安全升级 —— SPDK 引入NVMe Opal bdev 支持

SPDK NVMe-oF TCP transport 目前优化的一些工作和方向

nvme驱动_用户态NVMe运维利器 SPDK NVMe 字符设备相关推荐

  1. 第五届双态IT乌镇用户大会-智能运维算法研讨会圆满落幕

    第五届双态IT乌镇用户大会-智能运维算法研讨会圆满落幕 **2022年9月18日上午,第五届双态IT乌镇用户大会"智能运维算法研讨会"顺利举行,必示科技携手国泰君安共同举办.**来 ...

  2. 运维利器:万能的 strace

    第一章 运维利器:万能的 strace 高效运维 | 2016-05-24 20:10 个人简介: 王子勇,腾讯高级业务运维工程师,有8年研发与运维工作经验.崇尚开源,喜欢钻研系统技术,曾给rsysl ...

  3. 运维利器万能的 strace

    转载至运维利器万能的 strace | 运维生存时间 原文地址http://www.ttlsa.com/linux-command/winner-versatile-strace/ strace是什么 ...

  4. 运维利器-ClusterShell集群管理操作记录

    在运维实战中,如果有若干台数据库服务器,想对这些服务器进行同等动作,比如查看它们当前的即时负载情况,查看它们的主机名,分发文件等等,这个时候该怎么办?一个个登陆服务器去操作,太傻帽了!写个shell去 ...

  5. DevOps实战 —— 如何高效地远程部署?自动化运维利器 Fabric 教程

    如何高效地远程部署?自动化运维利器 Fabric 教程 关于 Python 自动化的话题,在上一篇文章中,我介绍了 Invoke 库,它是 Fabric 的最重要组件之一.Fabric 也是一个被广泛 ...

  6. 32 | KafkaAdminClient:Kafka的运维利器

    文章目录 管理与监控 32 | KafkaAdminClient:Kafka的运维利器 引入原因 如何使用? 工作原理 构造和销毁 AdminClient 实例 常见的 AdminClient 应用实 ...

  7. 云计算时代,企业IT资产安全运维利器——行云管家堡垒机

    为了保障网络和数据不受来自外部和内部用户的入侵和破坏,企业通常通过部署堡垒机来管理企业内部IT资产.但随着云计算逐渐发展成为企业IT架构的基础设施,传统堡垒机很难适应云的变化,已经无法对企业IT资产进 ...

  8. nvme驱动_耗时3天2夜,搞定了macbook pro(2015款)更换nvme固态,经验分享一下,希望能帮到有需要的人!...

    捣鼓原因:macbook 进水,烧了主板,电池,还有固态! 提醒一下,固态坏了,本子会一直灰屏,什么都没提示!(就是有背景灯,什么都没显示)按op键,恢复模式都没反应!没办法,只能更换固态,上网查了下 ...

  9. mysql 自动化运维工具_部署MySQL自动化运维工具inception+archer

    *************************************************************************** 部署MySQL自动化运维工具inception+ ...

最新文章

  1. keras bi-lstm_LSTM用于文本生成的应用介绍-使用Keras和启用GPU的Kaggle Kernels
  2. 激光雷达选型指南 这2项重要指标却被很多人忽略
  3. Sqoop_ 简单介绍
  4. BZOJ4921「Lydsy1706月赛」互质序列
  5. 046_CSS3动画
  6. Elasticsearch之基本操作
  7. 新闻发布项目——接口类(BaseDao)
  8. 基站数据库 mysql_基站位置数据库V2说明文档
  9. 萌宠NFT将于4月16日正式上线
  10. server 2012 IIS 启用.NET 4.5
  11. 将android界面背景设置为黑色
  12. Windows 8 页面应用测试(1)
  13. 全国31个省市2001-2017年平均受教育年限学习数据集
  14. JAVA制作QQ空间点赞_利用Javascript实现QQ空间自动点赞
  15. postman:Tests模块之断言
  16. Matlab中clc;clear;clear all;clf;close;close all作用
  17. 动态代理ip的测试步骤有哪些?
  18. 2021-2027全球及中国G Suite销售软件行业研究及十四五规划分析报告
  19. Word中所有公式转为特定文本
  20. 在网页中点击链接就可以和在线好友QQ聊天

热门文章

  1. 轻量云腾讯云服务器如何退款,腾讯云服务器等产品可以退款多少次?
  2. 2021年甘肃省高考成绩一分一段表查询,2021年甘肃高考一分一段表公布查询时间 什么时候出...
  3. python执行Linux系统命令
  4. 浪潮服务器开启远程管理,浪潮服务器远程管理
  5. rtc校准算法_webrtc aecd算法解析一(原理分析)
  6. CAS客户端认证流程
  7. Java知识系统回顾整理01基础04操作符02关系操作符
  8. select自定义下拉选择图标
  9. (转载) Android两个子线程之间通信
  10. C# semaphore的使用