天天看点

NVME CLI -- nvme 命令查看NVME设备内部状态

文章目录

  • ​​NVME 和 AHCI 性能比较​​
  • ​​NVME-CLI nvme工具使用​​
  • ​​1. 安装​​
  • ​​2. 命令综述​​
  • ​​3. 基本命令演示​​
  • ​​4. NVME 固件设备升级​​

近期在做一些rocksdb on 新硬件的性能测试(flash ssd, nvme ssd , nvme optane ssd, optane persistent memory),由于底层一些设备的实现对我来说还是知识盲区,一些设备IO表现出来的行为完全是黑盒,让人琢磨不透。

因此利用周末时间对基础的AHCI + SATA 调度的传统ssd 和 基于 NVME 协议调度的ssd 做了一个入门了解。

细粒度的参考可以直接读官方文档:​​​NVME-doc​​

NVME 和 AHCI 性能比较

NAND 闪存是传统ssd的存储介质。早期的ssd通过上层的AHCI(advanced host controller interface) + SATA协议进行操作系统的块设备驱动层到底层物理设备的IO调度,但是这样的组合AHCI + SATA 是为了传统的HDD机械硬盘设计的,在如今ssd内部核心技术的快速发展中已经无法发挥出底层SSD的低延时和高性能的优势。为了发挥SSD高性能,固件厂商为SSD量身打造了一个协议标准NVME( Non-Volatile Memeory Express),且这个标准不仅可以应用在NAND的存储介质上,也能够应用在高性能和低延时的3D XPoint 新型介质上。

整体的NVME 协议架构如下,总共分为四层,到最底层就是 nvme的subsystem:

NVME CLI -- nvme 命令查看NVME设备内部状态

nvme的subsystem

NVME CLI -- nvme 命令查看NVME设备内部状态

NVME和AHCI 相比的优势主要是以下三个方面:

  1. 低延时(Latency)

    传统的HDD+sas/sata 随机读延时大概在ms量级

    NAND ssd + sas/sata 随机读延时在110us 左右

    基于NVME的NAND ssd 随机读延时在85us 左右,相比于sata的nand ssd 延时降低了20 us

    当然3D XPoint + nvme 这样的新型存储介质 延时只有10us左右(intel Optane p4800),这样的硬件红利带来的效果还是很给力的。

    以上的延时都会体现在上层的应用之中,尤其是新型存储介质搭配nvme协议 体现出的低延时 对上层应用的正向反馈还是十分给力的。而且intel 近期仍然会推出更为给力的p5800(iops 和带宽 相比于p4800 提升一倍以上,latency会降低40%-50%)。

    实现上来看,对硬盘存储延时有影响的如下几种:

  • 存储介质层面,闪存比传统的机械硬盘快很多。(NAND是通过 基于 MOS场效应的浮栅晶体管 实现的底层0,1bit位的互换, 而 机械硬盘则是电信号 磁信号之间的转化,还夹杂着主流程上大量的机械运动。一个是纯化学反应,一个是机械运动为主体,两者性能当然千差万别)
  • 控制器方面,sata ssd需要通过南侨控制器中转,再连接到CPU;而NVME的 pcie ssd主控可以和CPU直连。所以时延方面,PCIE ssd 更低。
  • 软件接口方面:NVME 缩短了CPU 到ssd的指令路径,比如NVME减少了对寄存器的访问次数,使用了MSI-X中断管理;并行&多线程优化 – NVME减少了各个CPU核之间的锁同步操作。
  1. 高性能

    理论上,IOPS= 队列深度/IO延迟,所有IOPS的性能和队列深度有很大的关系(但并不是正比,实际应用中,随着队列深度的增加,IO延时也会增加)。

    SATA ssd 市面上能做到最好的IO深度是32,但目前企业级的PCIE ssd 队列深度能够达到128 甚至256才能发挥出其底层ssd的最高性能。 而在NVME标准下,最大的队列深深度能够达到64K。

  2. 低功耗

    NVME加入了自动功耗状态切换 和 动态能耗管理功能。

NVME-CLI nvme工具使用

所以总上来看NVME 是现在新型存储的标准,所以我们做存储的应该上通应用,下晓FM,且与时俱进。

而且NVME 社区也维护了一套完整的工具来协助我们加深对NVME的理解​​​NVME-CLI​​

关于NVME以及 NAND闪存的原理其实理解的非常浅薄,后续会持续补充。接下来回到本节的主题,将NVME的基本工具使用做一个整体的记录。

1. 安装

  • on ubuntu :
https://github.com/linux-nvme/nvme-cli      
  • on Centos/RHEL 7.x or 8x
https://github.com/linux-nvme/nvme-cli      

2. 命令综述

注意,以下命令需要在root用户下运行,并不是所有的自命令,只是一些比较常用的命令。

建议在测试硬盘上使用,且明确命令的含义,以下的部分命令会删除数据。

Command Description
nvme list 查看所有连接到当前系统的nvme设备:名称,序列号,大小,LBA 和 serial
nvme id-ctrl 展示nvme 控制器和它所支持的一些特性
nvme id-ns 展示nvme 的命名空间,优化特性和支持特性
nvme format 安全擦除SSD上的数据,格式化LBA大小或保护信息以实现端到端数据保护
nvme sanitize 安全得擦除SSD上的所有数据
nvme smart-log 查看NVME的smart log信息:page的健康状态,温度,稳定性情况等
nvme fw-log 查看NVME的固件日志,会打印每个entry的健康情况
nvme error-log NVME的异常日志
nvme reset 重置NVME的控制器
nvme help 查看帮助信息
nvme delete-ns 指定设备删除一个命名空间
nvme create-ns 指定设备创建命名空间。比如可以为一个设备创建一个较小大小的命名空间,从而提升SSD的稳定性,性能和延时?(具体原理还不太清楚)
nvme fw-download 为一个设备下载一个新的固件系统
nvme fw-commit 让固件立即运行

如下使用

nvme help      

能够看到大量的命令集

NVME CLI -- nvme 命令查看NVME设备内部状态

3. 基本命令演示

一些命令需要指定设备运行,这里建议指定字符设备,即/dev/nvme0 这样的,因为字符设备文件获取到的数据是直接从底层存储中取出来的;如果指定/dev/nvme0n1这样的块设备,数据读取会走操作系统buffer cache,可能有一些数据更新不及时。
  1. ​nvme id-ctrl /dev/nvme0​

    ​ 查看nvme controller 支持的一些特性
NVME Identify Controller:
vid       : 0x1c5f # PCIe vendor id
ssvid     : 0x1c5f
sn        : FL172100442 # serial number
mn        : Z45C7032C22
fr        : 2090500 # firm version 固件版本号
rab       : 1
ieee      : 00e0cf
cmic      : 0
mdts      : 5
cntlid    : 0
ver       : 0
rtd3r     : 0
rtd3e     : 0
oaes      : 0
...
...      
  1. ​nvme list​

    ​ 查看当前环境的 nvme设备
  2. NVME CLI -- nvme 命令查看NVME设备内部状态
  3. ​nvme id-ns /dev/nvme0​

    ​​ 查看nvme的namespace,这个能够非常方便得看到nvme内部的LBA(逻辑地址和物理地址的映射表)使用情况等非常有用的信息。

    如果出现如下错误:

# nvme id-ns /dev/nvme0
Error: requesting namespace-id from non-block device
NVMe Status:INVALID_NS: The namespace or the format of that namespace is invalid(b) NSID:0      

这里就需要指定namespace的id了,通过

​​

​nvme list-ns /dev/nvme0​

​ 查看当前设备的name space

# nvme list-ns /dev/nvme0
[   0]:0x1      

然后再执行​

​nvme id-ns --namespace-id=0x1 /dev/nvme0​

​ 即可看到如下信息

NVME CLI -- nvme 命令查看NVME设备内部状态

使用-H 命令能够提升输出结果的可读性

NVME CLI -- nvme 命令查看NVME设备内部状态
  1. ​nvme smart-log /dev/nvme0​

    ​​ 查看设备smart log信息
  2. ​nvme error-log /dev/nvme0​

    ​​ 查看设备error 信息

4. NVME 固件设备升级

ssd 供应商会跟随ssd的研发周期性更新固件,跟进固件的更新能够保证一些关于bug-fix, 稳定性提升的补丁包及时得到更新。当然,固件升级的频率也不会很高,一般一年不会超过5次。升级前可以和供应商核对固件升级的版本信息。

确认固件版本:

nvme id-ctrl /dev/nvme0 |grep "fr "      

下载固件并应用起来

nvme fw-download /dev/nvme0 -
nvme fw-commit /dev/nvme0 -a 0      

这里注意下commit 过程中​

​-a​

​指定的action 模式有种,表示不同的含义

  • 0 : 下载的固件镜像替换原有的固件镜像,但并不会激活。即不会让这个镜像运行起来
  • 1:下载的固件镜像替换原有的固件镜像,会在NVME reset之后运行起来。(发生了热插拔,断电,上电也会运行)
  • 2:由固件插槽指定的镜像会在下次重置之后激活
  • 3: 获取到的固件镜像会被立即激活而不需要重置

下载好的固件,加入需要重置的话可以执行如下命令:

nvme reset /dev/nvme0