第2章 SSD主控和全闪存阵列
SSD主要由两大模块构成——主控和闪存介质。其实除了上述两大模块外,可选的还有缓存单元。主控是SSD的大脑,承担着指挥、运算和协调的作用,具体表现在:一是实现标准主机接口与主机通信;二是实现与闪存的通信;三是运行SSD内部FTL算法。可以说,一款主控芯片的好坏直接决定了SSD的性能、寿命和可靠性
2.1 SSD系统架构
SSD作为数据存储设备,其实是一种典型的(System on Chip)单机系统,有主控CPU、RAM、操作加速器、总线、数据编码译码等模块,见图2-1,操作对象为协议、数据命令、介质,操作目的是写入和读取用户数据
图2-1 SSD主控模块硬件图 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
图2-1所示仅是一个SSD系统架构的概略图,这款主控采用ARM CPU,主要分为前端和后端两大部分。前端(Host Interface Controller,主机接口控制器)跟主机打交道,接口可以是SATA、PCIe、SAS等。后端(Flash Controller,闪存控制器)跟闪存打交道并完成数据编解码和ECC。除此之外还有缓冲(Buffer)、DRAM。模块之间通过AXI高速和APB低速总线互联互通,完成信息和数据的通信。在此基础之上,由SSD固件开发者构筑固件(Firmware)统一完成SSD产品所需要的功能,调度各个硬件模块,完成数据从主机端到闪存端的写入和读取
2.1.1 前端
主机接口:与主机进行通信(数据交互)的标准协议接口,当前主要代表为SATA、SAS和PCIe等。表2-1所示是三者的接口速率
表2-1 SATA、SAS、PCIe接口速率 表格来源于《深入浅出SSD:固态存储核心技术、原理与实战》
SATA的全称是Serial Advanced Technology Attachment(串行高级技术附件),是一种基于行业标准的串行硬件驱动器接口,如图2-2所示
图2-2 SATA接口 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
SAS(Serial Attached SCSI)即串行连接SCSI,是新一代的SCSI技术,和现在流行的Serial ATA(SATA)硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连接线改善内部空间等,如图2-3所示
图2-3 SAS接口 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
PCIe(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,主要优势就是数据传输速率高,目前最高的4.0版本可达到2GB/s(单向单通道速率),如图2-4和2-5所示
图2-4 PCIe接口式插卡(AIC) 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
图2-5 U.2接口 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
前端是负责主机和SSD设备通信的接口,命令和数据传输通过前端总线流向或流出SSD设备
- 从硬件模块上来看,前端有SATA/SAS/PCIe PHY层,俗称物理层,接收串行比特数据流,转化成数字信号给前端后续模块处理。这些模块处理NVMe/SATA/SAS命令,它们接收并处理一条条命令和数据信息,涉及数据搬移会使用到DMA。一般命令信息会排队放到队列中,数据会放到SRAM快速介质中。如果涉及加密和压缩功能,前端会有相应的硬件模块来做处理,若软件无法应对压缩和加密的快速需求,则会成为性能的瓶颈
- 从协议角度,以一条SATA Write FPDMA命令为例对上述内容进行说明。从主机端文件系统发出一条写命令请求,该请求到主板南桥AHCI寄存器后,AHCI寄存器执行请求,即进行写操作,忽略文件系统到AHCI路径的操作细节,从SSD前端总线上看会发出如下的写交互操作,如图图2-6
图2-6 SAT A Write FPDMA命令协议处理步骤 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
- 步骤1:主机在总线上发出Write FPDMA命令FIS(Frame Information Structure,帧信息结构,是SATA为了实现异步传输数据块而使用的封包)
- 步骤2:SSD收到命令后,判断自己内部写缓存(Write Buffer)是否有空间去接收新的数据。如果有,则发出DMA Setup FIS到主机端;否则什么也不发,主机端处于等待状态(这叫流控:数据流量控制)
- 步骤3:主机端收到DMA Setup FIS后,发送不大于8KB数据的Data FIS给设备
- 步骤4:重复步骤2和步骤3直到数据全部发送完毕
- 步骤5:设备(SSD)发送一个状态Status FIS给主机,表示从协议层面这条写命令完成全部操作。当然Status可以是一个good status或者一个bad/error status,表示这条Write FPDMA命令操作正常或者异常完成
SSD接收命令和数据并放到SSD内部缓冲区之后,前端固件模块还需要对命令进行解析,并分派任务给中端FTL。命令解析(Command Decoder)将命令FIS解析成固件和FTL(Flash Translation Layer)能理解的元素:
- 这是一条什么命令,命令属性是读还是写
- 这条写命令的起始LBA和数据长度
- 这条写命令的其他属性,如是否是FUA命令,和前一条命令LBA是否连续(是连续命令还是随机命令)
当命令解析完成后,放入命令队列里等待中端FTL排队去处理。由于已经有了起始LBA和数据长度两大主要信息元素,FTL可以准确地映射LBA空间到闪存的物理空间。至此,前端硬件和固件模块完成了它应该完成的任务
2.1.2 主控CPU
SSD控制器SoC模块和其他嵌入式系统SoC模块并没有什么本质的不同,一般由一颗或多颗CPU核组成,同时片上有I-RAM、D-RAM、PLL、IO、UART、高低速总线等外围电路模块。CPU负责运算、系统调度,IO完成必要的输入输出,总线连接前后端模块
通常所说的固件就运行在CPU核上,分别有代码存储区I-RAM和数据存储区D-RAM。如果是多核CPU,需要注意的是软件可以是对称多处理(SMP)和非对称多处理(AMP)。对称多处理多核共享OS和同一份执行代码,非对称多处理是多核分别执行不同代码。前者多核共享一份I-RAM和D-RAM,资源共享;后者每核对应一份I-RAM和D-RAM,每核独立运行,没有内存抢占导致代码速度执行变慢的问题。当SSD的CPU要求计算能力更高时,除增加核数和单核CPU频率外,AMP的设计方式更加适应计算和任务独立的要求,消除了代码和数据资源抢占导致执行速度过慢的问题
固件根据CPU的核数进行设计,充分发挥多核CPU的计算能力是固件设计考虑的一方面。另外,固件会考虑任务划分,会将任务分别加载到不同CPU上执行,在达到并行处理的同时让所有CPU有着合理且均衡的负载,不至于有的CPU忙死有的CPU闲死,这是固件架构设计要考虑的重要内容,目标是让SSD输出最大的读写性能
SSD的CPU外围模块包括UART、GPIO、JTAG,这些都是程序必不可少的调试端口,另外还有定时器模块Timer及其他内部模块,比如DMA、温度传感器、Power regulator模块等
2.1.3 后端
后端两大模块分别为ECC模块和闪存控制器,如图2-7
图2-7 SSD中的ECC模块和闪存控制器 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
ECC模块是数据编解码单元,由于闪存存储天生存在误码率,为了数据的正确性,在数据写入操作时应给原数据加入ECC校验保护,这是一个编码过程。读取数据时,同样需要通过解码来检错和纠错,如果错误的比特数超过ECC纠错能力,数据会以“不可纠错”的形式上传给主机。这里的ECC编码和解码的过程就是由ECC模块单元来完成的。SSD内的ECC算法主要有BCH和LDPC,其中LDPC正逐渐成为主流
闪存控制器使用符合闪存ONFI、Toggle标准的闪存命令,负责管理数据从缓存到闪存的读取和写入
从单个闪存角度看,一个Die/LUN是一个闪存命令执行的基本单元,闪存控制器和闪存连接引脚按照如下操作,如图2-8
图2-8 闪存芯片接口 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
- 外部接口:8个IO接口,5个使能信号(ALE、CLE、WE#、RE#、CE#),1个状态引脚(R/B#),1个写保护引脚(WP#)
- 命令、地址、数据都通过8个IO接口输入输出
- 写入命令、地址、数据时,都需要将WE#、CE#信号同时拉低,数据在WE#上升沿被锁存
- CLE、ALE用来区分IO引脚上传输的是数据还是地址
从闪存控制器角度看,为了性能需求需要并发多个闪存Die/LUN,通常配置有多个通道(channel)。一个通道挂多少个闪存Die/LUN,取决于SSD容量和性能需求,Die/LUN个数越多,并发的个数越多,性能越好
Die/LUN是闪存通信的最小基本管理单元,配有上述的一套总线,即8个I/O口,5个使能信号(ALE、CLE、WE#、RE#、CE#),1个状态引脚(R/B#),1个写保护引脚(WP#)
如果一个通道上挂了多个闪存Die/LUN,每个Die共用每个通道上的一套总线,闪存控制器通过选通信号CE#识别和哪个Die通信。在闪存控制器给特定地址的闪存Die发读写命令和数据前,先选通对应Die的CE#信号,然后进行读写命令和数据的发送。一个通道上可以有多个CE,SSD主控一般设计为4~8个,对于容量而言选择有一定的灵活度
2.2 SSD主控厂商
SSD主控是一个技术深度和市场广度都很大的芯片产品
2.2.1 Marvell主控
Marvell在高端SoC设计上处于领先地位,Marvell通过复杂的SoC架构、领先的纠错机制、接口技术、低功耗等多项优势建立起领先竞争对手的技术壁垒
2.2.2 三星主控
三星的主控基本上都是三星自己的SSD在用,830系列使用是MCX主控,而840及840Pro使用的则是MDX主控,850Pro/840EVO用的是MEX主控,850EVO 500GB以下的和750EVO用的是MGX主控,650用的是MFX主控
2.3 案例:硅格(SiliconGo)SG9081主控
本节以国产主控厂商硅格的SATA3.2SSD主控SG9081为例,剖析一下主控如何实现高性能。图2-14为SG9081主控的结构框图
图2-14 SG9081主控的结构框图 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
1.HAM+GoCache加速随机读写的IOPS
HAM是硬件加速模块的简称,SSD主控中除了MCU以外,还有一个硬件加速模块HAM。该模块将部分算法处理的动作硬件化,一方面释放了MCU的资源,另外一个方面则加速了算法的实现,尤其是对小数据的处理。另外,主控中集成了GoCache(SiliconGo独有技术),可高效地实现映射关系的管理,从而更高效地提高对小数据的传输能力。两者的结合实现了SSD成品模组性能的提升
2.DMAC加速顺序读写
DMAC是Direct Memory Access Controller的缩写。该模块的存在使得SSD在进行连续大数据传输的时候,不用一直占据MCU的资源。当DMA请求被发起时,内部总线裁决逻辑将交由DMAC控制,接着数据高速传输动作开启。传输过程中,MCU可以去处理其他的事务,而当数据传输结束之后,DMAC又会将总线让给MCU。在这样的机制保证下,SSD进行读写操作时的效率极大地提高,从而表现出优秀的顺序读写性能
3.LDPC+RAID提高可靠性,增强闪存耐久度和数据留存能力
目前闪存正从2D转向3D架构,对闪存纠错处理的要求也越来越高,早期的BCH已经无法满足先进制程或先进工艺的闪存。SG9081主控采用LDPC实现ECC,LDPC码在相同的用户数据条件下,与BCH校验码相比能纠正更多的错误,同时也增强了闪存的使用寿命。而RAID功能的引进则给数据保护加上了一个双保险。主控中的RAID功能可以理解为给数据做了一层校验保护,必要的时候可以通过校验的内容恢复为原始数据。LDPC和RAID功能大大地提高了数据的稳定性
2.4 案例:企业级和消费级主控需求的归一化设计
SSD有企业级与消费级之分。企业级SSD产品更加注重随机性能、延迟、IO QoS的保证及稳定性;而消费级产品则更加注重顺序性能、功耗、价格等,如表2-3所示
表2-3 企业级和消费级SSD对比 表格来源于《深入浅出SSD:固态存储核心技术、原理与实战》
是否有一款归一化的SSD控制器,能同时满足企业级和消费级需求?主要的问题在于能否在控制器硬件架构上实现成本、功耗和功能的统一
- 1)成本方面,企业级SSD对控制器成本较不敏感,归一化SSD控制器需要着重满足消费级SSD的成本预算。采用通用硬件架构并优化硬件资源开销来约束SSD控制器成本,通过差异化固件来满足企业级与消费级产品的不同性能需求
- 2)在性能方面,经过市场沉淀,NVMeU.2形态与M.2形态的SSD逐渐成为主流,两种形态的SSD产品性能需求也趋于一致。作为AIC形态的取代品,1U服务器普遍承载8块或更多U.2形态SSD,使得U.2形态SSD单盘4KB随机性能在300~400KIOPS,这已能满足大部分应用需求。反观消费级SSD市场,高端游戏平台NVMe M.2形态的SSD理论上性能已达3.5GB/s,这样的性能指标已与一些企业级SSD的顺序IO相近。一些互联网厂商已在IDC数据中心中应用M.2形态的SSD。在数据中心,上层对数据流做了大量优化,数据以顺序访问方式写入SSD,这降低了对企业级SSD随机性能的需求
- 3)在寿命上,企业级与消费级SSD需求差别较大。但影响SSD寿命的主要因素在于闪存的耐久能力。SSD控制器则确保加强对闪存的纠错能力。因此,企业级与消费级SSD控制器在寿命方面的设计目标是一致的
- 4)在容量上,企业级SSD与消费级SSD差异较大。SSD控制器需要以比较小的代价支持大容量闪存,以便同时覆盖企业级与消费级SSD的需求
- 5)可靠性方面,企业级SSD一般要求ECC与DIE-RAID两层数据保护能力。而随着3D闪存逐步普及,闪存厂商开始建议在消费级SSD上提供DIE-RAID能力。所以在可靠性方面,企业级与消费级SSD控制器的设计目标也趋于一致了
- 6)在功耗方面,消费级产品对功耗最为敏感,特别是像平板、笔记本电脑这种电池供电设备,对功耗有严格的限制。SSD控制器在设计时需要考虑复杂的低功耗需求,需要支持多种电源状态,以及快速唤醒。企业级SSD对功耗相对不敏感。然而对于整个数据中心,电力成本已占数据中心运营成本近20%。随着SSD的大规模部署,低功耗设计也成为企业级SSD控制器的追求目标
从上面几点不难看出,在企业级与消费级SSD设计指标趋于一致的趋势下,硬件规格实现统一是极有可能的。而SSD产品形态的差异化则由SSD控制器上的固件体现。忆芯科技的STAR1000芯片在设计中对此做了比较成功的尝试,如图2-15所示
图2-15 STAR1000关键技术 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
2.5 案例:DERA(得瑞领新)NVMe控制器TAI和NVMe SSD产品
NVMe协议面向现代多核计算系统结构设计,充分发挥NVM介质高并发及低延迟的特性,为实现高吞吐量、低延迟的存储设备打下了良好的生态基础。DERA Storage遵循协议标准,面向企业计算市场,开发提供高性能、高可靠的NVMe SSD解决方案
控制器是NVMe SSD的核心部件,是连接主机总线和闪存单元的桥梁。本质上,一个NVMe SSD设备内部需要处理高并发的大量IO事务,每个IO事务都伴随多种硬件操作和事件处理,其中一些功能特性需要结合计算密集型的操作,比如用于数据错误检测的编解码,或者数据加密、解密,在完成这些处理的同时还要满足苛刻的功耗要求,因此不可避免地需要使用专用的硬件加速单元。综合考虑,NVMe SSD控制器一般是紧密结合NAND闪存管理软件进行高度定制化设计的ASIC(专用集成电路)。只有将数据通路、计算资源都经过合理安排调配,最终实现的NVMe SSD才能在可靠性、性能、功耗几个方面实现良好统一的目标
DERA NVMe控制器是DERA NVMe SSD产品的核心部件,TAI是DERA的第一款控制器,如图2-16。DERA TAI前端支持PCIe Gen3x8或x4接口,集成多个NAND接口通道和高强度ECC硬件编解码单元,所有数据通道均运用ECC和CRC多重硬件保护机制。在TAI控制器基础上,紧密协同设计的闪存转换层(FTL)算法负责调度管理,综合运用多种技术实现企业级的数据存储可靠性,充分发挥NAND闪存的高速存取特点,实现高可靠、低延时、高吞吐量的数据存储要求
图2-16 DERA TAI控制器 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
闪存ECC是SSD的核心功能。为了处理新结构、新工艺节点下闪存芯片的高原始误码率,以及满足高并发访问时的低延迟要求,DERA TAI控制器为每个闪存通道都配备了独立的ECC单元,纠错能力为100b/1KB,满足主流闪存器件对主控纠错能力的要求,即在复杂度、面积和功耗、解码延迟时间确定性和可控性等多个方面达到了良好的均衡。此外,DERA TAI对完整数据通道的ECC保护和CRC校验,也在不影响性能的前提下为数据可靠性提供了进一步的基础保障
DERA SSD提供完备的硬件手段持续监测供电情况,并在供电异常时触发保护策略,自动切换到后备电容或其他不间断电源供电,在整体的软件策略上予以充分配合,在发生意外掉电时最大限度保证用户数据的完整性
2.6 全闪存阵列AFA
2.6.1 整体解剖
1 结构
图2-17所示是一个标准的XtremIO全闪存阵列,含有两个X-Brick,之间用Infiniband互联。可以看出,X-Brick是核心
图2-17 XtremIO全闪存阵列结构 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
一个X-Brick包括:
- 1个高级UPS电源
- 2个存储控制器
- 磁盘阵列存储柜DAE,放有很多个SSD,每个SSD都用SAS连接到存储控制器
- 如果系统有多个X-Brick,那么需要2个Infiniband交换机来实现存储控制器高速互联
2 存储控制器
如图2-18所示,存储控制器其实就是个Intel服务器,配有2个电源,看起来是NUMA架构的2个独立CPU、2个Infiniband控制器、2个SAS HBA卡。Intel E5CPU,每个CPU配有256GB内存
图2-18 存储控制器机箱内部 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
如图2-19所示,其后面插有各种线缆,看着感觉乱糟糟的,如图2-19所示。设计的架构适用于集群,所以线缆有很多是冗余的
图2-19 X-Brick背面连线图 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
阵列正面照,LCD显示的是UPS电源状态。图2-20所示是一个个竖着的就是SSD阵列
图2-20 Xtrem-IO全闪存阵列正面照片 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
3 配置
如表2-5所示,一个X-Brick容量是10TB,可用容量7.5TB,但是考虑到数据去重和压缩大概为5∶1的比例,最终可用容量为37.5TB
表2-5 XtremIO配置表 表格来源于《深入浅出SSD:固态存储核心技术、原理与实战》
2.6.2 硬件架构
EMC XtremIO是EMC对全闪存阵列市场的突袭,它从底层开始完全根据闪存特性设计。如图2-23所示,1个X-Brick包含2个存储控制器,一个装了25个SSD的DAE,还有2个电池备用电源(Battery Backup Unit,BBU)。每个X-Brick包含25个400GB的SSD,原始容量10TB,使用的是高端的eMLC闪存,一般擦写寿命比普通的MLC长一个数量级。如果只买一个X-Brick,配有两个BBU,其中一个是为了冗余。如果继续增加X-Brick,那么其他的X-Brick只需要一个BBU
图2-23 X-Brick尺寸 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
2.6.3 软件架构
存储行业发展到今天,硬件越来越标准化,所以已经很难靠硬件出彩了。若能够制造存储芯片,例如三星这种模式,从底层开始都自己做,则可靠巨大的出货量坐收硬件的利润
1 XIO软件几大杀器
- 去重:提升性能,同时因为写放大降低,延长了闪存的寿命,提高了可靠性
- Thin Provisioning:分区的容量可以随着使用而自动增长(直到用满阵列),这样关键时刻不会影响性能
- 镜像:先进的镜像架构保证了容量和性能不会受损
- XDP数据保护:用RAID6保护数据
- VAAI集成
2 XIO软件核心设计思想
- 1)一切为了随机性能:任何节点上访问任意数据块,都不会增加额外的成本,即必须公平访问所有的资源。这样的结果就是即使节点增加,性能也能够线性增长,扩展性也好
- 2)尽可能减少写放大:对SSD来讲写放大不仅会导致寿命缩短,还会因为闪存的擦写次数升高,导致质量下降,数据可靠性下降。XIO的设计目标就是让后台实际写入的数据尽量少,起到一种数据衰减的作用
- 3)不做全局垃圾回收:XIO使用的是SSD阵列,而SSD内部是有高性能企业级控制器芯片的,当前的SSD主控都非常强大,垃圾回收效率很高,所以XIO并没有再重复做一遍垃圾回收。这样做的效果是降低了写放大,毕竟后台搬移的数据量少了,同时,节省出时间和系统资源提供给其他软件功能、数据服务和VAAI等
- 4)按照内容存放数据:数据存放的地址用数据内容生成,跟逻辑地址无关。这样数据可以存放在任何位置,提升随机性能,同时还可以针对SSD做各种优化。数据可以平均放置在整个系统中
- 5)True Active/Active数据访问:LUN没有所有者一说,所有节点都可以为任何卷服务,这样就不会因为某一个节点出问题而使性能受损
- 6)扩展性好:性能、容量等都可以线性扩展
3 XIO软件为什么运行在Linux用户态
如图2-28所示,XIO的全闪存阵列软件架构,XIO OS和XIO的软件都运行在Linux的用户态。Linux系统分为内核态和用户态,我们的应用程序都在用户态运行,各种硬件接口等系统资源都通过内核态管理,用户态通过system call访问内核资源。XIO软件运行在用户态有几大优点:
- 避免了内核态的进程切换,速度快
- 开发简单,不需要借助各种内核接口,以及复杂的内存管理和异常处理
- 不必受到GPL的约束。Linux是开源系统,程序在内核运行必然要用到内核代码,按照GPL的规定,就得开源,在用户态自己开发的应用就不受此限制
图2-28 XIO软件架构 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
在每个CPU上运行着一个XIOS程序:X-ENV,如果敲一下“top”命令,就会发现这个程序掌控所有的CPU和内存资源
- 第一个作用就是为了XIO能100%使用硬件资源
- 第二个作用是不给其他进程影响XIO性能的机会,保证性能的稳定
- 第三个作用是提供了一种可能性:未来可以简单修改就移植到UNIX或者Windows平台,或者从X86CPU移植到ARM、PowerPC等CPU架构,因为这都是上层程序,不涉及底层接口
XIO是完全脱离了硬件的软件,而且,XIO的硬件基本没有自己特殊的组件,不包含FPGA,没有自己开发的芯片、SSD卡、固件等,用的都是标准件。这样做的好处是可以使用最新、最强大的X86硬件,还有最新的互联技术,比如比Infiniband更快的技术
2.6.4 工作流程
1 6大模块
XIO软件分为6个模块,以实现复杂的功能,其中包括三个数据模块R、C、D,三个控制模块P、M、L
- P(Platform,平台模块):监控系统硬件,每个节点有个P模块在运行
- M(Management,管理模块):实现各种系统配置。通过和XMS管理服务器通信来执行任务,比如创建卷、LUN的掩码等从命令行或图形界面发过来的指令。有一个节点运行M模块,其他节点运行另一个备用M模块
- L(Cluster,集群模块):管理集群成员,每个节点运行一个L模块
- R(Routing,路由模块):把发过来的SCSI命令翻译成XIO内部的命令,负责来自两个FC和两个iSCSI接口的命令,把所有读写数据拆成4KB大小,计算每个4KB数据的Hash值,用的是SHA-1算法,每个节点运行一个R模块
- C(Control,控制模块):包含了一个映射表:A2H(数据块逻辑地址——Hash值),具备镜像、去重、自动扩容等高级数据服务
- D(Data,数据模块):包含了另一个映射表:H2P(Hash值——SSD物理存放地址)。可见,数据的存放地址跟逻辑地址无关,只跟数据有关,因为hash值是通过数据算出来的,负责对SSD的读写,负责RAID数据保护技术——XDP(XtremIO Data Protection)
2 读流程
读流程如下:
- 1)主机把读命令通过FC或iSCSI接口发送给R模块,命令包含数据块逻辑地址和大小
- 2)R模块把命令拆成4KB大小的数据块,转发给C模块
- 3)C模块查A2H表,得到数据块的Hash值,转发给D模块
- 4)D模块查H2P表,得到数据块在SSD中的物理地址,读出来
3 不重复的写流程
不重复的写流程如下,见图2-29:
- 1)主机把写命令通过FC或iSCSI接口发送给R模块,命令包含数据块逻辑地址和大小
- 2)R模块把命令拆成4KB大小的数据块,计算出Hash值,转发给C模块
- 3)C模块发现Hash值没有重复,所以插入自己的表,转发给D模块
- 4)D模块给数据块分配SSD中的物理地址,写下去
图2-29 不重复的写流程 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
4 可去重的写流程
可去重的写流程如下,见图2-30:
- 1)主机把写命令通过FC或iSCSI接口发送给R模块,命令包含数据块逻辑地址和大小
- 2)R模块把命令拆成4KB大小的数据块,计算出Hash值,转发给C模块
- 3)C模块查A2H表(估计还有个H2A表,或者是个树、Hash数组之类),发现有重复,转发给D模块
- 4)D模块知道数据块有重复,就不写了,只是把数据块的引用数加1
图2-30 可去重的写流程 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
5 ESXi和VAAI
ESXi内嵌在操作系统中,所以ESXi可以看成是虚拟机平台,上面运行着很多虚拟机
VAAI(vStorage APIs for Array Integration)是虚拟化领域的标准语言之一,其实就是ESXi等发送命令的协议
6 复制流程
图2-31所示是复制前的数据状态,复制流程见图2-32,如下:
- 1)ESXi上的虚拟主机用VAAI语言发了一个虚拟机(VM)复制的命令
- 2)R模块通过iSCSI或FC收到了命令,并选择一个C模块执行复制
- 3)C模块解析出命令内容,把原来VM的地址范围0~6复制到新的地址7~D,并把结果发送给D模块
- 4)D模块查询Hash表,发现数据是重复的,所以没写数据,只把引用数增加1
图2-31 复制前的数据状态 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
图2-32 复制流程 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
7 回顾R、C、D模块
R和上层打交道,C是中间层,D和底层SSD打交道,1个X-Brick的控制服务器有2个CPU,每个CPU运行一个XIOS软件。如图2-33所示,R、C模块运行在一个CPU上,D则运行在另一个CPU上
图2-33 X-Brick内部互联图 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
因为Intel Sandy Bridge CPU集成了PCIe控制器(Sandy Bridge企业版CPU集成了PCIe 3.0接口,不需要通过南桥转接)。所以,在多CPU的架构中,让设备直连CPU的PCIe接口,性能就会很高,而R、C、D的分布也是按照这个需求来设计的。例如SAS转接卡插到了CPU 2的PCIe插槽上,所以D模块就要运行在CPU 2上,这样性能才能达到最优。从这里,我们又可以看出XIO的架构上的优点,就是软件完全可以按照标准化硬件来配置,通过布局达到最优的性能。如果CPU的分布变化了,也会根据新的架构简单调整软件分布来提升性能
8 模块间通信:扩展性极佳
模块间如何通信?其实并不要求模块必须在同一个CPU上,就像图2-33所示一样,R和C并不一定要在一个CPU上才行。所有模块之间的通信通过Infiniband实现,数据通路使用RDMA,控制通路通过RPC实现。XIO的IO总共延时是600~700μs,其中Infiniband只占了7~16μs。使用Infiniband来互联的优点是为了扩展性,X-Brick即使增加,延迟也不会增加,因为通信路径没变化。任意两个模块之间还是通过Infiniband通信,如果系统里面有很多R、C、D模块,当一个4KB数据块发到一个前端R模块上,它会计算Hash值,Hash会随机落在任意一个C上,没有谁特殊。这样一切都是线性的,X-Brick的增减会线性地导致性能增减
2.7 带计算功能的固态硬盘
支撑巨大数据网络的根基是IT基础设施,主要包括网络、计算和存储三大部分。如图2-34所示,IT基础架构的功能就跟加工贸易差不多,网络是数据的搬运工,计算是数据的加工商,存储就是数据的窝。自从有了固态硬盘之后,存储就不是事儿了,最新的PCIe 3.0x8SSD,读写带宽能达到4GB/s以上!一方面存储进步快,而另一方面CPU又受摩尔定律失效限制,工艺进展缓慢,所以,计算成了瓶颈,尤其是在图像和视频处理、深度学习等方面。海量数据能够从PCIe SSD高速读写,但就是CPU处理不过来
图2-34 IT基础架构 图片来源于《深入浅出SSD:固态存储核心技术、原理与实战》
带FPGA的SSD——CFS(Computing Flash System,计算闪存系统)。它采用PCIe 3.0x8高速接口,性能可达5GB/s。SSD提供高速数据存储,FPGA能提供计算加速,这样数据从SSD出来就由FPGA顺带算好,释放了CPU。一切回归原位,CPU做控制,FPGA做计算,SSD做存储
它的优势主要体现在海量数据高速存储和人工智能计算方面。想一想就会有很多场景,比如无人驾驶汽车,目前一般的无人驾驶汽车配备了毫米波雷达、激光雷达、高速摄像头等各类传感器。每秒会产生1GB数据,要分析这么多数据需要强大的计算能力。很多无人驾驶汽车还在使用GPU进行计算。目前市场上在卖的一个CPU+GPU计算盒,功耗能达到5000W,对于汽车来说,这个小火罐的散热会带来很大的安全风险,同时也很耗电。但是,如果换用了FPGA方案,功耗就可以降下来,根据无人驾驶的应用场景对算法进行优化之后,计算性能也能满足需求。例如,奥迪公司的无人驾驶汽车就采用了FPGA计算平台。这些传感器产生的数据目前都是丢掉,非常可惜,未来商用之后,不管是政府还是厂商都有存储宝贵的行驶数据并备份到云端的需求。这些数据对于完善无人驾驶、分析车祸现场都非常有用。要保存这些数据,只有PCIe SSD才能达到1GB/s以上的写速度。所以,FPGA SSD一方面能够快速存储行驶数据,一方面又可以提供FPGA进行数据分析,完美满足无人驾驶的计算与存储需求
自从人工智能开始新一轮的热潮之后,很多公司都开始用FPGA做人工智能计算,用了CFS,就可以直接用FPGA里的人工智能硬件算法对SSD内部的海量数据进行高速分析,最后把分析结果发送给主机
致谢《深入浅出SSD:固态存储核心技术、原理与实战》
希望本文对大家有帮助,上文若有不妥之处,欢迎指正
分享决定高度,学习拉开差距