美文网首页
磁盘IO为什么需要对齐

磁盘IO为什么需要对齐

作者: wayyyy | 来源:发表于2022-09-04 01:31 被阅读0次

转载一篇文章: 存储基础 —— 磁盘 IO 为什么总叫你对齐?

存储 IO 重要的一个知识点

重要的知识点:

  1. 机械盘的 IO 要扇区对齐(绝大部分的扇区是 512 字节大小),磁盘的读写最小单元就是扇区;
  2. SSD 盘的 IO 要 4K 对齐,SSD 盘的读写单元是 page,一个 page 为 4K 大小;

如果不对齐,会有问题问题?

  1. 性能极差
  2. SSD 寿命缩短

那你就会想了,出现这个问题的原因又是啥?
本质原因是内部 IO 流量和次数的放大,机械盘和 SSD 盘的 IO 都有最小单元的概念,机械盘是以扇区为最小的空间单位;SSD 盘则是 4k 的 page 作为 IO 的最小单元。
所以当在机械盘上读 1 个字节的数据,本质上是至少读一个扇区,写 1 个字节则更复杂,先要把这个扇区读出来,然后在内存里 update,最后又把这个扇区写回到磁盘。

你可能又有疑问了:为啥机械盘和 SSD 盘都要按照一个单元来管理呢,为啥不 1 字节 1 字节管理呢?如果这样的话,业务读写不就方便了。

答案是:开销,考虑以下两个方面:

  • 第一个是存储的开销:数据存储到磁盘上还有 SSD 盘上是会有校验的(比如 ECC 校验),如果每个字节都对应一个校验,存 1T 的数据有 1T 的校验?那这个存储开销无比的大。那如果是现在 512 字节对应一个 1 字节的校验,则开销完全可控;

  • 第二个是性能的开销:物理硬件是跟真实世界的设计匹配的,对于机械磁盘的写是利用磁化介质来存储数据,如果磁盘上是1 个字节,甚至 1 个 bit 来独立存储,那磁盘磁头的次数将无比庞大,性能也将无比的下降(每一次都是写数据+校验)。SSD 的写则更复杂,因为 SSD 由于自身的存储特点,是无法覆盖写的,每次写都是写新位置,旧的位置则是作为垃圾等待后台 GC ,粒度太小则会导致擦写的次数无比的多,性能和寿命都将不可接受;
    所以说,在综合因素的权衡下,硬件对于空间管理会划分固定单元,并对 IO 也提出单元对齐的要求。至于磁盘固定单元为 512 字节,SSD 的 IO 单元为 4K 则是经过综合的科学测试和验证的一个数值而已。

对齐有哪些方面

对齐其实很简单,只有两个维度:

  • 长度对齐
  • 偏移对齐

是不是很简单呀。长度和偏移就是我们常说的 length,offset;对齐通常就是既要保证长度对齐也要保证偏移对齐。

IO 读写的真实样子

下面以机械盘扇区对齐和非对齐的举例。为了简化,以下例子讨论的的对齐都是长度和偏移双重对齐的。

  • 扇区对齐的场景

    • 场景: 读 512 个字节数据是怎么做的?
      步骤如下:

      1. 磁头摆到指定偏移
      2. 读取一个扇区的数据到内存
      read一个扇区.gif

      开销:只需要一次磁盘读 IO。

    • 场景:覆盖写 512 个字节数据是怎么做的?
      步骤如下:

      1. 磁头摆到指定偏移;
      2. 覆盖写一个扇区的数据到磁盘;
      write一个扇区.gif

    开销:只需要一次磁盘写 IO。

  • 扇区非对齐场景

    • 场景:读 512 个字节,但是偏移不对齐?
      步骤如下:

      1. 磁头摆到这 512 个字节数据所在 2 个扇区位置,对齐到扇区开始的偏移;
      2. 读取 2 个完整扇区(1024 Bytes)的数据到内存;
      3. 从这 1024 字节的内存中,copy 出用户要用的 512 个字节,给到用户;
      read一个扇区.gif

      开销:读放大。虽然读的是 1 个扇区的数据,但是偏移却没对齐,所以必须要读 2 个扇区,也放大了一倍的流量。

    • 场景:修改512 个字节,但是偏移不对齐?
      步骤如下:

      1. 读 2 个扇区的数据(1024 Bytes)上来;
      2. 合并内存中的数据;
      3. 把这 2 个新的扇区数据,写到磁盘;
      修改512个字节.gif

      开销:读的时候导致多读了一个扇区,写的时候导致多写了 1 个扇区

IO 的代价比你预期的要大

机械盘来说,随机 iops 就是几百的样子,带宽也就几百兆。一次寻道都是 10ms 级别的。所以磁盘读写数据的代价远比你想象中的大。

这个有多慢?cpu 执行指令都是纳秒和微秒级别的,一次 IO 性能和 cpu 或者内存的操作相差十万百千里。所以,但凡你能省 1 次 IO 都是非常大的性能提升。

而对于 SSD 来说,如果你 IO 不对齐,很有可能峰值能跑 5 万 iops 的盘只能跑 2 万甚至更低。大家一定要有个意识:IO 能节省就节省,多一次 IO 性能可能慢 1 倍。

为什么我编程的时候从来不需要注意对齐?

这个时候你可能反问了,我读写文件从没考虑过对齐的问题呀?

是的,你是没考虑过,那是因为有一个苦逼帮你把这个活干了,谁呢?
文件系统,这个世界并不简单,只是有人替你负重前行。绝大部分的程序员都是基于文件系统之上操作磁盘。文件系统则会使用 buffer cache 自动帮用户对齐 IO ,然后再下发磁盘。一旦你想要深入优化 IO 的性能,IO 对齐一定是第一道要考量的坎。

还有一点要特别注意,一个特别重要的环节:文件系统格式化化的时候。
格式化的时候,一定要注意对齐。 格式化文件系统的时候,一定要注意对齐的偏移,不要故意搞成非对齐的偏移,不然一旦文件系统格式化的时候都不对齐,后面谁也救不了,除非你重新格式化文件系统。
举个例子,本来文件系统从偏移磁盘 0 这个位置格式化,你偏不,你偏要从 3 字节偏移的位置开始格式化。那后面的所有的貌似对齐的 IO 偏移都将是不对齐的,性能也自然是下降的。

相关文章

  • 磁盘IO为什么需要对齐

    转载一篇文章: 存储基础 —— 磁盘 IO 为什么总叫你对齐?[https://mp.weixin.qq.com/...

  • mysql索引及数据库引擎

    顺序io(不需要每次都磁盘寻址,效率高),随机io(需要每次都磁盘寻址,效率低) 如何正确的创建合适的索引? 索引...

  • 阿里云mysql8.0mysql性能指标

    内存命中型:多次查询,有缓存的情况 磁盘IO型:磁盘IO型场景指只有部分数据可以放到缓存里,查询过程中需要读写磁盘...

  • Java的IO操作

    Java的IO操作分为磁盘IO和内存流IO。 1、磁盘IO:FileInputStream和FileOutputS...

  • MySQL慢查询那点事

    (一)MySQL查询对资源的消耗 为什么会慢? 先从磁盘的IO开始分析,首先机械式磁盘...

  • 磁盘IO

    磁盘为系统提供了最基本的持久化存储。文件系统则在磁盘的基础上,提供了一个用来管理文件的树状结构。 根据存储介质的不...

  • JavaWeb之四——IO调优

    磁盘IO调优 网络I/O调优 磁盘IO调优 性能检测 注: IO wait= (cpu idle time)/(a...

  • B树 B+树 B*树 Tire树 skiplist

    这些树主要用于提升磁盘IO的效率,磁盘IO一般以磁盘页为单位,树上每个节点对应一个磁盘页,使用二叉查找树会增加IO...

  • 2019-08-27

    NumPy - IO ndarray对象可以保存到磁盘文件并从磁盘文件加载。 可用的 IO 功能有: load(...

  • 「每日一算法」什么是B-树

    ———————————— ———————————— 二叉查找树的结构: 第1次磁盘IO: 第2次磁盘IO: 第3次...

网友评论

      本文标题:磁盘IO为什么需要对齐

      本文链接:https://www.haomeiwen.com/subject/yyzrurtx.html