HDD
- 当应用程序发出硬盘 IO 请求后,这个请求就会进入硬盘的 IO 队列。如果前面有其他 IO,那么这个请求可能需要排队等待
- HDD对于随机访问和顺序访问速度差距很大
- 主要因素是寻道时间
- 使用 HDD 的应用程序通常会进行各种优化,以执行不需要寻址的就地更新,比如只在文件的后面append
SSD
-
SSD 的特点是,对 SSD 单元的每次擦除,都会降低单元的寿命,因此每一个单元只能承受一定数量的擦除
-
一个页面包括很多单元,是读写的最小存储单位
- HDD 可以直接对任何字节重写和覆盖;但是对 SSD 而言,不能直接进行上述的“覆盖”操作。SSD 的一个页面里面的所有单元,一旦写入内容后就不能进行重写,必须和其它相邻页面一起,被整体擦除、重置
-
IO 写入的延迟,具体取决于磁盘的历史状态
- 因为如果 SSD 已经存储了许多数据,那么对页的写入,有时需要移动已有的数据,这种情况下写入延迟就比较大
- 因此需要避免SSD存储太满
-
擦除是以块为单位。擦除速度相对很慢,通常为几毫秒
- 对同步的 IO 请求,发出 IO 的应用程序,可能会因为块的擦除而经历很大的写入延迟。为了尽量地减少这样的场景发生,一块 SSD 最好保持一定数量的空闲块,这样可以保证 SSD 的写入速度足够快
-
SSD 内部有垃圾回收(GC)机制,它的目的就是不断回收不用的块,进行擦除,从而产生新的空闲块来备用。这样可以确保以后的页写入能快速分配到一个全新的页
-
写入放大
- 实际写入 SSD 的物理数据量,有可能是应用层写入数据量的多倍
- 一方面页级别的写入需要移动已有的数据来腾空页面来写入;另一方面,GC 的操作,也会移动用户数据来进行块级别的擦除
- 写入放大效用会缩短 SSD 的寿命
-
损耗平衡
- 对每一个块而言,一旦擦除造成的损耗达到最大数量,该块就会“死亡”,再也不能存储数据了
- 为了确保整块 SSD 的容量、性能和可靠性,SSD 内部需要时长对整个 SSD 的各块做平衡,尽量在擦除次数上保持类似
- 是这种机制也有害处,就是会对前面讲的写入放大推波助澜
-
并发IO
- 利用到了SSD内部的并行性质
- 对于HDD无用,因为HDD 只有一个磁头,所以用多个 I/O 线程,并不能提高旧系统的吞吐量
-
SSD 的随机访问与顺序访问具有相同的性能,就地更新反而导致 SSD 性能下降的
- 因为包含数据的 SSD 页面无法直接重写,因此在更新存储的数据时,必须先将相应的 SSD 页面读入 SSD 缓冲区,然后将数据写入干净的页面