分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
给SSD(固态硬盘)编程(1):简介和目录
英文出处: Emmanuel Goossaert (CodeCapsule.com) 。欢迎加入 翻译组 。
简介
我想为我的键值对存储项目弄一个固态硬盘(SSD)最佳存储解决方案。为此,我必须确保我完全了解SSD是如何工作的,这样就可以优化我的hash表实例来适合SSD的内部特征。网上有很多不完全和相悖的的信息,找到关于SSD的可靠信息并不简单。为了找到适当的文献和基准以说服自己,我必须要进行大量的阅读。如果我要为SSD编程,我需要知道我在做什么。
研究完之后我搞明白了,相信将我所得到的结论向大家分享会有用的。我的意图是将所有的可用信息转化为实用知识。最后我写了一篇30页的文章,但它不太适合发布在博客上。因此我决定将这篇文章分为数个可被独立消化的数个逻辑部分。而目录在本文的下方。
第六部分有最为显著的贡献,这一部分是整个“为SSD编程”文章系列的总结,我相信那些心急的程序员最为喜欢。这个总结涵盖了SSD的基本知识以及所有推荐的实现固态硬盘的最佳读写性能的访问模式。
另外一个重要的细节是,“为SSD编程”与我的键值对存储项目(IKVS series)之间是相互独立的,因此并不需要IKVS文章中的知识。我正打算写一篇关于IKVS series的文章,内容是关于 如何用hash表来实现利用SSD的内部特征,不过我还没有具体的发布时间。
我唯一的遗憾就是,我还没有写任何代码,以证明我建议的访问模式确实是最好的。但是即使有这些代码,我也需要在大量不同的固态硬盘上测试性能基准,这将消耗我所不能承受的大量的时间和金钱。我仔细列举了我引用的文章,如果你认为我的建议不对,请留下评论指明。当然,如果你有什么疑问或想在任何方面做出贡献,请随意留下评论。
最后,不要忘了订阅电子报,以便在每当有新文章发表在Code Capsule上时能够收到通知。订阅面板在博客的右上角。
目录
1. SSD的结构
1.1 NAND闪存单元
1.2 SSD的组织
1.3 制造过程
2. 基准和性能指标
2.1 基本基准
2.2 预处理
2.3 任务负载和指标
3. 基本操作
3.1 读、写、擦除
3.2 写入的例子
3.3 写入放大
3.4 耗损均衡
4. 闪存转换层(FTL)
4.1 FTL的必要性
4.2 逻辑块映射
4.3 产业状态的备注
4.4 垃圾回收
5. 高级功能
5.1 TRIM
5.2 预留空间
5.3 完全抹除
5.4 本地命令队列(NCQ)
5.5 掉电保护
6. SSD的内部并行
6.1 被限制的I/O总线带宽
6.2 多层并行
6.3 块的集群
7. 访问模式
7.1 定义顺序和随机I/O操作
7.2 写入
7.3 读出
7.4 合并读写
8.系统操作
8.1 分区对齐
8.2 文件系统参数
8.3 操作系统I/O调度
8.4 交换空间
8.5 临时文件
下一部分
第二部分在这。如果你比较忙,你可以直接去总结了所有其他部分内容的第六部分
为SSD编程(2):SSD的架构和基准
本第二部分包含了“为SSD编程”的6个内容,包括1、2两节,你可以参考目录。这是我在阅读了各种关于SSD的文档之后,为了分享我所学到的东西写的一系列文章。如果你没有时间慢慢看,你可以直接跳转到第六部分,这部分总结了所有其他部分的内容。
在本部分,我将解释NAND闪存的基本知识、闪存单元类型、和基本SSD内部架构。同样包括了SSD基准和如何解释这些基准。
1. SSD的架构
1.1 NAND闪存单元
固态硬盘(SSD)是基于闪存的数据存储设备。每个数据位保存在由浮栅晶体管制成的闪存单元里。SSD整个都是由电子组件制成的,没有像硬盘那样的移动或者机械的部分。
在浮栅晶体管中,使用电压来实现每个位的读写和擦除。写晶体管有两个方法:NOR闪存和NAND闪存。我不会更加深入的讨论NOR和NAND闪存的不同。本文将只包含被大多数制造商采用的NAND闪存。更多关于NOR和 NAND的不同点的信息,你可以参考Lee Hutchinson写的这篇文章[31]
NAND闪存模块的一个重要特征是,他们的闪存单元是损耗性的,因此它们有一个寿命。实际上,晶体管是通过保存电子来实现保存比特信息的。在每个P/E循环(Program/Erase,“Program”在这表示写)中电子可能被晶体管误捕,一段是时间以后,大量电子被捕获会使得闪存单元不可用。
有限的寿命
每个单元有一个最大的P/E 循环数量,当闪存单元被认为有缺陷后,NAND闪存被损耗而拥有一个有限的寿命。不同类型的NAND闪存有不同的寿命[31]。
最近的研究表示,通过给NAND一个相当高的温度,被捕获的电子可以被清除[14, 51]。尽管这仍然还只是研究,并且还没有确定到底哪一天能够将这个研究应用的消费市场,但这确实可以极大地增加SSD的寿命。
目前业界中的闪存单元类型有:
- 单层单元(SLC),这种的晶体管只能存储一个比特但寿命很长。
- 多层单元(MLC),这种的晶体管可以存储2个比特,但是会导致增加延迟时间和相对于SLC减少寿命。
- 三层单元(TLC),这种的晶体管可以保存3个比特,但是会有更高的延迟时间和更短的寿命。
闪存单元类型
固态硬盘(SSD)是基于闪存的数据存储设备。比特存储在闪存单元中,有三种闪存单元类型:每个单元1比特(单层单元,SLC),每个单元2比特(多层单元,MLC),和每单元3比特(三层单元,TLC)。
下方的表1中是每种NAND类型的详细信息。为了比较,我添加了硬盘、内存、和L1/L2缓存的平均延迟。
SLC | MLC | TLC | HDD | RAM | L1 cache | L2 cache | |
P/E循环 | 100k | 10k | 5k | * | * | * | * |
每单元比特数量 | 1 | 2 | 3 | * | * | * | * |
寻址用时(μs) | * | * | * | 9000 | * | * | * |
读取用时(μs) | 25 | 50 | 100 | 2000-7000 | 0.04-0.1 | 0.001 | 0.004 |
写入用时(μs) | 250 | 900 | 1500 | 2000-7000 | 0.04-0.1 | 0.001 | 0.004 |
擦除用时(μs) | 1500 | 3000 | 5000 | * | * | * | * |
备注 | * 该种计量不适用此种存储设备 | ||||||
引用 | P/E 循环 [20] |
表1:NAND闪存不同类型的特征和用时与其他记忆组件比较
在相同数量的晶体管中的比特数更多可以降低生产成本。与基于MLC的SSD相比,基于SLC的SSD更可靠,并具有更长的寿命,但是有更高的生产成本。因此一般的大众SSD是基于MLC或者TLC的,只有专业的SSD是基于SLC的。因此往往会基于硬盘的目标工作负载和可能的数据更新频率,选择正确的存储类型。对于较高的更新工作负载,SLC是最后的选择,而高读取低写入的工作负载(例如视频存储和直播),TLC将极其适合。另外,TLC硬盘基于实际工作负载的基准检测显示出在实际中不必考虑基于TLC的SSD寿命。
NAND闪存的页和块
闪存的模块组织在被称为块的格子中,而块则组织成平面。块中可以读写的最小单元称为页。页不能独立擦除,只能整块擦除。NAND闪存的页大小可能是不一样的,大多数硬盘的页大小是2 KB, 4 KB, 8 KB 或 16 KB。大多数SSD的块有128或256页,这即表示块的大小也可能是256KB和4MB之间不同的值。例如Samsung SSD 840 EVO的块大小是2048KB,而每个块有256个8KB的页。页和块访问的细节在3.1节中
1.2 SSD的组织
下方的图1是SSD硬盘及其组件的示例。我只是重复了数篇论文[2, 3, 6]中已有的基本示意图。
图1:固态硬盘的架构
来自用户的命令是通过主机接口交换的。在我写这篇文章的时候,最新发布的SSD有两种最普遍的接口:SATA和PCIe。SSD控制器中的处理器接收这些命令并将它们传递给闪存控制器。SSD同样内嵌有RAM存储器,通常是作为缓存和存储映射信息使用。章节4包含了关于映射策略的细节信息。NAND闪存芯片通过多个通道组织在一起,和这些通道有关的信息在章节6中。
下方的图2和图3是从StorageReview.com [26, 27] 复制过来的,展示出真的SSD是长的什么样子的。
- 1个SATA3.0接口
- 1个SSD控制器(Samsung MDX S4LN021X01-8030)
- 1个RAM模块(256 MB DDR2 Samsung K4P4G324EB-FGC2)
- 8个MLC NAND闪存模块,每个模块有64G的存储空间(Samsung K9PHGY8U7A-CCK0)
图2:三星固态硬盘840 Pro(512 GB)— 感谢StorageReview.com[26] 的图片
图3是一个美光P420m 企业级PCIe固态硬盘,2013年末发布。主要组件有:
- PCIe 2.0接口 x8
- 1个SSD控制器
- 1个RAM模块(DRAM DDR3)
- 32通道上的64个MLC NAND闪存模块,每个模块有32GB的存储空间(Micron 31C12NQ314?25nm)
总存储空间为2048GB,但在应用over-provisioning技术后只有1.4TB可用。
图3:美光P420m企业级PCIe固态硬盘(1.4TB)— 感谢StorageReview.com[27] 的图片
1.3生产过程
很多SSD的生产商使用表面贴装技术(SMT,电子组件直接放置在PCB板上的一种生产方法)来生产SSD。SMT生产线由一系列机器组成,每个机器上下衔接,并有各自生产过程中的任务,例如安放组件或者融化焊锡。整个生产过程中同样贯穿了多重质量检测。Steve Burke的两篇参观金士顿在加利福利亚芳泉谷市的生产工厂的文章[67, 68]和Cameron Wilmot的一篇关于台湾金士顿组装工厂的文章[69]中,有SMT生产线的照片和视频。
另外还有两个有趣的视频,一个是关于美光Crucial SSD[70]的,而另一个是关于金士顿[71]。后边一个视频是Steve Burke文章的一部分,我同样在下方引用了。金士顿的Mark Tekunoff领读者参观了他们SMT生产线。有意思的是,视频中的每个人都穿着一套萌萌的抗静电服,看起来很有意思。
2.基准和性能度量
2.1基本基准
下边的表2展示的是不同的固态硬盘在顺序和随机工作负载下的读写速度。为了便于比较,这里包含了2008年到2013年发布的SSD、一个硬盘盒、和一个内存芯片
Samsung 64 GB | Intel X25-M | Samsung 840 EVO | Micron P420m | HDD | RAM | |
品牌 / 型号 | Samsung(MCCDE64G5MPP-OVA) | Intel X25-M(SSDSA2MH080G1GC) | Samsung(SSD 840 EVO mSATA) | Micron P420m | Western Digital Black 7200 rpm | Corsair Vengeance DDR3 |
存储单元类型 | MLC | MLC | TLC | MLC | * | * |
上市年份 | 2008 | 2008 | 2013 | 2013 | 2013 | 2012 |
接口 | SATA 2.0 | SATA 2.0 | SATA 3.0 | PCIe 2.0 | SATA 3.0 | * |
总容量 | 64 GB | 80 GB | 1 TB | 1.4 TB | 4 TB | 4 x 4 GB |
每块的页数 | 128 | 128 | 256 | 512 | * | * |
页大小 | 4 KB | 4 KB | 8 KB | 16 KB | * | * |
块大小 | 512 KB | 512 KB | 2048 KB | 8196 KB | * | * |
顺序读取 (MB/s) | 100 | 254 | 540 | 3300 | 185 | 7233 |
顺序写入 (MB/s) | 92 | 78 | 520 | 630 | 185 | 5872 |
4KB 随机读取(MB/s) | 17 | 23.6 | 383 | 2292 | 0.54 | 5319 ** |
4KB 随机写入 (MB/s) | 5.5 |