码农必备:SSD编程秘籍29条

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

 

荷兰阿姆斯特丹的一个码农Emmanuel Goossaert写了一系列文章,介绍程序员为SSD编程的秘籍。也有中文翻译,本文介绍其中的要点总结。

 

基础

 

1. 存储介质

 

SSD的基础是NAND Flash芯片,一个物理单元(cell)里面可以放1个,2个,3个bits数据,分别叫做SLC(single level cell, SLC),MLC(multiple level cell, MLC),TLC(triple-level cell, TLC)。它们的特性如下图:

2. 写的次数有寿命限制

 

NAND Flash里面分为很多个块(Block),必须先擦除才能写。而每个块的擦写次数(P/E cycles (Program/Erase))是有限的,根据质量,从几万次到几千次不等。如上图所示。

 

3. 性能评测难啊

 

SSD在不同条件下评测结果都不一样,所以要参考多家评测机构的结果。比如空盘的读写和满盘不一样,随机和顺序读写不一样,用个几个月又不一样。对于有Cache的SSD,读之前写的数据量大小也会影响后面性能。最好在自己未来要用的环境中来个最常应用的实测。

 

块和页的用法

 

4. NAND Flash的块(Block)和页(Page)

 

Block是存储单元组成的矩阵,里面有很多个Page。Page大小有2KB,4KB,8KB,16KB,Block中Page个数有128,256,512等,所以Block大小从256KB到8MB不等。Page是读写的基本单位,就是读写一次至少要有一个Page,而不是像内存一样操作1个Byte。写之前必须擦除旧的数据,擦的单位必须是一个Block。所以要写个Page,要把整个Block擦掉,意味着写之前要保证Block没有有效数据了。

 

5. 读数据最小单位是页

6. 写数据最小单位是页

7. 页不能重写

 

页写了一次之后里面的物理状态就固定了,不能重写也不能改写,必须把所在的块擦掉之后再写。如果重写的话,一般的结果就是旧的和新的数据都没了。

 

8. 擦除(Erase)最小单位是块

 

下图显示了写的一个流程。

  • 块1000有4个页,写了x,y,z,x ,所以x被x重写了,就作废了。
  • 有效的是x,y,z,要继续用块1000,只能把这3个有效的页搬走,写到块2000,这样块1000就空了,可以擦掉继续写。有效的数据也没有丢失。

SSD控制器的奥秘

 

9. 地址转换层

 

地址转换层叫做FTL(Flash Translation Layer),就是把操作系统发下来的逻辑页地址转换为NAND Flash内部的物理页地址。

 

10. 内在的并行性

 

SSD是个缩小版的磁盘阵列,因为由很多个NAND Flash芯片组成,它们是可以并行读写的。单个芯片并没多快,很多个拼起来并行读写,速度就很快了。这就是SSD比机械硬盘快的原因

 

11. 磨损平衡

 

因为块擦写次数是有寿命的,所以SSD控制器必须用算法保证所有的块的擦写次数能够相差不大。如果有些块擦写过多,就很快不能用了,容量下降了,同时也会影响其他块的稳定性。

 

12. 垃圾回收

 

第8条的图就是垃圾回收的流程,把要擦掉的块有效数据搬走叫做垃圾回收。因为无效数据的空间被释放出来了。

 

13. 后台操作会影响用户前台使用

 

因为SSD控制器在后台做垃圾回收等操作,占用了NAND Flash芯片,所以前台用户的读写性能就会下降。这就是SSD写满之后速度慢于空盘的原因:写满后,没有空间了,垃圾回收开始了。

 

数据特征

 

14. 不要写小于页的数据

 

NAND Flash的页大小一般是8KB或16KB,很多SSD控制器内部数据管理单元大小就是物理页甚至物理页的倍数。如果写数据小于这个值,只能把整个页读出来,其中一部分改成新的,再把整个写下去,所以一次写=读+改+写,耗时久而且写了多余的数据。尽管有些SSD内部有很大的DRAM,可以管理4KB的页,但是这种SSD总是少的,而且大多是企业级SSD。

 

所以:写数据最好大于16KB。

 

15. 写数据大小要对齐

 

就是最好是16KB的倍数。

 

16. 小数据的写先缓存起来

 

如果有很多零碎的数据写,那么先缓存在内存里面,等凑够16KB甚至更大了再写到SSD。很多企业级应用,数据是累积成日志文件写下去。例如Twitter的fatcache就是凑够了1MB才会写到SSD。

17. 相关的数据一起写

 

SSD里面有很多个NAND Flash芯片,当来了一大笔写的时候,会把数据分散到每个芯片上,这样读的时候并行起来,速度就很快。所以,为了利用这个特点,我们如果需要同时读一些数据,就把它们放在一起写。

 

18. 读写尽量分开

 

SSD里面有缓存和预读等机制,小数据的混合读写会影响这些机制的发挥,导致读写性能下降。所以最好把读集中在一起,写集中在一起。例如要修改1000个文件,不要读一个,改完,写一个,再改下一个,最好是读出1000个文件,再统一改好写下去。

 

19. 无效的数据打包删除或覆盖写

 

SSD里面一直在做垃圾回收,旧的数据一直在搬。逻辑页被Trim或重写后,旧的数据就作废了。所以旧的数据打包作废,就使得它们对应的旧块有效数据很快下降,SSD就会挑出来搬走,搬的数据量就小。如果分散开作废,那有可能作废了一些后,SSD就开始搬旧的块,搬走的有些数据其实没必要,因为马上就被作废了。

 

20. 随机写并不是永远都慢

 

机械硬盘随机写很慢,因为每次换地址就要重新寻道,探针机械移动很慢。而SSD不一样,没有寻道时间。如下图,当随机写的数据大小逐渐变大的时候(L->M->H),最后达到16KB*芯片(不一定是物理芯片,而是最小能独立写的芯片上模块)个数左右的时候,随机写和顺序写速度差不多了。一般这个大小是32MB一下,所以,当数据量为32MB的时候,可以随机了,没必要再刻意的连起来写。

 

21. 单线程读优于多线程小块乱序读

 

连续的数据是分散保存,所以一个线程顺序读性能更好,可以让SSD里面的每个芯片都有读。很多线程乱序读,就用不了SSD内部的并行性,同时也不能利用预读机制(Read Look Ahread)。

 

22. 单线程写优于多线程小块乱序写

 

如果数据大小在物理页16KB以下,就会触发很多读-改-写(read modify write),写速度下降。如果数据大小在物理页16KB以上的话,对SSD来讲,没有探头寻址时间,所以写的速度是一样的,不管是连续还是分开的数据,都是放到一堆写下去。

 

但是SSD垃圾回收是按照块为单位的,随机写的恶果是很多个块里面都有少量无效的数据,顺序的优点是少量的块里面有大量无效的数据。很明显,后者搬移的块更少,垃圾回收更快。

 

23. 数据都很小而且零碎不连续的时候,多线程写更优

 

我们用单线程是想让数据打包连续起来,如果用户数据本来就是很零碎的小数据,都很分散,很难在逻辑地址上拼接起来,那还是多线程好。因为多线程比单线程响应用户的写请求更快,充分利用CPU和内存资源。

 

24. 冷热数据分开写

 

冷的就是经常不更新的,热则反之。冷热混合的坏处是写放大和性能下降:

  • 在同一个页上:数据块小于16KB或不对齐16KB时,更新热数据不得不读改写冷数据。
  • 在同一个块上:垃圾回收热数据时,不得不搬移并重写冷数据。

     

    SSD内部没办法区分冷热数据,所以使用者要在外面分开。

     

25. 缓存热数据,降低写频率

要经常更新的热数据,最好凑够很多了统一写下去,写的频率低一点,就减少冷热混合的概率。

 

系统级优化

 

26. PCIe和SAS接口比SATA快

 

SATA是6Gb/s,SAS 12Gb/s,PCIe 3.0一个lane(1组差分信号)速度是8Gb/s,4个就可以到32Gb/s。但是越快的越贵,不是说成本高,而是用的人少,价格自然就高。

 

现在常见的SATA硬盘顺序读在400MB/s以上,PCIe在1GB/s以上。来张PCIe SSD的图:

27. 预留空间大一点,速度会快很多

 

预留空间(Over-provisioning, OP)的意思是,SSD物理空间并不会都拿来给用户写,内部会预留一些作为垃圾回收搬移的缓存空间。因为并不是所有的块都是装满了有效数据,所以肯定块的总大小要大于用户数据才能有空间搬来搬去。OP够大,垃圾回收就更快。一般有10%-15%的预留空间就够了,有大量随机写的话,需要25%才行。

 

切记,厂商的容量是以1000为单位,而用户以1024为单位,所以厂商利用这个差值,即使给用户完整空间(GB的容量),也会内部多出来7% (1024*1024*1024 和1000 * 1000 * 1000差值)!!

 

28. 打开TRIM功能

 

机械硬盘时代,我们删除一个文件,其实只是文件系统删掉了指针,物理数据还在。SSD时代,TRIM命令可以把数据也删除,就是让旧数据作废,这样释放出空间来,垃圾回收更快。

 

29. 分区的时候和物理页大小对齐

 

就是16KB的倍数,这样写数据就是对齐的。要不相当于总的开头是歪的,后面每一笔写开头都不对齐。

引用:

原文:http://codecapsule.com/2014/02/12/coding-for-ssds-part-1-introduction-and-table-of-contents/

中文翻译:http://blog.jobbole.com/69969/

 

想要每天看一条SSD文章吗?扫一扫,微信关注我们!或者微信搜索公众号ssdfans关注。

qrcode_for_gh_99390eb10794_430

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

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