资讯详情

从机械硬盘和固态硬盘的结构来看IO

磁盘这个词对程序员来说并不陌生。我们知道它是一种存储介质,主要用于存储数据。可以说,常用的中间基本上离不开它,比如我们常用的MySQL数据库、kafka甚至新闻引擎redis磁盘离不开缓存。

当我们优化一个业务逻辑时,我们经常需要使用缓存,并试图从缓存中读取热数据,因为我们知道磁盘很慢,特别是在高并发的情况下,我们必须确保很少要求磁盘IO。不知道你有没有想过以下问题:

  1. 为什么机械硬盘慢?

  2. 机械硬盘有多慢?

  3. kafka也是写磁盘的,但是很快。为什么?

  4. SSD为什么比普通机械磁盘快?

  5. 既然SSD这么快,为什么不放弃传统的机械磁盘呢?

带着这些问题,我们来看看磁盘相关知识。

从机械硬盘开始

这是一个普通机械硬盘的内部结构,组成不多。我们关注它磁盘磁头臂磁头就行。

首先说磁盘,它看起来像光盘,我们的数据存在,我们通常称之为磁盘,磁性记录材料的表面,注意不仅一面可以存储数据,磁盘两面可以存储,同时对于磁盘,通常由多个磁盘组成,所以它的组成应该是这样的。

图中有4个盘子,共8个盘子,其中每个盘面都被画成同心圆。

我们称之为这样的橙色圆圈。磁道,当然,磁道也是一个一个的弧段组成的。

像如图的绿色弧段部分我们叫做扇区,扇区由磁盘组成最小单位,一般可以存储一个扇区512个字节。

同一磁道的多个磁盘可以形成一个虚拟这个虚拟的圆柱面,我们称之为柱面

对于一个盘面它的存储容量=单个扇区的大小 * 磁道扇区数 * 磁道数。

对于一个盘片它有两个面,所以一个盘子的容量=2 * 盘面容量。

对于一个磁盘磁盘的容量=盘片的数量 * 单盘容量。

说完盘片,我们来谈谈磁头,我们的数据在盘子上,盘子上的数据不能直接传输到总线,所以我们需要一个媒体,即磁头,它可以将风扇区域的数据传输到总线。

说完磁头,下一步就是磁臂是的,磁头解决了数据读写的问题,但没有解决哪个风扇区域的问题。此时,需要磁臂。磁臂可以在一定范围内摆动标风扇区域。

当然,磁臂的摆动范围是有限的。例如,无论磁臂如何摆动,它都不能摆动到风扇区域B。此时,是时候转动磁盘了。你应该听说过磁盘的速度,比如7200转/分。这实际上是转轴驱动磁盘的转速,所以最终通过盘片的转动 磁臂的摆动,就可以定位到我们的目标扇区。

机械硬盘有多快

在了解了机械硬盘的物理结构后,让我们来看看它有多快。我们知道定位到数据需要磁盘的旋转和磁臂的摆动。这些都是物理的。当我们的磁头定位到特定的风扇区域时,读写数据的速度非常快。因此,影响机械硬盘读写速度的主要原因是这两种物理运动。这两种物理运动对应于两个专业术语平均延时平均通道时间

先说平均延迟。我们上面说的是,当目标扇区不在磁臂摆动范围内时,需要以7200转/转的方式转动盘片min以磁盘为例,它每秒可以转120圈,转一圈就是1/120s=8.33ms左右,我们定位目标区域的平均时间是多少?以磁道为例,它是圆的,目标节点可以分布在圆的任何位置。

例如,当我们想找到A时,我们可能只需要转一点。当我们找到B时,我们可能需要转半圈,当我们找到C时,我们可能需要转近一圈。因此,根据算术平均法,我们可以粗略判断平均需要找到目标节点转动半圈,这半圈的时间是8.33/2=4.17ms,也就是平均延迟。

让我们来看看平均通道时间。通过盘面的旋转,我们大致找到了目标区域,但还没有准确定位。此时,我们需要磁臂的摆动来定位我们的特定目标风扇区域。这种摆动通常需要时间4-10ms

所以磁盘是随机的IO大概耗时就是4.17 4=8.17 ~ 4.17 10=14.14ms,这个数字代表什么?假设我们是随机的IO的耗时是10ms,那么1s随机可做100次IO,看到100这个数字,你明白什么吗~,这真的很小,这就是为什么我们对它了解的原因QPS对于较高的接口,应添加缓存层,因为磁盘无法携带。

在科普下,我们上面说的1s内存可以随机做100次IO,我们称这100IOPS,即每秒输入输出量(或读写次数)是衡量磁盘性能的关键指标

我们可以通过iostat,查看当前机器磁盘的指标:

iostat KB/ttpsMB/sussyid1m5m15m 23.4490.20128802.401.971.90 

其中tps当这个值很大时,我们需要注意当前磁盘的每秒传输次数。

当然,以上都是随机的IO,顺序IO就大不一样了,顺序也大不相同。IO与内存的离散读写相当,简而言之,它非常快,就像著名的kafka磁盘顺序IO,所以至少在磁盘上读写这篇文章很好。顺序IO之所以快,首先,盘子不需要每次旋转,其次,我们的磁臂不需要大幅摆动才能找到,节省了大量的物理时间、速度和随机性IO应该是数量级的差异。

固态硬盘更快

先说数字。我们日常使用的机械硬盘数据传输率几乎是200MB/s固态硬盘的传输率约为768MB/s,可以发现固态硬盘比普通机械硬盘快很多,但这只是接口SATA3.0的情况下,我们的固态硬盘还支持PCI Express接口,在此接口下,固态硬盘的读写能力将达到更高的水平,可以达到1GB/s当然,这些只是科普知识。作为程序员,我们不必太在意接口相关知识。

让我们从原理开始。固态硬盘的操作模式与机械磁盘完全不同。从上图的内部结构可以看出,固态硬盘没有磁盘、磁臂等机械部件。

那么它是如何存储数据的呢?答案是电容器电容器是一个非常小的电子元件,我们只需要给电容器充电,所以我们可以表示特征1,电容器放电可以表示特征0,以这种方式存储固体硬盘的数据,我们通常称之为使用SLC的颗粒,全称是 Single-Level Cell,也就是说,存储单元中只有一个数据,所以固态硬盘可以存储多少数据完全取决于它可以放置多少电容器。因此,一些工程师后来发明了更先进的用法,即在电容器中放置两个比特、三个比特甚至四个比特。

那么问题是,一个电容器如何表示这个更多的比特性呢?答案是电压。给电容器充电的东西叫电压计。以可以放置两个比特的电容器为例,可以表示00、01、10和11 四个数字,放电状态为00,剩下的我们只需要充满不同的电压。

当然,你想表达的数字越多,你必须充满许多不同的电压,所以速度会相对较慢。

短命固态硬盘

了解了固态硬盘的内部结构后,我们来看看固态硬盘的读写原理,看看为什么固态硬盘的寿命不高。

相比机械硬盘存储数据的盘片,固态硬盘的叫做裸片,裸片之间也是叠放在一起的,以一个裸片为例,它的结构大致如下:

或者划分的概念,首先,多个平面可以放平面,一般平面上的存储容量可能是GB等级,然后一个平面可以分成很多块,一般一个块的存储大小,通常是几百块KB到几MB大小,一个块分为很多页面,一个页面的大小通常是4KB,让我们关注一下,这与我们接下来要谈的固态硬盘的寿命密切相关。

我们知道,对于机械硬盘,当我们写数据时,我们不会关心风扇区域是否有数据,直接覆盖,但固态硬盘是不同的,如果某个区域有数据,必须先擦掉再写

这种擦拭至关重要,因为它是影响固定硬盘使用寿命的直接原因。擦得越多,使用寿命就越短。就像用橡皮擦在纸上擦一样。如果你擦得更多,纸就会打开。如果纸打开了,纸就不能用了。

那么一个固态硬盘能擦多少次呢?在单比特电容模式下,它可以擦除10次左右w第二,其他多比特性较少,可能只有几千次。因此,如果您的业务数据需要定期更新,不建议使用固态硬盘。

关于擦除数据,另一个非常重要的是块,通过上图我们知道最小的数据存储单元实际上是页面,页面属于块,有很多页面,如果一些页面的数据被标记删除,不能直接擦除这些单独的页面,所以这些页面不能被删除用,除非整个块上的页都被标记删除了。

如图,页A、页B、页C虽然都是被标记删除的数据,但是因为它所属的块还有其它有效数据,所以当有新数据要写入的时候,它只能写入白色区域未使用的页,并不能利用这些红色区域。但是这样的话,就会出现这样一个问题:随着时间的推移,红色区域会越来越多,也就是碎片越来越多,这样势必会造成浪费。

浪费可耻,因此需要一套紧凑机制,这时候会把相关块的有效数据移动到一个新的块中,让不同块的有效数据更加紧凑的分布,那么对于被移动出数据的块来说,它上面的页要么没数据,要么是标记删除的数据,可以直接对这个块进行擦除,从而达到回收利用的目的。

回到题目

通过对机械硬盘和固态硬盘的了解,我们再来看看一开始的问题:

  1. 机械硬盘为什么慢?机械磁盘慢的原因主要是因为定位一条数据需要盘片的转动 + 磁臂的摆动,这些都是物理的,所以会慢

  2. 机械硬盘有多慢?,通过上面的计算,我们可以大概得出对于一个7200转的机械硬盘来说,它的iops大概在100左右,每次io的耗时在10ms左右

  3. kafka也是写磁盘的,它却挺快的,为什么? 因为kafka是顺序io,就算对于机械硬盘来说,顺序io也是很快的,因为它不会像离散io那样,需要过多的寻道。

  4. SSD为什么比普通的机械硬盘要快?这里主要因为SSD不需要像机械硬盘那样的物理运动来寻道。

  5. 既然SSD这么快,那为什么不抛弃传统的机械硬盘?首先从价格上来讲,固态硬盘价格稍贵,其次固态硬盘的寿命没有机械硬盘的高。


最后

创作不易,各位的就是对作者最大的支持,也是作者最大的创作动力,我们下期见。

 

往期精彩:

  • 内存管理:程序装载那些事

  • 简单!代码原来是这样被CPU跑起来的

  • 20张图!常见分布式理论与解决方案

标签: 固态电容的工作原理固态电容10v560uf1812电容一盘固态电容16v180uf

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台