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 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
能够看到大量的命令集
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 等实现还是需要持续探索,未来的存储系统一定会结合新硬件来做,这样才会有更加极致的性能。
相关文章:

Java项目:网上水果蔬菜项目系统设计和实现(java+springboot+mysql+ssm)
源码获取:博客首页 "资源" 里下载! 主主要技术:java springmvc springboot mybatis mysql jquery layui 等技术要模块设计如下: 用户角色的功能: 登录、注册、浏览商品、修改个人信息(上传…

POJ 1189 记忆化搜索
钉子和小球Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 7218 Accepted: 2164Description 有一个三角形木板,竖直立放,上面钉着n(n1)/2颗钉子,还有(n1)个格子(当n5时如图1)。每颗钉子和周围的钉子的距离都等于d&am…

Android短信管家视频播放器代码备份
自己保留备份,增强记忆 这是video的类 public class VideoActivity extends Activity {/*** 解析网络页面*/private WebView wv;/*** 进度条类*/private ProgressDialog pd;/*** 异步处理消息*/private Handler handler;private static final int SHOW 0;private s…

Python常用函数--文档字符串DocStrings
Python 有一个甚是优美的功能称作python文档字符串(Documentation Strings),在称呼它时通常会使用另一个短一些的名字docstrings。DocStrings 是一款你应当使用的重要工具,它能够帮助你更好地记录程序并让其更加易于理解。令人惊叹…

Go 分布式学习利器(17)-- Go并发编程之协程机制:Grountine 原理及使用
文章目录1. Thread VS Groutine2. Groutine 调度原理3. Groutine 示例代码关于Go的底层实现还需要后续持续研究,文中如有一些原理描述有误,欢迎指证。 1. Thread VS Groutine 这里主要介绍一下Go的并发协程相比于传统的线程 的不同点: 创建…

Java项目:美食菜谱分享平台系统设计和实现(java+springboot+mysql+ssm)
源码获取:博客首页 "资源" 里下载! 主要技术实现:spring、 springmvc、 springboot、mybatis 、session、 jquery 、 md5 、bootstarp.js tomcat、拦截器等。 具体主要功能模块如下: 1.用户模块管理:用户…

【leetcode】Roman to Integer
题目描述: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 解题思路: 首先我们要了解罗马数字怎么写的 个位数举例 I, 1 】II, 2】 III, 3】 IV, 4 】V, 5 】VI, 6】 VII, 7】 VIII,8 】…

Apache Traffic Server管理工具
Traffic Line是命令行程序,可以用来快速监视 Traffic Server 的性能和网络流量,也能配置 TS。Traffic Shell也是命令行工具,进入该 shell 后有自己一套语法,可代替 Traffic Line 完成监控、配置任务。通过 Traffic Line 和 Traffi…

npm使用记录
npm是一个 包管理工具。安装node之后就可以使用npm命令了,为了方便使用,通常我们还要装下 淘宝NPM镜像,之后就可以用cnpm命令了。 注意:以下提到的如-g --save等标签都可以放在 包名前面。 首先一个前端项目下载下来,需…

Go 分布式学习利器(18)-- Go并发编程之lock+WaitGroup实现线程安全
Go语言中通过Groutine 启动一个Go协程,不同协程之间是并发执行的,就像C/Java中线程之间线程安全是一个常见的问题。 如下Go 语言代码: func TestConcurrent(t *testing.T) {var counter int 0for i : 0;i < 5000; i {go func() { // 启动groutine 进…

Java项目:网上家具商城平台设计和实现(java+springboot+mysql+ssm)
源码获取:博客首页 "资源" 里下载! 主要技术:springmvc springboot mybatis mysql jquery layui 等技术 具体功能模块: (1) 用户注册和登录登录功能: ①用户的注册功能 : 访问网站的人根据网站的提示注册…

Linux socket TIME_WAIT 优化
如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,vim /etc/sysctl.conf编辑文件,加入以下内容:net.ipv4.tcp_syncookies 1net.ipv4.tcp_tw_reuse 1net.ipv4.tcp_tw_recycle 1net.ipv4.tcp_fin_timeout 30然后执行…

Android Handler的使用!!!
大家好我们这一节讲的是Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title.首先我们看一下习惯了Java编程的人,在不知道Handler的用法之前是怎么样写的程序,代码如下所示:view plaincopy to clipboa…

git之reset图解
https://blog.csdn.net/longintchar/article/details/81843048 1、三棵树。 此时如果我们运行 git status,会发现没有任何改动,因为现在三棵树完全相同。 修改文件 现在我们想要对文件进行修改然后提交它。我们将会经历同样的过程;首先在工作…

Go 分布式学习利器(19)-- Go并发编程 之 CSP(communicating sequential processes) 机制
文章目录前言CSP 特点CSP代码 演示1. 正常流程的代码2. CSP 未设置buffer 代码3. 设置指定大小的channel buffer总结前言 CSP 这个名词大家会比较陌生,但是说到future 熟悉C / JAVA 线程模型的伙伴可能就会很熟悉了, 通过future机制能够实现两个线程之间…

Java项目:学生学科竞赛管理管理系统设计和实现(java+springboot+ssm+maven)
源码获取:博客首页 "资源" 里下载! 主要技术、spring、 springmvc、 springboot、 mybatis 、 jquery 、 layUI、md5 、bootstarp.js tomcat、、拦截器等项目 主要功能:登录、用户、菜单管理、角色管理、权限管理、立项申请、报名、结、经费…

update 改写 merge into
update语句改写成merge into有时会提高运行速度 看两个案例 1.根据业务将两个嵌套子查询改写成max,速度有3min提升到3s UPDATE OPER_792.LL_SCB_YDKB_20120730 A SET A.DCP (SELECT B.PROD_OFFER_NAME FROM OPER_792.YD_TC B WHERE A.SERV_ID B.SERV_ID AND B.TC_…

CCControlSwitch 、CCControlSlider、CCControlButton
/**bool hasMoved(); 这里获取的不是开关是否正在被用户拨动,而是开关最终的状态是由用户手动拨动开关进行的,*还是用户点击开关进行的状态更改*/CCControlSwitch* pSwitch CCControlSwitch::create(CCSprite::create("switch-mask.png"),CCS…

bzoj2961 共点圆 (CDQ分治, 凸包)
/* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面然后cdq分治就可以了代码基本是抄的,*/#include<cstdio> #include<algorithm> #include<c…

Rocksdb Iterator实现:从DBIter 到 TwoLevelIter 的漫长链路
文章目录1. 迭代器简单介绍2. 迭代器用户态相关接口3. 迭代器内部架构4. 迭代器的入口实现4.1 DBIter4.2 MergingIterator4.3 Memtable系列Iterator4.4 LevelIterator 和 TwoLevelIteratorps:本文的基础迭代器设计 以及 相关代码 是基于rocksdb 6.4.6版本进行描述的…

Java项目:OA办公自动化系统设计和实现(java+springboot+freemarker+mysql+maven+mybatis+jpa)
源码获取:博客首页 "资源" 里下载! java springbootOA办公自动化系统: 主要功能模块:系统、用户、角色、考勤、流程、公告、邮件、任务、日程、计划、文件、笔记、通讯录、讨论区等多个模块管理 使用Maven进行项目管理…

UIScrollView上面放一个UIScrollView或者UITableView拖动时候 View出现一闪一闪解决办法...
在项目中发现一个问题: 创建一个UIScrollView 上面放一个scrollView或者TableView,拖动scrollview或TableView 画面出现一闪一闪的情况。 解决办法设置一下UIScrollView的contentSize 如果你是上下滑动scrollView.contentSize CGSizeMake(0, self.view.…

理解koa-router 路由一般使用
阅读目录 一:理解koa-router一般的路由二:理解koa-router命名路由三:理解koa-router多个中间件使用四:理解koa-router嵌套路由五:分割路由文件回到顶部一:理解koa-router一般的路由 koa-router是koa的路由库…

Go 分布式学习利器(20)-- Go并发编程之多路选择和超时控制,channel的关闭和广播
Select 多路选择 基本使用语法如下: select { case ret : <-retCh1: //阻塞事件,等待channel1的消息t.Logf("result %s \n",ret) case ret : <-retCh2:t.Logf("result %s \n", rest) default :t.Error("return empty&q…

Java项目:网盘系统设计和实现(java+ssm+jpa)
源码获取:博客首页 "资源" 里下载! 很多同学都有自己的网盘,方便存储一些java学习教程。该毕业设计实现了一个简易的网盘,包含文件上传和文件分享等功能。 后端技术采用了spring,spring mvc,JPA&…

快速学习的方法论
大多数人认为学习的快慢取决于学习者的天赋,实际上研究表明学习方法起着至关重要的作用。更深层次的知识加工,与时而反复的温故知新,在某些情况下会加倍你的学习效率。最近学习了如何快速学习的方法论,分享给大家。 是否能加速理解…

C#拉姆达(=)表达式
前言: 之前小猪曾经分享过自己对C#委托的一点理解 其实在使用委托的过程中我们会大量的使用拉姆达(>)表达式 介绍: "Lambda表达式"是一个匿名函数,是一种高效的类似于函数式编程的表达式,Lambda简化了开发中需要编写…
Python爬虫入门教程 57-100 python爬虫高级技术之验证码篇3-滑动验证码识别技术
滑动验证码介绍 本篇博客涉及到的验证码为滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成。 这类验证码不常见了,官方介绍地址为:https://promotion.aliyun.com/ntms/act/captchaI…

FlameScope 更高级全面的火焰图
FlameScope 更高级全面的火焰图 文章目录FlameScope 更高级全面的火焰图安装步骤安装问题fix使用方式网飞(Netflix)开发的火焰图工具能够更好得呈现出一段时间内的服务器on/off cpu 的热力图。安装步骤 $ git clone https://github.com/Netflix/flamescope $ cd flamescope $ …

sql 基础--mysql 5 (6)
12.子查询 子查询进行过滤 mysql> select msg from pw_luck where name wang5-> ; ------ | msg | ------ | 1001 | | 1000 | | 1000 | | 100 | | 100 | ------ 5 rows in set (0.03 sec)mysql> select uid from pw_luck where msg in (select msg from pw_luck w…