AirJD 焦点
AirJD

没有录音文件
00:00/00:00
加收藏

谈PCIe ssd在数据库优化中的作用II之颠覆性创新 by 吕智超@宝存科技

发布者 firmware
发布于 1452819795096  浏览 5787 关键词 存储, 固件Firmware 
分享到

第1页

谈PCIe ssd在数据库优化中的作用II之颠覆性创新

Apr 2015 Shannon Systems

宝存科技



第2页

关于摩尔定律

• 由于基于Flash闪存存储设备的出现;处理器,内存和存储设备终于都可 以遵循摩尔定律实现快速的发展.



12 核心, 24 线程 @3.2Ghz



DDR4 DRAM@2133MHz 768GB @2U



500K IOPS, 9us 延迟 50TB 裸容量 @2U



第3页

当谈及数据库应用的存储方案时

• 容量 • 性能 • 安全性 • 应用成本 • Flash 存储起到的作





第4页

基于Host的PCIe Flash存储的优化与方案

• 超大容量高可用Flash存储(Ultra-capacity and highly available Flash)

• 原子写(Atomic Write) • Redo log 优化(Redo log optimization)



第5页

大容量Flash存储(Ultra Capacity Flash Storage)

• 常规方案:

– HBA – 软RAID

• 缺点

– 不支持Flash存储设备的高级特性, 比如Trim, S.M.A.R.T信息等. – 性能损耗 – 容错性差,风险高, 如意外掉电数据安全性问题,连续故障等.



第6页

大容量Flash存储(Huge Capacity Flash Storage)

• 轮转式校验数据存储, 最多可有一个SSD故障 • 由于没有校验数据缓存,数据的随机写入会导致:

– 在系统层面,写放大系数一定大于2(过大). – 更快速的寿命损耗. – 会出现”写洞”现象, 影响数据一致性.



第7页

RAID5处理随机数据写入的步骤

• 4K 随机写第一步: 写入待写数据



当磁盘A被数据填满时,会发生写放大现象





第8页

RAID5处理随机数据写入的步骤

• 4K 随机写第二步:读取原校验数据



第9页

RAID5处理随机数据写入的步骤

• 4K 随机写第三步:计算出新的校验数据



第10页

Random writes in RAID-5

• 4K 随机写第四步:更新校验数据



第11页

大容量Flash存储(Huge Capacity Flash Storage)

• 由于 RMW(read-modify-write), RCW(read-reconstruct-write) 导致 了物理双写, 使整个Array 的WAF(写放大因子) 远远大于2

• 在 RMW, RCW 过程中如果系统出现其他故障可导致交验数据更新不成 功, Write Hole(写洞) 现象产生, 带来数据一致性问题.



第12页

大容量Flash存储(Huge Capacity Flash Storage)

• 随机写性能不是随着阵列中的磁盘数量线性增长.

8 盘 (RAID-5) vs 4 盘 (RAID-5)



第13页

PCIe-RAID



第14页

PCIe-RAID

• 目的:

– 满足应用程序的大容量需求 – 避免单点故障(硬件故障,多发性Flash芯片失效,主控失效等.) – 解决传统的RAID5阵列写性能极差的问题 – 解决传统的闪存盘阵列会有很大的写放大现象. – 解决传统SSD硬盘性能稳定性和性能一致性不足的问题

• 目标: 在系统中提供一个集大容量,高性能和高可靠性的逻辑块设备.



第15页

PCIe-RAID

• 技术关键点:

– 软件FTL层 – 跨设备FTL层 – 基于PBA的RAID – 采用2维RAID,以达到最大的保护效果



第16页

PCIe-RAID

• Host-Based 将FTL的实现从Flash存储设备中移至主机 • 统一FTL和RAID层,可以解决传统RAID存在的诸多问题



Conventional RAID5 of SSDs



The new RAID5 architecture 16



第17页

PCIe-RAID

• 2维RAID, 最大化数据保护



第18页

Demo



第19页

PCIe-RAID

• 性能(保守): • 4K RW 30W+ IOPS • 4K RR 50W+ IOPS • 延迟: R:80us / W:15us • 冗余度/维护: • PCIe RAID 5 允许一个PCIe Flash设备彻底失效. • 未来有可能支持RAID10 • PCIe 接口支持热备设备, 8639接口支持热插拔,热维护. • 综合OP可以最多释放到15%以下,更大的用户空间



第20页

PCIe-RAID

• 高密度

– 2U 服务器, 最多可以部署6张全高的PCI-E 板卡, 如 HP DL380 Gen9 – ~50TB 裸容量, 最高40TB的用户可用容量

– 3U 服务器, 最多可以部署11张全高的PCI-E 板卡, 如 Supermicro Gen X9DRX+-F

– ~90TB 裸容量, 最高80TB的用户可用容量



第21页

PCIe-RAID

• 优势:

– 大容量,高性能 – 全局垃圾回收GC和磨损均衡(WL) – 基于PBA的RAID 构建实现, RAID5的全局写放大系数远远小于2, 更高的

Flash 寿命 – 避免RMW/RCW – 避免传统RAID5所带来的性能损耗. – Host-Base 的UniFTL 可以感知校验数据状态,避免”写洞”(WriteHole)



第22页

原子写(Atomic Write)

• 原子操作: 读/写 • Page 和 Buffer. • Flash Page: Flash 的原子读取, 写入单位, 多以4K为例, 但是在现

代Flash产品中 实际多为16KB/32KB. • InnoDB Page: 是InnoDB 的原子读取,写入单位. 一般为16KB. • PCIe Flash Write Buffer(以Direct-IO产品为例): 主控中的SRAM, 3

组,每组32KB. • InnoDB Double Write buffer: 主机内存中的空间,用来存储Double

Write 数据, 2MB



第23页

原子写(Atomic Write)



• 传统硬件和操作系统不能保证 InnoDB Page 写入这一操作的原 子性

• InnoDB使用Double write这个特 性来避免InnoDB Page写入不完 整的问题.



Page Page



copy



• Double Write 缺点: • 数据写入量加倍(Bad For

Flash)

• 增加了写入负载(不是2倍)



write



Doublewrite Doublewrite



(1MB)



(1MB)



共享表空间



Double write buffer (2MB)



write recovery



数据文件 (.ibd)



第24页

原子写(Atomic Write)

• InnoDB Page Size: 16KB • Flash Page Size: 32KB • 对NAND Flash 闪存的页进的行读写操作都是

原子操作.

• 如果我们确保将每个InnoDB Page 一次性的写 入一个Flash Page(InnoDB Page Size<= Flash Page Size),那么InnoDB Page 写入就 是原子操作.

• 保证InnoDB Page 数据存储不跨 Flash Page.



A nand block



Flash Page



第25页

原子写(Atomic Write)

• Direct-IO 产品中原子写的实现



• InnoDB Page Size 16KB • InnoDB Write Request Size 16KB (多数情况) • Flash(主控) Write Buffer Size 32KB *3 • Flash Page Size 32KB



InnoDB Page 16K



Write Request 16K



Write Buffer 32K

Write Request 16K



flush

Atomic



Flash Page 32K



第26页

原子写(Atomic Write)



• 当Request Size <= Flash Write Buffer(32KB) 时



Write buffer









Flash Write Buffer 为空时 所有数据先入Write Buffer,



再刷入Flash



Page.bio



Nand page



• 在突然断电时,只有完全写入了Flash Write Buffer的BIO(block io) Request会被刷入NAND bio 闪存的页

• 没有完全被写入Flash Write Buffer的bio(block io)会被丢弃.

• 保证小于32KB(InnoDB Page 16K)写入操作的原子 性.



Flush on power cut



第27页

原子写(Atomic Write)



• 如果 Flash Write Buffer 是Half



Full的.



• Write Request Size <= Free Space



of Flash Write Buffer



bio



• 同上



• Write Request Size > Free Space bio of Flash Write Buffer

• 将本组Write Buffer 剩余空间用垃圾 数据填充, 新开一组Write Buffer 来 承接这个新的Write Request.



Write buffer



Nand page



bio



Flush on power cut



第28页

原子写(Atomic Write)

• 有时连续的写请求会被合并为一个大 BIO(Block IO)

• Write Request > Flash Page Size 32K bio







数据会不经过Write Buffer被直接写 入一个新的 Flash Page(延迟稍高).



bio



Write buffer



第29页

原子写(Atomic Write)

• 应用原子写的条件 • Write Request Size <= Write Buffer Size 32KB • 16KB <= 32KB √ • 不要在MySQL/InnoDB/文件系统/块设备层面,分割/合并任何BIO • O_DIRECT, Double Write=0 √ • Flash FTL 可感知 BIO 的相关信息, Host-Base Flash Only. • Shannon 或 Fusion-IO(SanDisk) √



第30页

原子写(Atomic Write)

• 应用原子写的效益

– Double Write = 0 – 性能提升TPS ~10% (Shannon Systems Lab) – 延迟降低 ~50% (Shannon Systems Lab) – Flash存储产品的寿命 200%, 可靠性增强.



第31页

Shannon vs Fusion-IO

Fusion-IO

1, 必须要使用DFS 2, 使用特殊API (Patched App).



Shannon

1, 可以在任何文件 系统中被使用. 2, 与现有文件系统 使用相同的 API.



第32页

Redo Log 优化(Redo log optimization)

• InnoDB 具有先写日志特性. redo log 落地后, 就认为数据库完整. • redo log: 写入单位512 Byte, 顺序写.

• Flash Storage(以Direct-IO 产品为例) • Write Buffer: 32KB *3 • Direct-IO 主控: 2 Data Pipelines • 每个 Data Pipeline 独占一组 Write Buffer 32KB • 2个 Pipelines 共享最后一组 Write Buffer, 抢占, 锁 • 数据入Write Buffer ,向上汇报写入完成, 后台Flush Data to Nand, 掉电保护由

硬件完成.



第33页

Redo Log 优化(Redo log optimization)

• 我们能做什么? • 如果我们预留一组Pipeline 和 Write Buffer. 专门处理redo log • 在Driver 中调高 此种BIO 的优先级. • 期望收益: 性能提升

• 问题: • 如何将redo log 的IO请求, 与其他的IO请求进行区分? • 如何让Driver 感知特殊类型的IO?



第34页

Redo Log 优化(Redo log optimization)

• 解决方法: • 在应用/FS层对redo log 的IO请求加入特殊的Flag, 用来识别这种特殊IO请求. • Patch MySQL/InnoDB • Patch FS/EXT4



第35页

Redo Log 优化(Redo log optimization)

• Flag 的选择 • Linux 系统中所有的io请求都会用 summit_bio()来进行下发 • bio(bio_request)是在<linux/bio.h>中定义的结构体.



第36页

Redo Log 优化(Redo log optimization)



• bio 数据结构

struct bio { sector_t struct bio struct block_device unsigned long unsigned long unsigned short unsigned short unsigned short unsigned short unsigned int unsigned int unsigned int unsigned int struct bio_vec bio_end_io_t atomic_t void bio_destructor_t

};



bi_sector; *bi_next; *bi_bdev; bi_flags; bi_rw; bi_vcnt; bi_idx; bi_phys_segments; bi_hw_segments; bi_size; bi_hw_front_size; bi_hw_back_size; bi_max_vecs; *bi_io_vec; *bi_end_io; bi_cnt; *bi_private; *bi_destructor;



/* associated sector on disk */ /* list of requests */ /* associated block device */ /* status and command flags */ /* read or write? */ /* number of bio_vecs off */ /* current index in bi_io_vec */ /* number of segments after coalescing */ /* number of segments after remapping */ /* I/O count */ /* size of the first mergeable segment */ /* size of the last mergeable segment */ /* maximum bio_vecs possible */ /* bio_vec list */ /* I/O completion method */ /* usage counter */ /* owner-private method */ /* destructor method */



第37页

Redo Log 优化(Redo log optimization)



• unsigned long



bi_flags;



/* status and command flags



*/



• 无符号长整型, 64bit. 约定第16bit 设置为1 来标记redo log 的io 请求



• EXT4_PRIO_FL=16, MySQL/InnoDB Flag



• BIO_RW_PRIO=16, FS/EXT4 Flag



第38页

Redo Log 优化(Redo log optimization)

• Patch MySQL/InnoDB • os_file_create_func • os_file_set_nocache 设置redo log 文件为O_DRIECT • 判断文件类型, 如果为OS_LOG_FILE 设置Flag, 使用ioctl将Flag交给FS • flags = flags | EXT4_PRIO_FL; • ioctl(file, EXT2_IOC_SETFLAGS, &flags);



第39页

Redo Log 优化(Redo log optimization)

• Patch FS/EXT4 • 判断MySQL/InnoDB 传下来的flag • if (EXT4_I(inode)->i_flags & EXT4_PRIO_FL) • 设置Flag 传给Direct-IO Driver • bio->bi_flags = bio->bi_flags | (1 << BIO_RW_PRIO);



第40页

Redo Log 优化(Redo log optimization)

• Flash Storage Driver • 保留一个 Data Pipeline 和 一组Write Buffer(二者绑定) • 判断 bio->bi_flags & (1 << bio_rw_prio) • 将符合条件的BIO 优先下发给保留的Pipleline 和 Write Buffer.



第41页

Redo Log 优化(Redo log optimization)

• redo log 优化应用条件 • Patched MySQL/InnoDB √ 改动不会超过20行. • Patched FS/EXT4 etc. √ 改动不会超过20行. • Shannon Direct-IO PCIe SSD √ • Enable Atomic Write Feature when Direct-IO Driver loads • Enable redo log optimize Feature when Direct-IO Driver loads



第42页

Redo Log 优化(Redo log optimization)

• redo log 优化效益 • 性能提升 > 100% (In Shannon Systems Lab)

• NOTE: • 如果没有Patch MySQL/InnoDB FS/EXT4 就在Direct-IO Dirver中开启redo log

optimize 特性 • Direct-IO 产品性能表现会变差, 因为资源一直被预留不被使用. • 开启redo log optimize 特性后, 如果直接关闭该特性. • 会有非常小的几率引发一个Flash Page 的数据一致性问题. • Shannon Systems 建议在关闭之后reformat Flash Storage



第43页

当谈及数据库应用的存储方案时

• 容量 • 性能 • 安全性 • 应用成本



第44页

当谈及数据库应用的存储方案时

• 容量: • 6.4TB/12.8TB 单设备 (大容量) • PCIe RAID(超大容量)



第45页

当谈及数据库应用的存储方案时

• 性能: • 原生PCIe Flash 本身具有的超高性能. • 原子写(10%) • redo log 优化(>100%)



第46页

当谈及数据库应用的存储方案时

• 安全性: • 原子写(写入完整性) • PCIe RAID(单点,写洞) • 掉电数据保护



第47页

当谈及数据库应用的存储方案时

• 应用成本: • Flash Storage 成本优化空间 • 高密度,大整合比 • 性能提升带来性价比提升



第48页

当谈及数据库应用的存储方案时

• 容量 √ • 性能 √ • 安全性 √ • 应用成本 √



第49页

Q&A



第50页

上海宝存信息科技有限公司 Shannon Systems

上海市杨浦区大连路588号宝地广场A座305室 Suite 305 Tower A Baoland Plaza 588 Dalian Road Yangpu Shanghai 200082

021-5558-0181 contact@shannon-sys.com

www.shannon-sys.com

Thanks for your time.



第51页

Flash存储中的LBA(逻辑地址)与PBA( 物理地址)动态映射

• 传统的RAID控制器会仍然将Flash存储视为普通的传统硬盘. • 存储与传统硬盘有着本质的区别,即将LBA动态映射给PBA.



第52页

存储中的非动态因素

• 在Flash存储中,物理块地址(PBA)是”静态”因素 • 可以基于”静态”的PBA来构建RAID • 将FTL的实现从Flash存储中移至主机中将特别有利于基于PBA的RAID阵

列的构建.



第53页

在FTL层构建RAID的原理 (1)

• 初始状态

– 数字代表LBA – 区块代表PBA



第54页

在FTL层构建RAID的原理(2)

• 后续状态

– 数字代表LBA – 区块代表PBA



支持文件格式:*.pdf
上传最后阶段需要进行在线转换,可能需要1~2分钟,请耐心等待。