【初识SSD】SSD的基本知识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XiyouLinux_Kangyijie/article/details/80719827

前言

《深圳男子图鉴》 继续搬砖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必须在写入前擦除,那么可想而知,上面的写入,需要先读出(之前的在同一页数据),缓存起来,再擦除,再整体写入一页,做了非常多的无用操作。

主要参考

coding for ssd
coding for ssd 的中文翻译版

猜你喜欢

转载自blog.csdn.net/XiyouLinux_Kangyijie/article/details/80719827
ssd
今日推荐