我的电脑磁盘顺序

(我的电脑磁盘顺序乱了)

欢迎 wx 关注 SH的全栈笔记

磁盘,即使不是作为开发人员,我们也会经常和它打交道。比如你家的台式机,或者用来办公的电脑,比如你安装了一个操作系统,会涉及到磁盘的分区。

而作为开发人员,自然更加需要关注磁盘。

你平时开发的代码磁盘将暂存;开发中使用最多的数据库MySQL,其数据在磁盘中持久;Redis持久数据落入磁盘;Zookeeper内存中的数据、事务日志和快照将持续到磁盘;就像RocketMQ这个消息队列也会收到 Message 持久到磁盘,Kafka也不例外;

可以说,磁盘和我们的开发息息相关。但也许在平时的开发中,很多人会忽略磁盘的存在,因为虽然与磁盘密切相关,但遗憾的是,不直接相关。但也许在平时的开发中,很多人会忽略磁盘的存在,因为虽然与磁盘密切相关,但遗憾的是,

不直接相关

。因为上面提到的所有与磁盘相关的内容都是工具帮助我们做的,甚至是你的代码。

这种感觉就像鱼(可能)不太注意水,太注意氧气。

我们可能听说过磁盘 IO 慢,为什么?我们可能听说过磁盘的顺序 IO 为什么会更快?我们可能听说过磁盘的顺序 IO 甚至比内存更随机 IO 为什么要快?

也许我们可能无法清楚地解释这些问题,这就是为什么我想谈谈磁盘。

磁盘分类

首先,根据原理,磁盘可分为三类:

机械硬盘(HDD)固态硬盘(SSD)混合硬盘(SSHD)本文的重点将放在 HDD 上。

场景切入

首先,切入一个非常简单的场景,如下:

你在你的电脑上创建了个文件,然后写了点东西进去。然后你 N 天后打开电脑,看到文件还在(废话)。这实际上是数据被持续地进入磁盘,下次需要文件时从磁盘中取出。

其实这个存取过程对我们一点感知都没有,所以我们知道装机的时候安装了一个硬盘,什么都不知道。

磁盘结构

磁盘是什么样子的?它是如何存储文件的?以什么方式存储?带着这样的问题看一张图:

图片来自 wikipedia从以上结构图可以看出,现代主流磁盘设计是在一个 Spindle(主轴)上,有一些 platter(盘片),然后盘片会绕着主轴旋转,然后读数据,写数据读写磁头为了实现,读写磁头将安装在读写磁头上

磁头臂

在上面,磁头臂可以旋转,覆盖盘子的所有半径,然后与主轴旋转,使磁头可以获得盘子上任何风扇区域的数据。那你可能会好奇,这个

盘片

怎样做,怎样设计才能储上述文件?要知道,现在的磁盘盘片大多是由

非磁性材料

,它通常由铝合金、玻璃或陶瓷制成。在你的印象中,他们能用来存储文件吗(再次手动狗头)

既然提到了非磁性,答案肯定和磁性有关。...

盘片构造没错,盘片的两个面涂一层薄薄的磁性材料,有多薄呢?大概是10-20 纳米,然后包裹层碳作为保护,这层薄薄的磁性材料是存储数据的

关键

磁性材料磁盘通常有多个磁盘,刚才提到的磁性材料

盘子的两面都有

。大概是10-20 纳米,然后包裹层碳作为保护,这层薄薄的磁性材料是存储数据的

关键

磁性材料

磁盘通常有多个磁盘,刚才提到的磁性材料盘子的两面都有

。换句话说,磁盘的两面都可以用来存储和读取数据。

现在我们知道数据实际上存在于磁性材料中,所以我们在这里考虑另一个问题:「

磁盘如何知道数据中应该存在哪种磁性材料?读的时候应该读哪些材料?读多少?

其实这个道理和我们的地图差不多。比如中国这么大,如何清晰准确地描述某个地方?其实大家都知道这个答案,那就是分层分级比如网购让你填的收货地址就是这样,比如「四川-成都-xx区-xx街道-x栋x号-xxxx室」,这种分层逻辑可以直观地表达一个特定的、特定的位置,更不用说大概那一块了,先去中国西南,再去城市,再往西走多久,再往南走。运气好的话可以找地址(再手动狗头)。

也做了类似的事情,先看图片:盘片的构造中间的黑点是主轴

,以主轴为中心划分多个磁道(为了方便理解图中只给出) 3 每个磁道分为多个区域,每个区域称为

扇区

,而且每个扇区的大小都是

固定的 512 字节。读取数据的时候,只需要通过这个划分就能够知道数据在哪个磁道、哪个扇区了。读取数据时,只需通过这个划分就可以知道数据在哪个磁道和扇区。但是上图可以看出一个问题:不同磁道扇的面积相同,磁道位于风扇区域半径约大

,则扇区的

面积就越大

。但无论面积比内磁道大多少,只能按照设计和规定存储 512 字节数据,所以会浪费大量的存储空间

为了优化这个问题,就有了 ZBR 技术方案。

ZBR,全称

ZoneB

it

R

ecording,用于解决磁道扇区存储空间浪费的问题。它是怎么做到的?说起来也很简单,越靠外圈磁道的扇区面积会更大,所以 ZBR 会放置更多的风扇区域来利用空间。

这可能换成图形:

盘片的ZBR

不同的磁道扇区数量不同,外圈磁道上的扇区会更多,从而充分利用空间,提高磁盘的总容量。存储原理好了,继续深入问题盘存储相关问题。我们知道,从宏观的角度来看,计算机不会关心你是谁,这就是它 0101010101。那么当读取文件的时候,它是如何从这层磁性材料中识别出来 010101010101,然后还原成我们能理解的文件?

我们知道磁道和扇区分在盘子上,相应的磁性材料也是如此。现代磁盘通过磁盘两侧的磁性材料记录数据,磁性材料序列的变化代表相应的二进制 0、1。

磁性序列原理

可见两个磁性 Region 的不同的顺序方向,则标记为

R

(Reverse),同样的标记是

N

(No Reverse),读取时,如果检测到序列 RR,则对应 1,而如果是 NR,则对应 0(也许这就是为什么叫磁盘,再手动狗头)

因此,我们常说的磁盘不是读写磁头在盘子上刻东西,而是改变磁性材料的序列,读写磁头和盘子没有直接接触,他们有个大概 10 nm 的距离。此外,我们可以简单地从上述情况推断出,由于读写磁盘依赖于读取磁性序列,磁盘的两个表面可以用来存储数据,这是不可避免的磁头在盘子的每一面都有

磁盘性能

在理解了一些简单的原理之后,我们终于可以理解磁盘性能的相关问题,我们将深入分析为什么磁盘 IO 这是一个非常昂贵的操作。

磁盘性能在理解了一些简单的原理之后,我们终于可以理解磁盘性能的相关问题,我们将深入分析为什么磁盘 IO 这是一个非常昂贵的操作。现在想想一个问题,我们要查询数据,底层会怎么做?是不是会:将磁头移动到目标文件所在的磁道。此时,磁盘由主轴旋转。磁头需要等待相应的风扇区域旋转到磁头,以便读取相应风扇区域的数据。&传输

总结一下,磁盘的 IO 请求耗时主要由三部分组成:

磁头寻道时间:这种延迟通常是 3-15 ms磁盘旋转延迟:这取决于主轴旋转的速度,随着速度的不同而变化 2-4 ms

数据传输时间

:这里平均只用 3 微秒,与上述两个相比,这里的耗时可以忽略不计

这里提到了旋转问题,在

磁盘旋转延迟盘子旋转越快,相应的风扇区域移动到磁头的速度就越快。现代磁盘的旋转速度在于 5400 或者 7200 RPM(R

evolutions

P

er

Minute)当然,也有一些高性能的服务器会达到转速 1500 RPM。磁盘旋转延迟确实与速度有关,因为转速越快,对应风扇区域移动到磁头的位置越快

磁盘旋转延迟确实与速度有关,因为

转速越快

,对应

风扇区域移动到磁头的位置越快。但不是速度越快越好,因为速度越高,热量越严重,磁盘的寿命越短。以下是不同速度下相应旋转延迟的参考:旋转速度(单位 RPM)平均旋转延迟(单位m秒)4800 6.25 5400 5.55 7200 4.16 10000 3 15000 2(以上数据来自 wikipedia)也许你看到几毫秒感觉很好,不是那么慢,但你可以通过比较内存的速度来立即理解。随机阅读内存大概在几百纳秒,假设内存的速度是 200 ns、磁盘的速度是 2ms(按上表中速度最高的延迟计算),差了 10000 倍,也就是4 个数量级。随机阅读内存大概在几百纳秒,假设内存的速度是 200 ns、磁盘的速度是 2ms(按上表中速度最高的延迟计算),差了 10000 倍,也就是4 个数量级。在这里,我想我们也能理解为什么磁盘的顺序读写可以随机读取内存。由于磁盘顺序读写几乎干掉了前两个最耗时的操作,磁头已经移动到相应的磁道, 也找到了相应的扇区,直接写完了。好了, 这里简单介绍一下磁盘的原理。