丹阳火车站片区规划,做美工需要哪些网站,互联网保险模式,怎么样自己建设网站一、故事开篇最近有同学在咨询#xff0c;SATA SSD是否需要NCQ功能#xff1f;借此机会#xff0c;今天我们来聊聊这个比较古老的话题#xff0c;关于SATA协议的NCQ的故事。首先我们先回顾下SATA与NCQ的历史#xff1a;2003年#xff0c;SATA协议1.0问世#xff0c;传输…一、故事开篇最近有同学在咨询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.12013年SATA 3.22016年SATA 3.32018年SATA 3.42020年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对应的Tag8;这个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对应的Tag0xEh14;这个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指令 Tag0;第二个Read FPDMA Queued指令 Tag5;假设2Device要先执行第二个指令(Tag5), 然后在执行第一个指令(Tag0)上图中指令下发流程如下Host先下发第一个Read FPDMA Queued指令并且SActive bit01, 写入NCQ buffer这时NCQ队列深度1Host先下发第二个Read FPDMA Queued指令并且SActive bit0 bit51, 写入NCQ buffer这时NCQ队列深度2在假设2中我们要求先执行第二个指令(Tag5)那么这个时候就需要NCQ对这两个指令重新排序如下图红色框显示NCQ对这个两个指令重新排序后就开始执行依次这两个Read FPDMA Queued指令, 指令执行流程见前面介绍的“FPDMA Read Command(60h) Protocol”内容。上图是执行Tag5指令的示意图下图为执行Tag0指令的示意图三、对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 Depth1是关闭NCQ其他是开启NCQ因此在linux中开启NCQ的方式也比较简单开启NCQecho 31 /sys/block/device/device/queue_depth关闭NCQecho 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压轴大戏