固态硬盘
固态硬盘(Solid-statedrive,SSD)又称为点子盘,是一种使用固态存储介质来存储数据的非易失性存储设备.它与传统硬盘的最大区别在于内部没有移动的磁头,所以在进行随机数据存取的时候不再需要大量的移动磁头的时间,同时也将由于磁头移动所带来的噪声也一并消除.固态硬盘一般采用的接口与传统的硬盘一致,这样就大大方便了现有设备的升级.
结构
SSD一般由以下三个模块组成:
-
存储介质
存储介质分为三类:第一类,基于NANDflash,这样它就可以在无电源的情况下保存其内部所存储的数据.第二类,基于RAM.这一类往往速度很快,却需要提供额外的电源来保证在主电源断掉的情况下依然能够保存其内部的数据.第三类,混合型.这一类通常包含一个很大容量的传统硬盘,并使用SSD作为其cache.然而这种硬盘却不适合在数据密集型的情况下使用.
-
控制器
控制器用来执行由主机发过来的命令和日常的FLASH维护工作,其一般为一颗嵌入式的微处理器.它主要执行以下功能:
*错误校验(Errorcorrection)
*磨损均衡(Wearleveling)
*坏块重映射(badblock mapping)
*读写缓存(readand write caching)
*垃圾回收(garbagecollection)
*加密(encryption)
-
主机接口
这部分常集成在控制器中,通常采用的是HDD是用的那些接口,如:SerialATA,PCI Express,USB等
Flash划分
晶体管是NANDFLASH的基本组成部分,一个单元能够存储一位或者两位数据.当它存储一位数据时称为SingleLevel Cell(SLC)闪存,当它存储两位数据的时候称为MultiLevel Cell(MLC)闪存.
SLCflash (left) vs. MLC flash (right)
MLC的写操作比SLC慢,但MLC比SLC便宜且容量更大.所以SLC一般用在企业级的服务器上,MLC一般应用于个人桌面领域.
一组如上的基本单元形成一个个的pages,page是能够在NANDflash上能够读写的最基本单元.一个Page的典型值为4KB.一组pages又组成一个个的blocks,一般在一个block里包含有128个pages(所以一个block的大小一般为512KB).block是能够在NANDflash上进行擦除的基本单位.所以NANDflash上进行读写的单位是page,而进行擦除时的单位却是block(即128个page).
Pageand Block
问题
当NANDflash的page都还是空的时候,我们能够一个接一个page地写数据,但我们却不能直接重写一个page.所以不通过擦除的方式,我们能够一个page接一个Page地将整个flash写完.而当我们写完了flash的所有空间后想重写某一页的数据时,就需要将这一页所在的block全部拷贝到缓存里,将该block全部擦除,将缓存里的我们需要修改的页面进行修改,再将这一整个block写回.也就是常说的read-erase-modify-write过程,所以我们能够一次读写4KB,却一次只能擦除512KB.
现代的操作系统以logicalblockaddressing(LBA)的方式与驱动器进行交流.OS知道哪些LBA是可用的,哪些是不可用的.当删除一个文件时,指向该文件的那些LBA被标记为空闲,而实际存储在驱动器上的数据并未被删除.直到OS决定将再使用这些LBA时,这些LBA指向的实际存储区域才会被重写.
下表是OS对于常见文件操作的行为:
Actionin the OS | Reactionon a HDD | Reactionon an SSDFileCreate |
FileCreate | Writeto a Sector | Writeto a Page |
FileOverwrite | Writenew data to the same Sector | Writeto a Different Page if possible, else Erase Block and Write to theSame Page |
FileDelete | Nothing | Nothing |
HDD与SSD此处最关键的区别在于重写一个文件的时候.HDD能够直接在原来的位置上进行重写,而SSD却需要一个干净的页面来写新数据.在SSD中那些在重写后无效的页面只是被标记为无效的而未进行擦除.
问题示例
假定我们有一个参数如下的SSD:
PageSize4KB
BlockSize5 Pages (20KB)
DriveSize1 Block (20KB)
ReadSpeed2 KB/s
WriteSpeed1 KB/s
我们先存4KB的文本文件:
OurSSD. The yellow boxes are empty pages
接下来我们继续存一张大小为8KB的图片:
Thepicture is 8KB and thus occupies two pages
接下来我们删掉那个4KB的文本文件.再存储一个12KB的图片,这时OS认为磁盘有12KB是空闲的,而SSD却认为只有8KB是空闲的,另外那4KB属于无效的page.
Problem.We don't have enough empty pages.
根据前文的规则,我们此时不能直接进行写操作,而要将该block全部拷贝到cache中,开始前述的read-erase-modify-write操作,如下图:
read-erase-modify-writecycle
我们算一下这一次的写速度.这款SSD写速度为1KB/S,读速度为2KB/S.写12KB的数据本来需要t1=12s,而实际上我们读了12KB后又写了20KB的数据,所以实际上消耗了t2=26s.于是这块SSD的写速度实际上已经从1KB/S降到了0.46KB/S.
解决方法
这里有两种解决方法.
方法一:添加额外的存储空间
给SSD添加额外的存储空间.例如在前面一节的例子中当我们声称我们只有20KB的空间时,实际上有24KB的存储空间.这样在前面一节存储12KB的图片时,我们的空间就足够了.如下图:
方法二:TRIM命令
该命令需要OS和SSD上的固件同时支持时才有效.当删除一个文件时,OS通过发送TRIM命令给SSD来告诉SSD哪些LBA指向的page已经失效了.SSD上的控制器将会在合适的时机将那些包含这些pages的blocks拷贝到cache中,然后将失效的页面删除并回写到干净的blocks中.
于是在前述的示例中,当删除了4KB的文本文件后,OS将会通过TRIM命令告知SSD驱动器.
然后再存入12KB的图片文件:
这一次我们就顺利的写进去了这个12KB的图片文件.
然而这种方法只能减轻上述现象带来的问题,而不能完全去除:当重写一个文件时,TRIM命令就失效了.
安全擦除
基于前文同样的原因,当格式化SSD磁盘的时候并不会真正清楚SSD里所存储的内容.所以需要对SSD进行恢复的时候,最好进行安全擦除,将SSD上所有的page都恢复到干净的状态,这时SSD将具有最快的速度.
SSD性能指标
SSD有如下的性能指标:
-
顺序读
-
顺序写
-
随机读
-
随机写
-
混合读写
-
每秒IO次数(IOPS)
-
读写延时
测试
影响条件:distkcache
内核会对之前读写过的文件进行缓存,若在读写若一个文件之后对其进行读操作将返回内核缓存的文件(存放在内存中),从而对测试结果产生影响.从内核2.6.16起提供了一个接口来(/proc/sys/vm/drop_caches)对该缓存进行清除.具体命令如下:
-
freepagecache:
-
echo1 > /proc/sys/vm/drop_caches
-
freedentries and inodes
-
echo2 > /proc/sys/vm/drop_caches
-
freepagecache, dentries and inodes
-
echo3 > /proc/sys/vm/drop_caches
影响条件:随机数
如前一节所说,所有读写都会被内核缓存,所以当对文件进行随机读写的时候随机的偏移有重复的时候将会得到不正确的结果,故要求所有随机偏移不重复.
影响条件:写同步方式
写同步的方式有以下几种:
-
sync()
该方式将所有内核对文件的缓存放到一个队列里,稍后将全部写回磁盘.返回时并不保证所有修改已写回磁盘.
-
fsync()/fdatasync()
该方式将内核对由参数指定的文件的缓存放到一个队列里,稍后将全部写回磁盘.返回时并不保证所有修改已写回磁盘.
-
O_DIRECT
该方式在写操作时直接操作硬盘,并不经过内核的缓存,返回时保证已经写回了磁盘.故而能够较好的反应磁盘的写速度.
TRIM
从内核2.6.33起开始支持TRIM命令,用户空间的程序有如下两个:
-
fstrim
-
hdparm > v9.31
Security Erase
通过执行SecurityErase可以将SSD恢复到出厂设置,所有的内部pages都将处于干净的状态,在这个时候进行写操作意味着将有最快的效率.执行该操作需要SSD固件的支持,能够执行其操作的方法有3个:
HDDerase
该软件需要在纯dos环境下运行,需要下一个dos包以及syslinux包里的memdisk文件,grub2命令行如下:
setroot=(hd0,1)
linux16/memdisk
initrd16/dos/msdos71b.img
以上具体参数根据情况修改
PartedMagic
说partedMagic是一个分区工具,实际上是一个基于linux系统的集系统修复硬盘维护等的一个环境.官方推荐使用UNetbootin来烧写至USB,但可以将其解压到U盘上并直接使用grub2引导之:
setroot=(hd0,1)
linux/pmagic/bzImage [edd=off noapic load_ramdisk=1 prompt_ramdisk=0 rwloglevel=0 max_loop=256 keymap=us] root=/dev/sdb1
initrd /pmagic/initrd
当解压后的pmagic不是放在主目录下时,会提示找不到PMAGIC_XXXX.SQFS,此时只需在上面的linux那一行后添加上directory=[pmagic所在的目录]即可.
当partedmagic启动后,选择程序里的erasedisk并进行其他操作即可.若提示SSD已经frozen需要sleep点击并5~10秒后按power重启唤醒(这一步在6T上没有操作成功-_-),或者通过下一节提到的方法进行操作.
Hdparm
先执行hdparm-I /dev/sdx,查看是否有如下输出:
Security:
Masterpassword revision code = 65534
supported
not enabled
not locked
frozen
not expired:security count
not supported:enhanced erase
|
如果有frozen部分必须先让其显示为notfrozen才可进行下面的操作,至于解开frozen可以在Linux起来后再插上SSD可以.
接下来键入以下命令即可进行安全擦除:
hdparm–user-master u –-security-set-pass test /dev/sda
hdparm–user-master u –security-erase test /dev/sda
擦除成功后,SSD将重新回到frozen模式.