前一段时间做了一些对SSD方面进行优化的工作,SSD最大的问题在于长时间使用之后,IO性能会急剧下降。其主要问题在于为了防止“写放大”问题的产生,SSD的firmware采用了类似于log方式的算法,当存储资源基本基本耗尽时,在每次写操作时firmware只能进行garbage collection(垃圾回收,GC)操作,从而引入了很多费时操作,例如Nand Flash块的擦除,从而导致IO性能急剧下降。
为了缓解这个问题 ,大家想到可以将垃圾回收操作提前,不能等到资源耗尽的时候再做,这样可以在一定程度上避免IO性能的急剧下降。但是,不管怎么样,资源回收会影响到系统的IO性能,通过引入TRIM命令可以将这种影响离散化,平均化,起到非常不错的效果。
TRIM命令是SCSI层新加入的一个命令,因此SCSI Middle Level会对这个命令进行支持,另外SSD的Firmware会对这个命令进行响应。从表面上看,这仅仅是一条垃圾回收命令,但是,会影响到存储系统IO路径的方方面面,下面分析一下TRIM命令对IO路径的影响:
1, 垃圾回收是应用层的行为,这条命令不能在块设备或者SCSI一层进行触发,而只能在数据应用层(通常为文件系统)进行触发,如果在底层进行触发的话,那么上层应用将会看到错误的数据,这种行为非常危险。因此,为了支持TRIM命令,文件系统需要做出修改,例如,EXT3需要判断那些数据块可以被释放?并且需要知道何时可以释放?因为,TRIM命令将会对IO性能产生影响,所以,文件系统尽量不要频繁调用TRIM command。在这里,文件系统等应用层是TRIM命令的触发者,其熟悉应用的行为,可以在合适的时机触发SSD资源回收命令。
2, IO Schedule层需要进行修改。传统的IO Schedule层只关注读写请求,而TRIM命令是一个特殊的BIO,如果把TRIM命令当成传统的请求进行处理,那么将会带来很多不必要的麻烦,例如TRIM命令的BIO也许没有分配Page页,很多传统的驱动将会panic。为了实现兼容,在IO Schedule层不能将TRIM BIO和普通的读写BIO进行合并,应该将TRIM命令过滤出来。
3, 对于软RAID,TRIM命令存在很多问题,会导致RAID工作不正常,数据正确性存在问题。当RAID小写时,RAID需要从磁盘上获取整个条带的数据,如果RAID中一个条带中的局部数据块被回收,那么SSD返回的数据将和原来的数据不同,RAID条带的校验和就会失效,在系统故障的情况下,RAID将无法正确恢复数据。所以,TRIM命令将会导致Linux中的软RAID无法采用局部条带写操作,而只能采用整条带写的方式。
4, SSD对于TRIM之后的块会返回什么样的数据?不同SSD厂商可能会采用不同的策略。由于SSD Firmware在接收到TRIM命令之后,不一定会立即执行TRIM操作,因为,如果小数据块释放的话,可以进行聚合,直到聚合成一个Nand Flash块之后,才真正将其释放掉,否则会引入数据迁移问题。基于上述考虑,访问一个TRIM之后的块,该返回什么数据将和设计相关,我认为最简单的是返回原始数据或者是0,并且存在一定的随机性,和访问数据块属性相关。这种返回数据的随机性将会影响IO通路的数据正确性,需要引起注意。
在此列举了一些对TRIM命令的考虑,Linux开源社区也在做这方面的开发,大家可以在此一起讨论,畅所欲言!
文章评论(0条评论)
登录后参与讨论