SATA SSD需要NCQ开启吗?
一、故事开篇
最近有同学在咨询,SATA SSD是否需要NCQ功能?借此机会,今天我们来聊聊这个比较古老的话题,关于SATA协议的NCQ的故事。
首先我们先回顾下SATA与NCQ的历史:
2003年,SATA协议1.0问世,传输速率150MB/s, 主要是为了取代PATA(最大133MB/s), 这个时候还没NCQ。
SATA1.0问世1年后,2004由于更好性能的诉求,SATA 2.0问世,传输速率300MB/s,这个时候NCQ就诞生了。之后分别在2005年、2007年做了两次的升级迭代SATA 2.5和SATA 2.6。
2009年,SATA 3.0出现,之后迭代了五次,分别是2011年SATA 3.1,2013年SATA 3.2,2016年SATA 3.3,2018年SATA 3.4,2020年SATA 3.5。自此SATA协议就没有更新了,大家都去拥抱NVMe了。

其次,我们需要先了解下NCQ是什么?我们这里主要解析一下SATA NCQ(Native Command Queuing)原生指令序列的相关内容。
二、SATA NCQ 原生指令序列
NCQ是SATA中的命令协议,允许同时在Drive中执行多个命令。当用户的应用程序发送多条指令到用户的硬盘,NCQ可以优化完成这些指令的顺序,从而降低负荷达到提升性能的目的。
此外,SATA Spec中还定义了三个特殊的功能来加强NCQ的性能:
Race-Free Status Return: 无竞争状态返回机制,允许任何指令任何时间报告执行状态,此外,多个命令执行完毕信息可以打包一起回传。
Interrupt Aggregation: 在DMA传输模式下,硬盘通知传输结束,会引起一个中断(Interrupt),造成延迟。所以,SATA spec提供中断聚集机制。如果硬盘同时间内完成多组命令,这些命令完成所引起的中断就可以聚集在一起,大幅减少中断的数目,这对于降低中断延迟有极大的贡献。
First-Party DMA(FPDMA): SATA允许硬盘端通过DMA setup FIS直接对Host控制器送出数据传输请求,DMA引擎就可以直接进行资料传输,这个过程中并不需要Host端软件的介入。
当Drive收到一个Command,是要将其重新排列?还是立即执行呢?这怎么区分呢?
不怕,SATA Spec定义了两个特殊的NCQ指令:
Read FPDMA Queued;

Write FPDMA Queued;

从上面Read FPMA Queued Inputs和Write FPMA Queued Inputs我们可以看到红色框里面有一个特别的5-bit参数TAG(bit3~bit7). 这个参数就代表了NCQ一次可以最多执行32个Commands(如下图红色框Command List)。

在Device端,当Queued Commands(最多32)中的一个write或者read准备好传输数据时,通过发送DMA setup FIS告知Host已准备好数据传输,其中要附带更新Tag Value(如下图红色框)。

在Device端,当Queued Commands执行完成后, 通过发送Set Device Bits FIS告知Host完成状态,此时SActive区域对应TAG的相关内容(最多32个Command)。

FPDMA Read Command(60h) Protocol如下:

我们抓取了一个FPDMA Read Command(60h)的SATA trace,如下图:

从上面的SATA trace我们可以得到:
这个FPDMA read cmd对应的Tag=8;
这个FPDMA read cmd要读取32768 bytes的数据; Data FIS中的数据长度最大为2048 DWs,也就是8192 Bytes。所以,我们可以看到在上面的sata trace中,分4次发送Data FIS来实现32768 bytes数据的传输。
FPDMA Write Command(61h) Protocol如下:

我们抓取了一个FPDMA Write Command(61h)的SATA trace,如下图:

从上面的SATA trace我们可以得到:
这个FPDMA write cmd对应的Tag=0xEh=14;
这个FPDMA write cmd要写入131072 bytes的数据;Data FIS中的数据长度最大为2048 DWs,也就是8192 Bytes。所以,我们可以看到在上面的sata trace中,分16次发送Data FIS。但是每发送一个DMA DATA FIS后,要再次收到DMA Activate FIS才能发送下一个DMA DATA FIS;
下面我们再看个完整的例子加深一下对NCQ的理解:
举例:Host向Device发送两个Read FPDMA Queued指令
针对这个例子,我们作两个假设:
假设1:
第一个Read FPDMA Queued指令 Tag=0;
第二个Read FPDMA Queued指令 Tag=5;
假设2:
Device要先执行第二个指令(Tag=5), 然后在执行第一个指令(Tag=0)

上图中指令下发流程如下:
Host先下发第一个Read FPDMA Queued指令,并且SActive bit0=1, 写入NCQ buffer,这时NCQ队列深度=1;
Host先下发第二个Read FPDMA Queued指令,并且SActive bit0 & bit5=1, 写入NCQ buffer,这时NCQ队列深度=2;
在假设2中,我们要求先执行第二个指令(Tag=5),那么,这个时候就需要NCQ对这两个指令重新排序,如下图红色框显示:

NCQ对这个两个指令重新排序后,就开始执行依次这两个Read FPDMA Queued指令, 指令执行流程见前面介绍的“FPDMA Read Command(60h) Protocol”内容。
上图是执行Tag=5指令的示意图,下图为执行Tag=0指令的示意图:

三、对NCQ的误解
NCQ是最开始诞生的背景,是为了优化机械硬盘性能,通过NCQ优化命令的排序,减少磁头的移动,以达到提升性能的目的。


此外,网上有一些SATA SSD开启NCQ后出现异常的案例,关闭NCQ恢复正常(其实,这里出现异常,并不是NCQ本身的问题,而是NCQ打开后的压力让部分硬盘型号出现不兼容或者IO处理不及时的问题)。比如如下信息:

结合上面两点,有很多人对NCQ产生了误解:NCQ是提升HDD性能的,对SATA SSD没有用,且不能开启。
小编想说的是:NCQ在整个计算机IO栈中,类似于水闸一样,开启NCQ(一次发送32个命令),关闭NCQ(每次只发送1个命令)。SSD虽然没有机械臂和磁头,但是SSD是多通道的,开启NCQ后,硬盘控制器可以根据数据请求和数据存储区域NAND的分布,利用多通道并发的优势,提升性能。

比如,Intel发布的官方技术文档中也强调这一点,NCQ可以同样提升SSD性能。

此外,再分享一个业内其他同学测试的数据,NCQ开启后,随着QD的增加,性能也在不断提升。

目前SATA SSD原生就是支持NCQ的,比如随机选取的Intel、Samsung、Micron、WD、Realtek等厂商的几款对NCQ支持情况。





在Linux内核的定义中,Queue Depth=1是关闭NCQ,其他是开启NCQ

因此,在linux中开启NCQ的方式也比较简单:
开启NCQ:echo 31 > /sys/block/<device>/device/queue_depth
关闭NCQ:echo 1 > /sys/block/<device>/device/queue_depth
四、话题讨论
讲述到这里,你觉得SATA SSD是否需要开启NCQ呢?给出你的观点哦~
如果你有不同的想法与思路,欢迎留言交流,非常感谢!
精彩推荐:
全景解析SSD IO QoS性能优化
NVMe IO数据传输如何选择PRP or SGL?
存储随笔2022年度最受欢迎文章榜单TOP15
从主流企业级PCIe Gen4 SSD性能对比,畅谈SSD性能调优的思考
浅析nvme原子写的应用场景
YMTC X3 NAND 232L 终露真容,全球领先
芯片级解密YMTC NAND Xtacking 3.0技术
Backblaze 2022 Q3 硬盘故障质量报告解读
漫谈云数据中心的前世今生
多维度深入剖析QLC SSD硬件延迟的来源
漫谈固态硬盘SSD全生命周期的质量管理
汽车存储SSD面临的挑战与机遇
超大规模云数据中心对存储的诉求有哪些?
SSD写放大的优化策略要统一标准了吗?
“后Optane时代”的替代存储方案有哪些?
浅析PCIe链路LTSSM状态机
浅析Relaxed Ordering对PCIe系统稳定性的影响
实战篇|浅析MPS对PCIe系统稳定性的影响
浅析PCI配置空间
浅析PCIe系统性能
PLC SSD虽来但远,QLC SSD火力全开
最全电脑固态硬盘SSD入门级白皮书
存储随笔《NVMe专题》大合集及PDF版正式发布!
加权循环仲裁WRR特性对NVME SSD性能有什么影响?
Linux NVMe Driver学习笔记之9: nvme_reset_work压轴大戏
相关文章:

SATA SSD需要NCQ开启吗?
一、故事开篇最近有同学在咨询,SATA SSD是否需要NCQ功能?借此机会,今天我们来聊聊这个比较古老的话题,关于SATA协议的NCQ的故事。首先我们先回顾下SATA与NCQ的历史:2003年,SATA协议1.0问世,传输…...
知识图谱业务落地技术推荐之图神经网络算法库图计算框架汇总
1.PyTorch Geometric: https://pytorch-geometric.readthedocs.io/en/latest/notes/introduction.html PyG是一个基于PyTorch的用于处理不规则数据(比如图)的库,或者说是一个用于在图等数据上快速实现表征学习的框架。它的运行速度很快,训练模型速度可以达到DGL(Deep Gra…...
==与equals()的区别
与equals()的区别 对于 比较的是值是否相等如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址 对于equals方法 equals方法不能作用于基本数据类型的变量ÿ…...

【人工智能】对贝叶斯网络进行吉布斯采样
问题 现要求通过吉布斯采样方法,利用该网络进行概率推理(计算 P(RT|SF, WT)、P2(CF|WT)的概率值)。 原理 吉布斯采样的核心思想为一维一维地进行采样,采某一个维度的时候固定其他的维度,在本次实验中,假…...

Java 面向对象基础
文章目录一、类和对象1. 类的定义2. 对象的使用二、对象内存图三、成员变量和局部变量四、封装1. private 关键字2. this 关键字五、构造方法六、标准类制作一、类和对象 在此之前,我们先了解两个概念,对象和类。 万物皆对象,客观存在的事物…...
RocketMQ源码(21)—ConsumeMessageConcurrentlyService并发消费消息源码
基于RocketMQ release-4.9.3,深入的介绍了ConsumeMessageConcurrentlyService并发消费消息源码。 此前我们学习了consumer消息的拉取流程源码: RocketMQ源码(18)—DefaultMQPushConsumer消费者发起拉取消息请求源码RocketMQ源码(19)—Broker处理Default…...

基于 STM32+FPGA 的多轴运动控制器的设计
运动控制器是数控机床、高端机器人等自动化设备控制系统的核心。为保证控制器的实用性、实时性和稳定 性,提出一种以 STM32 为主控制器、FPGA 为辅助控制器的多轴运动控制器设计方案。给出了运动控制器的硬件电路设计, 将 S 形加减速算法融入运动控制器&…...

《爆肝整理》保姆级系列教程python接口自动化(十三)--cookie绕过验证码登录(详解
python接口自动化(十三)--cookie绕过验证码登录(详解 简介 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接)。获取…...

soapui + groovy 接口自动化测试
1.操作excel的groovy脚本 package pubimport jxl.* import jxl.write.Label import jxl.write.WritableWorkbookclass ExcelOperation {def xlsFiledef workbookdef writableWorkbookdef ExcelOperation(){}//设置xlsFile文件路径def ExcelOperation(xlsFile){this.xlsFile x…...
Linux内存管理(三十五):内存规整简介
源码基于:Linux5.4 0. 前言 伙伴系统以页面为单位来管理内存,内存碎片也是基于页面的,即由大量离散且不连续的页面组成的。从内核角度来看,出现内存碎片不是好事情,有些情况下物理设备需要大段的连续的物理内存,如果内核无法满足,则会发生内核错误。内存规整就是为了解…...

Java连接Redis
Jedis是Redis官方推荐的Java连接开发工具。api:https://tool.oschina.net/apidocs/apidoc?apijedis-2.1.0一、 导入包<!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><…...
Python语言零基础入门教程(十六)
Python 模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。 模块让你能够有逻辑地组织你的 Python 代码段。 把相关的代码分配到一个模块里能让你的代码更好用,更易懂。 模块能定…...

SAP ERP系统SD模块常用增强之一:VA01/VA02创建或修改SO的输入检查
在SAP/ERP项目的实施中销售管理模块(SD)的创建和修改销售订单必定会有输入字段校验检查的需求,来防止业务人员录入错误或少录入数据,SAP公司也考虑到这一点,所以这方面的配置功能也非常强大,通常情况下不需…...

深度学习知识补充
候选位置(proposal) RCNN 什么时ROI? 在图像处理领域,感兴趣区域(region of interest , ROI) 是从图像中选择的一个图像区域,这个区域是你的图像分析所关注的重点。圈定该区域以便进行进一步处理。使用ROI圈定你想读的目标&…...

Vue笔记(1)——数据代理与绑定
一、初始Vue 1.想让Vue工作,就必须创建一个Vue实例,且要传入一个配置对象; 2.root容器里的代码依然符合html规范,只不过混入了一些特殊的Vue语法; 3.root容器里的代码被称为【Vue模板】; 4.Vue实例和容器是…...

LeetCode题目笔记——2563. 统计公平数对的数目
文章目录题目描述题目链接题目难度——中等方法一:排序双指针代码/Python代码/C方法二代码/Python总结题目描述 这是前天周赛的第二题。 统计公平数对的数目 - 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,…...
【MySQL Shell】8.9.5 将集群重新加入到 InnoDB ClusterSet
如果 InnoDB 集群是 InnoDB ClusterSet 部署的一部分,MySQL Shell 会在重新启动后立即自动将其恢复到拓扑中的角色,前提是其运行正常且未被标记为无效。但是,如果集群被标记为无效或其 ClusterSet 复制通道已停止,则必须使用 clus…...
元素水平垂直居中的方法有哪些?如果元素不定宽高呢?
实现元素水平垂直居中的方式: 利用定位margin:auto利用定位margin:负值利用定位transformtable布局flex布局grid布局 1-利用定位margin:auto <style>.father{width:500px;height:300px;border:1px solid #0a3b98;position: relative;}.son{width:100px;heig…...
访问学者在新加坡访学生活日常花销大吗?
新加坡地理位置优越,社会发达,教学质量好,吸引不少国内学生前往新加坡留学、访学。那么,去新加坡访学,访问学者花销需要多少钱呢?下面和51访学网小编一起来了解一下吧。 一、饮食 新加坡的饮食从很亲民的…...

XCP实战系列介绍11-几个常用的XCP命令解析
本文框架 1.概述2. 常用命令解析2.1 CONNECT连接(0xFF)2.2 SHORT_UPLOAD 命令(0xF4)2.2 SET_MTA (0xF6)2.3 MOVE命令(0x19)2.4 GET_CAL_PAGE(0xEA)2.5 SET_CAL_PAGE(0xEB)2.6 DOWNLOAD(0xF0)1.概述 在文章《看了就会的XCP协议介绍》中详细介绍了XCP的协议,在《XCP实战系列介绍…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...