[转帖]焱融全闪系列科普| 为什么 SSD 需要 NVMe?
https://xie.infoq.cn/article/7026237b455c7d62f33afc4a9
NVMe 的由来
目前机械硬盘大多数使用 SATA (Serial ATA Advanced Host Controller Interface) 接口,接口协议为 AHCI,是 Intel 联合多家公司研发的系统接口标准。AHCI 最大队列深度为 32,即主机最多可以发 32 条命令给 HDD 或 SSD 执行,在 HDD 时代整个性能瓶颈在硬盘端,而不是接口和协议端,所以 AHCI 可以很好的匹配 HDD。但随着 SSD 硬盘技术的不断演进,使得底层闪存带宽越来越高,介质访问延迟越来越低,系统瓶颈已经由下转移到了上面的接口和协议端。这时你会发现 SATA 接口的 SSD 性能都不会超过 600MB/s,你会认为是底层闪存带宽不够,但其实是 SATA 接口速度限制了带宽。因为 SATA 3.0 最高带宽就是 600MB/s。此时,AHCI 和 SATA 已经不再满足高性能和低延迟的 SSD 的需求了,如果要充分释放 SSD 性能,那么就要设计新的协议和接口了。

在这样的背景下,2009 年下半年,Intel 、镁光、三星等厂商,一同制定了专门为 SSD 服务的 NVMe 协议,来取代 AHCI,从此 NVMe 应运而生。
NVMe 即 Non-Volatile Memory Express,是非易失性存储器标准,是在 PCIe 接口之上的协议标准,在协议栈中隶属高层。如下图所示:

NVMe 针对 PCIe SSD 特点而设计,相比传统 AHCI 标准,NVMe 标准可以带来多方面的性能提升,可以说 NVMe 就是为了 SSD 而生的。
刚才我们提到了 AHCI、SATA、NVMe、PCIe,接下来,我们通过一张层次图来理解他们之间的关系和职责。

NVMe 的特点和优势
上面我们提到了 NVMe 是一种 Host 与 SSD 之间通信的协议,在整个协议栈中处于应用层的位置。NVMe 相当于指挥官发送命令至下层去执行,即 PCIe,它所制定的任何命令,都由 PCIe 去完成。虽然 AHCI 也可以和 PCI 搭档,但 AHCI 只有一个命令队列,最多同时只能发 32 条命令,根本驾驭不了 PCIe。而 NVMe 主要是面向 PCIe SSD 开发的一套接口标准,定义了系统接口和命令集,其目的就是让性能更好,延迟更低,功耗更低,所以目前 NVMe 和 PCIe 匹配无疑是最完美的。我们通过下面一张图来对比一下 AHCI 与 NVMe 的特点(注:图片来自 Intel FMS 2012)。

NVMe 和 AHCI 相比,它的优势主要体现在以下几点:
1、低延迟
- SSD 到 CPU 的路径更近了:从 SATA SSD 到 PCIe SSD,原生 PCIe 主控与 CPU 直接相连,而不需要像 SATA 一样连接到南桥中转,因此基于 PCIe 的 SSD 时延更低。如下图所示:PCIeSSD 作为一个 PCIeEndpoint(EP)通过 PCIe 连接着 RootComplex(RC),RC 连接着 CPU 和内存。

- 命令更加精简:跟 ATA 规范中定义的命令相比,NVMe 的命令个数少了很多,完全是为了 SSD 量身定制的。NVMe 缩短了 CPU 到 SSD 的指令路径,比如 NVMe 减少了对寄存器的访问次数;使用了 MSI-X 中断管理;并行 &多线程优化-----NVMe 减少了各个 CPU 核之间的锁同步操作等。
- 众所周知,底层存储介质 SSD 要比传统机械硬盘速度快很多;
所以基于 PCIe + NVMe 的 SSD 具有非常低的延迟。
2、高带宽、高 IOPS 性能
理论上 IOPS 与队列深度 (Queue Depth) 和 IO 延迟有关,用数学表达式是:
IOPS=队列深度/IO 延迟
从上述的表达式中,我们可以看出 IOPS 与队列深度有很大的关系。注意:实际应用中,随着队列深度的增加,IO 延迟也会相应地变大。通常 SATA 接口的 SSD,在队列深度上可以达到 32,然而这也是 AHCI 所能做到的极限。但目前企业级 PCIeSSD,其队列深度要达到 128,甚至是 256 才能够发挥出最高的 IOPS 性能。而在 NVMe 标准下,最大的队列深度可达 64K,队列数量也从 AHCI 的 1,提高到了 64K。再加上 PCIe 接口本身在性能上碾压 SATA,使得 NVMeSSD 在性能上碾压 SATASSD 是顺理成章的事情。

NVMeSSD 和 SATA SSD 的性能对比图
3、低功耗
NVMe 中加入了自动功耗状态切换和动态能耗管理功能。NVMe Spec 支持 1-32 电源状态 (PS, Power State)。在 Host 开启自动电源状态转换功能时,可以根据自己喜好设置 Idle 多长时间后自动转换其他电源状态。
写到最后
那么,焱融追光 F8000X 全闪文件存储针对 NVMe 的性能做了哪些优化呢?
存储处理器资源既要负责 RDMA 网络数据包收发处理逻辑,又要转发 IO 给磁盘,负责磁盘的读写开销。对于传统机械硬盘来说,可以采用大量线程去压榨磁盘性能,而针对 NVMe SSD 这种方式是不现实的。所以焱融追光 F8000X 全闪文件存储采用异步非阻塞 IO 模式,有效减少上下文切换,全路径实现了零拷贝,支持批量提交和回收,增加了并行能力:
- 减少用户到内核态拷贝:通常 POSIX I/O,例如: read(),write()这种系统调用,每次用户数据要从用户态到内核态 COPY 一次。采用异步非阻塞的 DMA 操作,既避免拷贝,也降低 CPU 负载。
- 减少上下文切换:在 OS 发出系统调用请求之后,就去处理别的任务,等中断通知再接着上下文去处理后续任务。对于慢速介质是可以的,但是对于 NVMe SSD 这种高速介质,其实发完请求很快就结束了,又通过中断切换上下文代价太大。所以不如直接通过 Polling,相当于是用 CPU 资源换取低延迟,每个盘启动一个线程一直 polling,当来任务时立马去感知到事件去处理,使得 IOPS 提升,降低延迟。
- 增加并行:采用异步多队列线程池模型,减少锁冲突,充分发挥 IO 并行能力。
焱融追光 F8000X 全闪文件存储使用全 NVMeSSD,通过深度 I/O 模型优化设计能够充分利用 NVMe 的多队列特性,获得更高的 IOPS 性能。同时,高效分配处理器核心资源,支撑网络层面高并发数据收发处理的同时,避免大量线程的调度开销,充分发挥 NVMe SSD 磁盘性能。
[转帖]焱融全闪系列科普| 为什么 SSD 需要 NVMe?的更多相关文章
- JPG:文件格式系列科普之.JPEG/.JPG(转)
当我们在互联网上浏览内容时,总会看到各种各样的图片,比如在你刷IT之家时,所看到的绝大部分图片都是JPG格式的,这种图片格式之所以在互联网上广受欢迎,是因为相比于PNG.GIF格式,它的体积相对较小, ...
- 最全 Adobe 系列产品 CS6版本 序列号/注册码
最全 Adobe 系列产品 CS6版本 序列号/注册码: 1.Adobe Photoshop CS6 Extended 序列号/注册码 2.Adobe After Effects CS6 序列号/注册 ...
- Jquery全选系列操作(锋利的jQuery)
Jquery全选系列操作(锋利的jQuery) <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" ...
- 「产品经理全连接系列2」企业如何开展敏捷或DevOps的研发变革
大家好,我是华为云的产品经理 恒少: 作为布道师和产品经理,出差各地接触客户是常态,经常和华为云的客户交流.布道.技术沙龙,但是线下交流,覆盖的用户总还是少数. 我希望可以借线上的平台,和用户持续交流 ...
- 「产品经理全连接系列1」Epic/Feature/Story/Task/Bug到底是什么
大家好,我是华为云的产品经理 恒少: 作为布道师和产品经理,出差各地接触客户是常态,经常和华为云的客户交流.布道.技术沙龙,但是线下交流,覆盖的用户总还是少数. 我希望可以借线上的平台,和用户持续交流 ...
- Fragment全解析系列
(一):那些年踩过的坑 开始之前 最新版知乎,单Activity多Fragment的架构,响应可以说非常“丝滑”,非要说缺点的话,就是没有转场动画,并且转场会有类似闪屏现象.我猜测可能和Fragmen ...
- Fragment全解析系列(一):那些年踩过的坑
开始之前 最新版知乎,单Activity多Fragment的架构,响应可以说非常"丝滑",非要说缺点的话,就是没有转场动画,并且转场会有类似闪屏现象.我猜测可能和Fragment转 ...
- Fragment全解析系列(三):Fragment之我的解决方案:Fragmentation
源码地址:Github,欢迎Star,Fork. Demo网盘下载(V_0.7.13)Demo演示:单Activity + 多Fragment,项目中有3个Demo. 流式的单Activity+多Fr ...
- Fragment全解析系列(二):正确的使用姿势
作为一个稳定的app,从后台且回到前台,一定会在任何情况都能恢复到离开前的页面,并且保证数据的完整性. 如果你没看过本系列的第一篇,为了方便后面文章的介绍,先规定一个"术语",安卓 ...
- 转帖:深入理解JavaScript系列
感觉汤姆大叔这个系列写的很是不错,很适合有js基础但是想深入又无从下手的朋友. 深入理解JavaScript系列
随机推荐
- MySQL进阶篇:详解SQL性能分析
MySQL进阶篇:第三章_SQL性能分析 SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息.通过如下指令,可以查 ...
- 如何极速极速搭建个人博客?Copy攻城狮用的这一招很优秀!
摘要:在中国功夫中,"天下武功,无坚不摧,唯快不破",在编程的世界里,如何快速搭建一个属于自己的博客呢?那么 Pagic + Vercel 应该是个不错的选择!接下来,由Copy攻 ...
- 云图说|ASM灰度发布,让服务发布变得更敏捷、更安全
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:通常产品优化迭代的 ...
- 优化 uniapp 发行操作:一键打包、混淆代码
uniapp一键发行代码并混淆代码 第一步.在项目根目录下安装插件 npm install javascript-obfuscator -g 安装完成后,javascript-obfuscator ...
- SpringBoot Docker Skywalking agent 不生效
SpringBoot Skywalking agent 通过 Dockfile 配置 不生效 ENTRYPOINT ["java","-Djava.security.eg ...
- JAVA 获取 URL 指定参数的值
JAVA 获取 URL 指定参数的值 @Test void regexTest() { String url = "https://www.cnblogs.com/vipsoft/p/152 ...
- 国内pip源提示“not a trusted or secure host”解决方案
大家应该都知道怎么添加国内pip源(主要是豆瓣和阿里云),~/.pip/pip.conf文件配置大概如下(下面注释掉了豆瓣源): [global] # index-url = http://pypi. ...
- 5.0 数据库完整性详解(PRIMARY KEY、REFERENCES、CHECK、CONSTRAINT、DOMAIN、TRIGGER)
前言 本篇文章学习书籍:<数据库系统概论>第5版 王珊 萨师煊编著 视频资源来自:数据库系统概论完整版(基础篇+高级篇+新技术篇) 由于 BitHachi 学长已经系统的整理过本书了,我在 ...
- Codeforces Round #719 (Div. 3) A~E题解
51鸽了几天,有几场比赛的题解还没发布,今天晚上会补上的 1520A. Do Not Be Distracted! 问题分析 模拟,如果存在已经出现的连续字母段则输出NO using ll = lon ...
- L2-014 列车调度 (25 分)(set容器应用)
L2-014 列车调度 (25 分) 火车站的列车调度铁轨的结构如下图所示. 两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道.每趟列车从入口可以选择任意 ...