前言
《深圳男子图鉴》 继续搬砖ing,今天(4天前)看到某面向SSD的项目,赶紧学习了一下SSD的基础知识。
主要是从存储系统、DB开发的角度来看SSD,并非专业搞硬件的,完全初学者。
正文
SSD的寿命
首先是我对SSD最初了解的一点,SSD是有寿命的。由于SSD的物理性质,导致了它是有一定使用寿命的,当每个单元被读写一定次数之后就将不可用。
而主要有3种材质的
SLC MLC TLC
这三种材质最大的区别就是单元存储的bit数不同 SLC1个 TLC3个,
随着存储的bit多,性能(读取、写入延时)越来越高,寿命越来越短,当然成本也越来越低。
损耗均衡
正因为有寿命的影响,所以我们希望整块SSD最好可以达到一个损耗均衡的效果(一个512G的SSD,每天IO数目相同,总寿命有5年,那么我肯定不希望2。5年时只有256G可用。。),所以会有一定的策略来保证损耗均衡。
具体参数可见下图(出自coding for ssd–Part 2)
SLC | MLC | TLC | HDD | RAM | L1 cache | L2 cache | |
---|---|---|---|---|---|---|---|
P/E cycles | 100k | 10k | 5k | * | * | * | * |
Bits per cell | 1 | 2 | 3 | * | * | * | * |
Seek latency (μs) | * | * | * | 9000 | * | * | * |
Read latency (μs) | 25 | 50 | 100 | 2000-7000 | 0.04-0.1 | 0.001 | 0.004 |
Write latency (μs) | 250 | 900 | 1500 | 2000-7000 | 0.04-0.1 | 0.001 | 0.004 |
Erase latency (μs) | 1500 | 3000 | 5000 | * | * | * | * |
Notes | * metric is not applicable for that type of memory |
对于机械硬盘来说,由于需要寻道,旋转,所以随机读写的效率很低。但是顺序读写的效率相对高。
而对于SSD来说,不需要寻道旋转,因此随机读的效率强于HDD。顺序 写的效率也是相对高于随机写的
与HDD不同的写入
SSD和我们普通HDD很不同的一点是写入。我对于硬盘之前的印象都是直接写入,也就是说像一个本子,写完一页后,如果这页的内容不需要了,就打个标记,下次,继续写这页。或者说和内存一样,删除并不是擦除,只是打标记。
但SSD不是这样,SSD的操作只有program(写)erase(擦除)read(读),也就是说必须要在写之前擦干净。(具体必然是跟物理性质有关啦,这里不深入)。
所以这就导致了一些问题。
1.我们的文件系统对于删除操作,就类似于内存这样只是靠标记来区分空闲存储,但是对于SSD来说,它并不知道这个标记的存在,只有当下次写入时,SSD才能“意识”到这块是不需要的,才开始执行擦除,或者叫垃圾回收操作,大大降低了写的效率。
2.前面提到的损耗均衡在这里依然有效,对于一块被标记为空但是SSD不知道的页,SSD的损耗均衡机制会让它去进行无意义的数据移动,这依然是一种写放大,降低了性能。
Trim命令
那么针对这种问题,关键在于SSD需要知道哪些被标记了。就诞生了这样一个命令Trim,通过这个命令就可以让SSD知道了。但是这个命令需要OS,FS,SSD三方共同支持才可以。
但是对于写,存在
SSD的写放大效应
写放大(write amp)效应。什么放大?我大CD了。。。。xx放大不止存在于SSD这里,是一个很寻常的概念,例如,有一棵BST,那么我的一个读/查询操作实际上是要读取好几次叶子节点中的值,只希望读取一次的操作实际上读了好几次,那么可以说这个读被放大了。写操作同理。
SSD的写放大,也是它的特点之一。为什么SSD存在写放大呢?SSD的组织形式是页(page)–块(block)–片(plane)。读写都是页对齐,擦除是块对齐,因此加入我们只想写小于一页的数据时,却实际要写入一页的数据,这就是我们说的写放大。页往往是KB这个数量级的,所以对于效率的损失是需要好好考量的。
其次,我们知道SSD必须在写入前擦除,那么可想而知,上面的写入,需要先读出(之前的在同一页数据),缓存起来,再擦除,再整体写入一页,做了非常多的无用操作。