RAID&SCSIRAID命令处理过程中的关键问题I/O分解磁盘阵列接收到主机的I/O请求命令,派生出对应于各个磁盘上的子I/O命令I/O命令的形式?SCSI协议支撑存储发展的脊梁SCSI:SmallComputerSystemInterface,计算机与外部设备(特别是存储设备)间系统级接口的标准;SCSI标准定义了命令、通信协议、实体电器特性等(物理层,连接层,通信层,应用层)SCSI历史SCSI协议V1版本:5MB/s,8位总线带宽,最多连接7个设备,25针SCSI协议V2版本:20MB/s(Fast-Wide),16位数据带宽、15个设备,50针或68针。高主频的SCSI存储设备陆续出现并成为市场的主流产品,也使得SCSI技术牢牢地占据了存储市场SCSI历史SCSI-3协议:320MB/s或更高,增加了能满足特殊设备协议所需要的命令集,使得SCSI协议既适应传统的并行传输设备,又能适应最新出现的一些串行设备的通信需要,如光纤通道协议(FCP)、串行存储协议(SSP)、串行总线协议等串行SCSI——SAS–第一代SAS1.5Gbps–第二代SAS3.0Gbps–第三代SAS6.0GbpsSCSI在系统中的地位SAM-3结构Device-TypeSpecificCommandSetsPrimaryCommandSet(foralldevicetypes)SCSITransportProtocolsInterconnectsArchitectureModelFC、SCSI、SAS、IB等PHYFCP、iSCSI、SBP等SPC1-4SBC、SMC、SSC,SCCSCSI通信服务模型“客户-服务器”模型SCSI目标器SCSI启动器客户应用程序逻辑单元设备服务器任务管理器服务请求服务响应管理请求管理响应SCSI通信模型应用层SCSI应用程序SCSI应用程序应用程序协议传输层SCSI传输协议SCSI传输协议传输协议互连层SCSI互连服务SCSI互连服务互连接口启动器目标器并行SCSI状态变迁总线空闲选择仲裁复选消息输出命令数据输出或输入状态消息输入ResetSAS(SerialAttachedSCSI)简介产生–并行SCSI发展到Ultra320,没有提升空间–低端的SATA性能、可靠性受限特点–SCSI向下兼容性、串行点对点互连、双端口、寻址性和向小型化的扩展能力于一身–可提供大数量设备、高带宽、可扩展性支持SAS在SAM中的位置InterconnectsProtocolsCommandsCommandsSCSIBlockCommands(SBC)SCSIStreamCommands(SSC)SCSIGraphicCommands(SGC)ATA/ATAPICommandsSCSIPrimaryCommands(SPC)SCSIInterlockedProtocol(SIP)FibreChannelProtocol(FCP)iSCSISerialSCSIProtocol(SSP)SerialATATunnelingProtocol(STP)SCSIParallelInterfaceFibreChannelInternetSerialAttachedSCSI(SAS)….SASSAS连接SAS域–一个SAS域主要由SAS初始设备(SASInitiatorDevice),扩展设备(ExpanderDevice),以及SAS目标设备(SASTargetDevice)组成SAS连接连接实例理论上,每个“边缘Expander”可以支持128个端口,每个SAS域可以有128个“边缘Expander”,因此,每个SAS域中最多可以有128x128=16384个端口。当然,内部互联至少要占用若干个端口。对SCSI设备的访问通过三元组:总线(Bus,Channel)目标(Target,ID)LUN(LogicalUnitNumber)Linux系统SCSI中间层(SCSIMiddleLevel)定义了“scsidevice”的数据结构SCSICDB(CommandDescriptorBlock)SCSI命令TypicalCDBfor6-bytecommandsINQUIRY(0x12)REPORTLUNS(0xA0)TESTUNITREADY(0x00)REQUESTSENSE(0x03)READ(0x08)WRITE(0x0A)MODESELECT(0x15)MODESENSE(0x1A)SCSI命令TypicalCDBfor10-bytecommandsREAD_CAPACITY(0x25)READ_10(0x28)WRITE_10(0x2a)WRITE_VERIFY(0x2e)VERIFY(0x2f)SYNCHRONIZE_CACHE(0x35)MODE_SELECT_10(0x55)MODE_SENSE_10(0x5a)SCSI命令TypicalCDBfor12-bytecommandsREAD_12(0xa8)WRITE_12(0xaa)WRITE_VERIFY_12(0xae)SEARCH_HIGH_12(0xb0)SEARCH_EQUAL_12(0xb1)SEARCH_LOW_12(0xb2)SCSI命令TypicalCDBfor16-bytecommandsSCSI命令TypicalCDBforlongLBA16-bytecommandsREAD_16(0x88)write_16(0x8a)Readcapacity_16(0x9e)命令码GroupcodeAMeaningexample0000,16字节命令0x08,0x120012,310字节命令0x25,0x2a,0x350104,510字节命令0x55,0x5a0116,7reserved1008,916字节命令0x88,0x8a,x09e101A,B12字节命令0xa8,0xaa110C,DVendorspecific111E,FVendorspecificAB0xDiskArrays-23命令分解举例(RAID0)08419521063117RAIDControllerHost命令分解举例(RAID0)设阵列由4个磁盘构成,每个磁盘容量为C,则主机用户看到的阵列为一个容量为4C的大磁盘;数据分块大小为4KB,构成的阵列结构如下:4KB4KB4KB4KB4KB……04812…4KB4KB4KB4KB4KB……15913…4KB4KB4KB4KB4KB……261014…4KB4KB4KB4KB4KB……371115…块号磁盘0磁盘1磁盘2磁盘3设主机请求读32KB的数据,起始地址为16(单位:扇区),SCSI命令为:(0x08,0x00,0x00,0x10,0x40,0x00)0(块号)4128……03264…15139……84072…261410……164880…371511……245688…要读的数据在磁盘上的分布扇区号实际上主机要读的数据就是上图中的2~9块,并且是按照2,3,4,…,9的顺序。对应单个磁盘上的子命令:磁盘1:0(块号)4128……0816…0x000x080x080x000x000x080x000x080x100x000x000x080x000x100x080x000x000x08合并1(块号)59……0816…0x000x080x080x000x000x080x000x080x100x000x000x080x000x100x080x000x000x08合并磁盘2单个磁盘上的扇区号磁盘32(块号)61410……0816…0x000x080x000x000x000x080x000x080x080x000x000x080x000x100x000x000x000x08合并磁盘43(块号)71511……0816…0x000x080x000x000x000x080x000x080x080x000x000x080x000x100x000x000x000x08合并数据在内存中的分布:经过命令合并(减少I/O次数),采用普通DMA方式从磁盘读出数据在内存中分布如下:…4k…4k4k…4k…4k4k…4k4k块号:4,85,92,63,7磁盘1磁盘2磁盘3磁盘44k4k4k4k4k4k4k4k……块号:2,3,4,5,6,7,8,9重组写过程:32KB的数据程度,起始地址为16(单位:扇区),SCSI命令为:(0x0A,0x00,0x00,x10,0x40,0x00)0(块号)4128……03264…15139……84072…261410……164880…371511……245688…要写的数据在磁盘上的分布扇区号内存中分块数据-磁盘数据对应关系:0(块号)4128……15139……261410……371511……内存23456789……0(块号)48……0816…0x000x080x080x000x000x0A0x000x080x100x000x000x0A0x000x100x080x000x000x0A合并对应磁盘1上的写命令:单个磁盘上的扇区号分块重组后内存-磁盘对应关系:0(块号)4128……15139……261410……371511……内存26483759……数据分块重组带来的问题—数据移动分块前26483759……23456789……重组后…4k…4k4k…4k…4k4k…4k4k块号:4,85,92,63,7磁盘1磁盘2磁盘3磁盘44k4k4k4k4k4k4k4k……块号:2,3,4,5,6,7,8,9重组读命令同样存在这个问题时间开销问题:减少磁盘I/O操作的次数极大地提高阵列的性能,所以采用了I/O合并技术,I/O合并引起数据在内存中的移动,这种移动开销相对于磁盘I/O开销要小的多,但性能的影响还是相当大的(近25%)。如何消除这种不必要的开销?聚/散技术消除数据移动带来的额外开销,聚散技术的基本思想是将散落在内存的各块数据聚集起来传输。23456789……0(块号)48……0816…0x000x100x080x000x000x0A对应磁盘1上的写命令聚散格式:单个磁盘上的扇区号23456789……聚/散数据结构SCSI命令数据长度起始地址数据长度起始地址聚散表…使用聚散技术的阵列控制流程模型命令分解…磁盘(n-1)的I/O任务队列命令合并返回主机……………内存空间内存空间…磁盘0的I/O任务队列聚散表聚散表表头指针主机I/O请求RAID5命令分解过程:0123(盘号)0(块号)3P……619P……42P10……7P11……85阵列参数:左不对称,4块盘,分块大小为2K读命令:0x08,数据长度16k,起始地址为00(块号)3P……619P……42P10……7P11……85则要读的有效数据为图中的0~7块0号盘上的子命令:0(块号)3P……6顺序读出0,3,6块,可以合并为一个读命令,数据长度为6k1号盘上的子命令:顺序读出1,4块,可以合并为一个读命令,数据长度为4k19P……42号盘上的子命令:读2号块和7号有效数据块,为了减少I/O次数,把它们合并再一起读,把中间夹的校验块也读出来,数据总长度为6k,有效的为4k2P10……73号盘上的子命令:只有5号块,长度为2kP11……85写命令:0x0a,数据长度16k,起始地址为00(块号)3P……619P……42P10……7P11……85则要写的有效数据为图中的0~7块满条满条大写0号盘上的子命令:0(块号)3P……6顺序写出0,3,6块,可以合并为一个读命令,数据长度为6k1号盘上的子命令:顺序写1,4块,19P……4计算校验命令;写新校验命令,它可以和上面的写合并,但要放在计算校验之后1.计算校验P2.写数据和校验命令(合并为1条命令)2号盘上的子命令:1.计算校验2.写2,P,7块2P10……71.计算校验P2.写数据和校验命令(合并为1条命令)3号盘上的子命令:P11……851.读旧的数据命令2.计算校验命令3.写数据和校验(合并为1命令)写命令