nvme-cli用户工具
由于数据中心需要很多监控SSD健康度和耐用度,以及更新firmware,安全擦除数据,读取设备日志等管理功能, NVMe组织 <https://nvmexpress.org/>`_ 开发了Linux用户空间命令行工具 nvme-cli
,可以在Linux系统中管理NVM-Express设备。
备注
有关NVMe监控、管理和故障报告,请参考 SSD故障分析-NVMe SSD管理
安装
源代码编译安装
clone源代码是需要
libnvme
子模块,所以使用以下命令clone:git clone --recurse-submodules https://github.com/linux-nvme/nvme-cli
如果没有使用上述包含子模块方式clone但已经clone过源代码,则可以使用以下命令重新初始化并更新:
git submodule update --init
当然,上述命令也可以分为2个命令执行:
git submodule init
git submodule update
编译安装:
make make install
发行版安装
主要的Linux发行版都包含了 nvme-cli
,可以使用对应包管理器安装:
Debian/Ubuntu安装:
sudo apt install nvme-cli
使用
命令 |
说明 |
---|---|
nvme list |
列出系统所有NVMe SSD:设备名,序列号,型号,namespace,使用量,LBA格式,firmware版本 |
nvme id-ctrl |
NVMe控制器信息以及控制器支持功能 |
nvme id-ns |
查看 NVMe namespaces, 优化, 功能, 和支持 |
nvme format |
安全删除SSD上数据,格式化一个LBA大小或者为端到端数据保护信息 |
nvme sanitize |
安全擦除SSD所有用户数据 |
nvme smart-log |
输出NVMe SMART health status, temp, endurance, 以及更多的日志页面 |
nvme fw-log |
输出firmware 日志页面 |
nvme error-log |
输出 NVMe 错误日志页面 |
nvme reset |
重置NVMe controller / NVMe SSD |
nvme help |
帮助信息输出,另外,还支持特定厂商的插件扩展信息帮助,例如 nvme help intel 会输出intel厂商的特定扩展(需要安装对应设备?) |
nvme delete-ns |
删除一个namespace |
nvme create-ns |
创建一个新的namespace, 例如创建一个较小的namespace 来过度配置 SSD 以提高耐用性、性能和延迟 |
nvme fw-download |
将新固件下载到 NVMe 设备 |
nvme fw-commit |
提交 (激活) firmware 立即运行或者在reset之后运行 |
列出系统所有安装的NVMe SSD:
sudo nvme list
在我的 HPE ProLiant DL360 Gen9服务器 上通过 PCIe bifurcation 安装了3根 三星PM9A1 NVMe存储 :
Node SN Model Namespace Usage Format FW Rev
------------- --------------- --------------------------- --------- ---------------------- --------------- --------
/dev/nvme0n1 S676NF0R908202 SAMSUNG MZVL21T0HCLR-00B00 1 0.00 B / 1.02 TB 512 B + 0 B GXA7401Q
/dev/nvme1n1 S676NF0R908214 SAMSUNG MZVL21T0HCLR-00B00 1 0.00 B / 1.02 TB 512 B + 0 B GXA7401Q
/dev/nvme2n1 S676NF0R908144 SAMSUNG MZVL21T0HCLR-00B00 1 0.00 B / 1.02 TB 512 B + 0 B GXA7401Q
检查NVMe控制器以及支持的功能:
sudo nvme id-ctrl /dev/nvme0
输出类似:
1NVME Identify Controller:
2vid : 0x144d
3ssvid : 0x144d
4sn : S676NF0R908202
5mn : SAMSUNG MZVL21T0HCLR-00B00
6fr : GXA7401Q
7rab : 2
8ieee : 002538
9cmic : 0
10mdts : 7
11cntlid : 0x6
12ver : 0x10300
13rtd3r : 0x30d40
14rtd3e : 0x989680
15oaes : 0x200
16ctratt : 0x10
17rrls : 0
18crdt1 : 0
19crdt2 : 0
20crdt3 : 0
21oacs : 0x17
22acl : 7
23aerl : 3
24frmw : 0x16
25lpa : 0xe
26elpe : 63
27npss : 4
28avscc : 0x1
29apsta : 0x1
30wctemp : 354
31cctemp : 358
32mtfa : 0
33hmpre : 0
34hmmin : 0
35tnvmcap : 1024209543168
36unvmcap : 0
37rpmbs : 0
38edstt : 35
39dsto : 0
40fwug : 0
41kas : 0
42hctma : 0x1
43mntmt : 318
44mxtmt : 356
45sanicap : 0x2
46hmminds : 0
47hmmaxd : 0
48nsetidmax : 0
49anatt : 0
50anacap : 0
51anagrpmax : 0
52nanagrpid : 0
53sqes : 0x66
54cqes : 0x44
55maxcmd : 256
56nn : 1
57oncs : 0x57
58fuses : 0
59fna : 0
60vwc : 0x7
61awun : 1023
62awupf : 0
63nvscc : 1
64nwpc : 0
65acwu : 0
66sgls : 0
67mnan : 0
68subnqn : nqn.1994-11.com.samsung:nvme:PM9A1:M.2:S676NF0R908202
69ioccsz : 0
70iorcsz : 0
71icdoff : 0
72ctrattr : 0
73msdbd : 0
74ps 0 : mp:8.37W operational enlat:0 exlat:0 rrt:0 rrl:0
75 rwt:0 rwl:0 idle_power:- active_power:-
76ps 1 : mp:8.37W operational enlat:0 exlat:200 rrt:1 rrl:1
77 rwt:1 rwl:1 idle_power:- active_power:-
78ps 2 : mp:8.37W operational enlat:0 exlat:200 rrt:2 rrl:2
79 rwt:2 rwl:2 idle_power:- active_power:-
80ps 3 : mp:0.0500W non-operational enlat:2000 exlat:1200 rrt:3 rrl:3
81 rwt:3 rwl:3 idle_power:- active_power:-
82ps 4 : mp:0.0050W non-operational enlat:500 exlat:9500 rrt:4 rrl:4
83 rwt:4 rwl:4 idle_power:- active_power:-
重要: 检查NVMe SMART健康状态,温度等:
sudo nvme smart-log /dev/nvme0n1
输出:
1Smart Log for NVME device:nvme0n1 namespace-id:ffffffff
2critical_warning : 0
3temperature : 36 C
4available_spare : 100%
5available_spare_threshold : 10%
6percentage_used : 0%
7data_units_read : 58
8data_units_written : 0
9host_read_commands : 1,299
10host_write_commands : 0
11controller_busy_time : 0
12power_cycles : 13
13power_on_hours : 149
14unsafe_shutdowns : 10
15media_errors : 0
16num_err_log_entries : 0
17Warning Temperature Time : 0
18Critical Composite Temperature Time : 0
19Temperature Sensor 1 : 36 C
20Temperature Sensor 2 : 39 C
21Thermal Management T1 Trans Count : 0
22Thermal Management T2 Trans Count : 0
23Thermal Management T1 Total Time : 0
24Thermal Management T2 Total Time : 0
smart-log-add
输出信息中参数说明(不是所有设备都支持, smart-log
包含了部分参数):
参数 |
含义 |
说明 |
---|---|---|
Available Spare |
可用备用 |
包含可用剩余备用容量的标准化百分比(0 到 100%) |
Available Spare Threshold |
可用的备用阈值 |
当可用备用容量低于此字段中指示的阈值时,可能会发生异步事件完成。该值表示为标准化百分比(0 到 100%) |
Percentage Used |
使用百分比 |
根据实际使用情况和制造商对 NVM 寿命的预测,包含供应商对所用 NVM 子系统寿命百分比的具体估计。(注意:如果使用存储的时间超过其计划寿命,该数字可能会超过 100%。) |
Data Units Read/Data Units Written |
数据单元读取/数据单元写入 |
这是读/写的 512 字节数据单元的数量,但它以一种不寻常的方式测量。第一个值对应于 512 字节单元中的 1000 个。因此,可以将此值乘以 512000 以获得以字节为单位的值。它不包括元数据访问。 |
Host Read/Write Commands |
主机读/写命令 |
发出的适当类型的命令数。使用此值以及以下值,可以计算“物理”读取和写入的平均 IO 大小。 |
Controller Busy Time |
控制器忙碌时间 |
控制器忙于服务命令的时间(以分钟为单位)。这可用于衡量长期存储负载趋势。 |
Unsafe Shutdowns |
不安全的停机 |
在未发送关机通知的情况下发生断电的次数。根据使用的 NVMe 设备,不安全的关机可能会损坏用户数据。 |
Warning Temperature Time/Critical Temperature Time |
警告温度时间/临界温度时间 |
设备在警告或临界温度以上运行的时间(以分钟为单位)。它应该是零。 |
Wear_Leveling |
磨损级别 |
这显示了使用了多少额定电池寿命,以及不同电池的最小/最大/平均写入计数。在这种情况下,看起来单元的额定写入次数为 1800 次,平均使用了大约 1100 次 |
Timed Workload Media Wear |
定时工作负载介质磨损 |
媒体因当前的“工作量”而磨损。除了显示设备生命周期值外,该设备还允许从重置它们时测量一些统计数据(称为“工作负载”)。 |
Timed Workload Host Reads |
定时工作负载主机读取 |
已读取的 IO 操作的百分比(因为工作负载计时器已重置)。 |
Thermal Throttle Status |
热油门状态 |
这显示设备是否因过热而受到限制,以及过去何时发生限制事件。 |
Nand Bytes Written |
写入 Nand 字节 |
写入 NAND 单元的字节。对于此设备,测量单位似乎是 32MB 值。其他设备可能会有所不同。 |
Host Bytes Written |
主机字节写入 |
从系统写入 NVMe 存储的字节数。这个单位也是 32MB 的值。这些值的大小不是很重要,因为它们最有助于找到工作负载的写入放大。该比率以对 NAND 的写入和对 HOST 的写入来衡量。对于此示例,写入放大因子 (WAF) 为 16185227 / 6405605 = 2.53 |
安装
smartmontools
工具之后,使用smartctl
可以更为方便检查SMART信息:smartctl --all /dev/nvme0n1
输出:
smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-121-generic] (local build)
Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Number: SAMSUNG MZVL21T0HCLR-00B00
Serial Number: S676NF0R908202
Firmware Version: GXA7401Q
PCI Vendor/Subsystem ID: 0x144d
IEEE OUI Identifier: 0x002538
Total NVM Capacity: 1,024,209,543,168 [1.02 TB]
Unallocated NVM Capacity: 0
Controller ID: 6
Number of Namespaces: 1
Namespace 1 Size/Capacity: 1,024,209,543,168 [1.02 TB]
Namespace 1 Utilization: 530,768,371,712 [530 GB]
Namespace 1 Formatted LBA Size: 512
Namespace 1 IEEE EUI-64: 002538 b911b37f97
Local Time is: Wed Aug 31 12:01:28 2022 CST
Firmware Updates (0x16): 3 Slots, no Reset required
Optional Admin Commands (0x0017): Security Format Frmw_DL Self_Test
Optional NVM Commands (0x0057): Comp Wr_Unc DS_Mngmt Sav/Sel_Feat Timestmp
Maximum Data Transfer Size: 128 Pages
Warning Comp. Temp. Threshold: 81 Celsius
Critical Comp. Temp. Threshold: 85 Celsius
Supported Power States
St Op Max Active Idle RL RT WL WT Ent_Lat Ex_Lat
0 + 8.37W - - 0 0 0 0 0 0
1 + 8.37W - - 1 1 1 1 0 200
2 + 8.37W - - 2 2 2 2 0 200
3 - 0.0500W - - 3 3 3 3 2000 1200
4 - 0.0050W - - 4 4 4 4 500 9500
Supported LBA Sizes (NSID 0x1)
Id Fmt Data Metadt Rel_Perf
0 + 512 0 0
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART/Health Information (NVMe Log 0x02)
Critical Warning: 0x00
Temperature: 43 Celsius
Available Spare: 100%
Available Spare Threshold: 10%
Percentage Used: 4%
Data Units Read: 8,781,303 [4.49 TB]
Data Units Written: 16,708,935 [8.55 TB]
Host Read Commands: 210,063,865
Host Write Commands: 1,235,247,326
Controller Busy Time: 18,409
Power Cycles: 18
Power On Hours: 3,903
Unsafe Shutdowns: 11
Media and Data Integrity Errors: 0
Error Information Log Entries: 0
Warning Comp. Temperature Time: 0
Critical Comp. Temperature Time: 0
Temperature Sensor 1: 43 Celsius
Temperature Sensor 2: 56 Celsius
Error Information (NVMe Log 0x01, max 64 entries)
No Errors Logged
检查firmware 日志页面:
sudo nvme fw-log /dev/nvme0n1
输出:
1Firmware Log for device:nvme0n1
2afi : 0x1
3frs1 : 0x5131303437415847 (GXA7401Q)
输出NVMe错误日志页面:
sudo nvme error-log /dev/nvme0n1
输出部分案例:
1Error Log Entries for device:nvme0n1 entries:64
2.................
3 Entry[ 0]
4.................
5error_count : 0
6sqid : 0
7cmdid : 0
8status_field : 0(SUCCESS: The command completed successfully)
9parm_err_loc : 0
10lba : 0
11nsid : 0
12vs : 0
13cs : 0
14.................
15 Entry[ 1]
16.................
17error_count : 0
18sqid : 0
19cmdid : 0
20status_field : 0(SUCCESS: The command completed successfully)
21parm_err_loc : 0
22lba : 0
23nsid : 0
24vs : 0
25cs : 0
26...
(警告:我没有使用过)重置NVMe controller / NVMe SSD:
sudo nvme reset /dev/nvme0n1
NVMe Namespace解析
NVMe的namespace就是NVMe技术中用于存储用户数据的结构。一个NVMe可以具有多个namespace。不过大多数情况下,现在NVMe只使用一个namespace。但是,如果是多租户(multi-tenant)应用程序,虚拟化以及安全要求等业务场景,需要使用多名字空间(multiple namespaces)。
所谓namespace就是一组逻辑块,这些逻辑块地址范围从0到这个namespace的size; 名字空间ID (namespace ID, NSID)是控制器用来访问该名字空间的标识。
你会发现namespace的size和namespace的utilization(使用)对于生成LBA使用的比例非常有用。在标识namespace的命令输出的有用数据中能够用来优化主机软件的性能、数据一致性,TRIM(回收),LBA大小(例如512B,4kB)等等
检查NVMe的namesapce:
sudo nvme id-ns /dev/nvme0n1
输出:
1NVME Identify Namespace 1:
2nsze : 0x773bd2b0
3ncap : 0x773bd2b0
4nuse : 0
5nsfeat : 0
6nlbaf : 0
7flbas : 0
8mc : 0
9dpc : 0
10dps : 0
11nmic : 0
12rescap : 0
13fpi : 0x80
14dlfeat : 1
15nawun : 0
16nawupf : 0
17nacwu : 0
18nabsn : 0
19nabo : 0
20nabspf : 0
21noiob : 0
22nvmcap : 1024209543168
23nsattr : 0
24nvmsetid: 0
25anagrpid: 0
26endgid : 1
27nguid : 00000000000000000000000000000000
28eui64 : 002538b911b37f97
29lbaf 0 : ms:0 lbads:9 rp:0 (in use)
更新firmware
SSD厂商通常会在SSD的生产周期内多次发布firmware更新,不过一个SSD的5年生命期发布4~5次更新则很少见。firmware更新可以提供安全补丁,bug修复以及可靠性提高。OEM通常使用自己的管理工具来更新,比且会加密签名firmware以确保匹配其OEM产品,不过NVMe SSD可以从渠道分销获得通用firmware进行更新。请联系SSD供应商获取最新firmware。
请参考 NVMe 1.4 规范的 Firmware Update Process
部分,可以详细了解在哪里需要reset,firmware slot的概念(一些NVMe SSD有多个firmware副本存储在设备上,可以通过激活指定副本来运行,这样出现问题可以回退)
查看当前firmware版本:
sudo nvme id-ctrl /dev/nvme0 | grep "fr "
可以看到firmware版本:
fr : GXA7401Q
下载firmware到目标设备:
nvme fw-download /dev/nvme0 - nvme fw-commit /dev/nvme0 -a 0
这里 -a
参数:
0
表示将镜像替换掉Firmware slot
字段指定的镜像,这个镜像没有激活
1
将镜像替换掉Firmware slot
字段指定的镜像,这个镜像在下次reset时激活
2
通过Firmware slot
字段制定的镜像在下次reset时激活
3
立即激活Firmware slot
字段指定的镜像,无需reset
完成firmware下载之后,需要reset设备(如果这个设备不支持无需reset设备就激活镜像):
sudo nvme reset /dev/nvme0
警告
实际上firmware升级需要非常谨慎,我还没有机会实践,以上仅是一些资料整理,后续有机会再实践