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的subsystem
 
NVME和AHCI 相比的優勢主要是以下三個方面:
-  低延時(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核之間的鎖同步操作。 
 
-  
-  高性能 
 理論上,IOPS= 隊列深度/IO延遲,所有IOPS的性能和隊列深度有很大的關系(但并不是正比,實際應用中,隨著隊列深度的增加,IO延時也會增加)。
 SATA ssd 市面上能做到最好的IO深度是32,但目前企業級的PCIE ssd 隊列深度能夠達到128 甚至256才能發揮出其底層ssd的最高性能。 而在NVME標準下,最大的隊列深深度能夠達到64K。
-  低功耗 
 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 8xhttps://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
能夠看到大量的命令集
 
3. 基本命令演示
一些命令需要指定設備運行,這里建議指定字符設備,即/dev/nvme0 這樣的,因為字符設備文件獲取到的數據是直接從底層存儲中取出來的;如果指定/dev/nvme0n1這樣的塊設備,數據讀取會走操作系統buffer cache,可能有一些數據更新不及時。
-  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 ... ...
-  nvme list查看當前環境的 nvme設備
 
-  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即可看到如下信息
 
 使用-H 命令能夠提升輸出結果的可讀性
 
-  nvme smart-log /dev/nvme0查看設備smart log信息
 
-  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
本身并不是NVME的研發人員,使用的話其實只需要獲取一些基本的設備狀態信息就可以了,后續工作中如果需要知道更加詳細的NVME 設備內部狀態信息,會再做一些更加細致的整理。
不過關于基礎的NAND,3D-XPoint, NVME 等實現還是需要持續探索,未來的存儲系統一定會結合新硬件來做,這樣才會有更加極致的性能。
總結
以上是生活随笔為你收集整理的NVME CLI -- nvme 命令查看NVME设备内部状态的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Go 语言实现字符串匹配算法 -- BF
- 下一篇: 上海欢乐谷万圣节鬼屋快速通道有必要吗
