您当前的位置: 首页 >  macos
  • 1浏览

    0关注

    674博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

为什么 Linux 和 macOS 不需要碎片整理

沙漠一只雕得儿得儿 发布时间:2022-02-09 11:05:06 ,浏览量:1

Windows 需要碎片整理,而 macOS 和 Linux 就不需要碎片整理的原因。在 Windows 系统中,传统(HDD)磁盘驱动器(非 SSD)通常使用一段时间都需要进行磁盘碎片整理。而且时间间隔越久,碎片整理过程可能需要执行的时间也就越长。但在 macOS 或 Linux 系统中,用户却根本不用担心磁盘碎片,甚至系统中都没提供磁盘碎片整理的相关功能。为什么会这样呢?下面将为你解释产生这个现象的原因。

一、Windows操作系统为什么需要碎片整理

首先要说的是,用户无需对(SSD)固态磁盘进行碎片整理,我们在这里讨论的是传统(HDD)机械硬盘。

现代硬盘速度更快,计算机一般也拥有更大内存,而 Windows 也默认使用 NTFS 文件系统,这些变化都减少了对 HDD 进行碎片整理的需求。所以即便在 Windows 系统中,磁盘碎片整理也不像过去那么重要了。而 Windows Vista、7、8 和 10 都会在自动维护期间对机械磁盘执行碎片整理,所以也无需用户去手动执行了。

什么是磁盘碎片:简而言之,当您从硬盘驱动器中删除文件时,文件所占用的空间将被标记为可用(而非直接安全抹除)。用户删除的文件越多,在磁盘上就会产生越多分散的可用空间。当 Windows 操作系统将新文件写入磁盘时(或文件大小增加时),该文件就可能会被分割成多个部分,分散写入到磁盘上的一个个可用空间当中,这样就会造成文件存储的碎片化。

macOS 和 Linux 系统处理文件存储的方式有点不同,会试图将文件分散到磁盘不同位置进行存储,这样可以为文件的增长和创建新文件留下一些空闲空间。而且一但出现碎片化迹象,操作系统会自动尝试移动文件内容,根本无需用户进行干预。

Windows 工作方式就不一样了,在 FAT 和 FAT32 等旧文件系统上,并没有针对文件碎片化的内置保护能力,所以才需要定期对磁盘进行碎片整理。而目前的 Windows 系统在大多数驱动器上都默认使用 NTFS 文件系统,且已经具备了一些内置的防碎片保护能力(为文件增长留下了一些缓冲空间),但却不十分完美。

磁盘碎片整理其实就是尝试通过将分散存储在磁盘中的部分进行集中整理,从而提升文件的读/写性能。虽然整理是一个缓慢而烦人的过程,但对提升系统运行和文件读写性能还是十分有帮助的。整理过程一般不会很明显地影响用户使用,特别是升级到 Windows 10 后,系统自身就会在后台自动为您进行碎片整理。

二、Mac操作系统为什么不需要碎片整理

简单回答就是:由于 macOS 使用与 Windows 完全不同的文件系统,原生就屏蔽掉了这个问题;而且现在几乎所有 Mac 设备出厂都配置 SSD 磁盘,所以也不需要进行碎片整理。

取决于 macOS 对文件的存储方式,即便使用 HDD 外接硬盘或旧款 Mac 设备,也不存在碎片整理的问题。Mac 所使用的 HFS 和 APFS 文件系统,都支持名为热文件自适应簇和动态碎片整理的处理过程,可以自动处理碎片化的文件,根本无需用户干预。说白了,就是从文件系统底层和操作系统调度上就将文件碎片化的问题给屏蔽掉了。

当用户在 macOS 中存储文件时,首先它会自动在磁盘上为该文件留出一定的增长空间,而不是将下一个文件直接打包到它(磁盘)旁边;此外,当您打开某个文件时,macOS 还可以检测该文件是否位于错误的位置并自动将其移动到正确的位置。将这两个机制结合运用,味着用户几乎不需要对磁盘进行碎片整理。事实上,苹果也根本没在系统中提供磁盘整理工具。

三、Linux操作系统为什么不需要碎片整理

Linux 下的文件系统目前多数使用 ext4,它是 Ubuntu 和目前大多数 Linux 发行版所采用的文件系统,ext4 以一种更加智能的方式来放置文件。Linux 的文件系统会将文件分散在整个磁盘,在文件之间留有大量的自由空间,而不是像 Windows 那样将文件一个接一个的放置。当一个文件被编辑了并且变大了,一般都会有足够的自由空间来保存文件。如果碎片真的产生了,文件系统就会尝试在日常使用中将文件移动来减少碎片,所以不需要专门的碎片整理程序。同时 Linux 下的其他文件系统没有整理碎片的必要,只需要记住这一个原因:Linux 原本就是基于多用户同时使用的目的而开发的,硬盘的读取频率肯定要比 Windows 的高。

Linux 的这个将文件分散存放策略保证不因为碎片而降低读写速度,但是并不是说 Linux 的文件系统没有碎片,碎片是有的,但是非常的少,少到没有必要来整理,所以一般来说,Linux 的文件系统的碎片率很低,低到不影响硬盘的读写速度。频繁地使用碎片整理工具,不但不会加快读写速度,反而会减少硬盘的寿命。

如果你用的是 Linux 系统,那就彻底不要整理硬盘,否则只会影响硬盘的寿命,而不会增加多少性能。当然,如果你追求更高的运行性能偶尔处理一下碎片整理也未尝不可。

相信今天很多的软件工程师使用的都是 Linux 或者 macOS 系统,与 Windows 不同,我们很难看到磁盘碎片整理这一概念,从个人的经验来看,作者在过去七八年没有在 macOS 中整理过磁盘的碎片,你在今天的磁盘工具中也找不到相关的操作,只能通过 diskutil 命令设置某一块磁盘是否开启或者关闭碎片整理。

图 1 - macOS 磁盘工具

我们在 前一篇文章 中曾经分析过为什么早期 Windows 操作系统每隔一段时间可能需要整理磁盘上的碎片1,该问题背后有两个原因,其一是 Windows 使用的 FAT 是很简单的文件系统,该文件系统的设计决定了同一份文件可能会散落在磁盘的不同位置,其二是固态硬盘在上古时代没有普及,机械硬盘的随机读写性能很差。

Linux 和 macOS 系统不需要碎片整理的原因与 Windows 需要碎片整理的原因正好相反:

  • Linux 和 macOS 使用的文件系统或者降低了碎片发生的概率或者实现自动整理碎片的特性;
  • 固态硬盘与机械硬盘具有不同的特性,碎片整理可能不仅对提高读写性能没有显著的帮助,还不利于硬件的使用寿命;
文件系统

Linux 一般都使用 Ext2、Ext3 和 Ext4 文件系统,今天的大多数 Linux 发行版都选择了 Ext4。与 Windows 将多个文件连续存储的方式不同,Linux 会把文件散落到磁盘的不同地方存储,同时在文件之间留下一些空间,保证文件在修改或者更新时不会造成碎片。

图 2 - Linux 文件系统2

今天的 macOS 多数都使用 APFS 文件系统3,它是苹果专门为固态硬盘等设备优化的文件系统。更早的 HFS 和 HFS+ 都是用了基于区块(Extent)的设计,每个区块都包含序号和一段连续的存储空间,这种分配方式会在文件系统中查找几个连续的区块来提供所需的空间。

图 3 - macOS 文件系统

无论是 Linux 还是 macOS,它们的文件系统都是基于区块设计的,而磁盘的空间分配也相对比较合理,所以不会出现 Windows 系统上碎片化的磁盘。

除了文件系统在设计就避免了碎片的出现之外,Linux 和 macOS 也都是引入了延迟分配空间的策略,它们会通过缓冲区尽可能延迟磁盘写入的时间,这样不仅能够降低刷盘的概率,还能增加文件写入相邻区块的概率,然而这种机制并不是没有副作用,在系统断电或者崩溃时可能会丢失更多的数据。

如果磁盘上确实出现了碎片,那么 Linux 和 macOS 的文件系统也会尝试移动出现碎片的文件,不需要额外的碎片整理工具,这种设计带来的用户体验会比手动触发耗时较长的碎片整理好很多。macOS 上的 HFS+ 系统还支持实时的去碎片化,当满足以下条件时会触发碎片整理4:

  • 文件小于 20 MB;
  • 文件存储在 8 个以上的区块上;
  • 文件在过去一分钟没有被更新;
  • 系统已经启动了三分钟;

在多数情况下,这些操作系统中的磁盘碎片比例都非常低,只有在磁盘空间不足时才会开始出现碎片,所以在这时我们其实需要的是一个更大的磁盘或者更新的电脑,而不是整理磁盘上的碎片。

固态硬盘

固态硬盘其实已经是有着三十年历史的存储介质了,但是由于固态硬盘的价格在过去一直都十分昂贵,所以没有在数据中心和个人电脑中普及开来。哪怕是在今天,机械磁盘的价格与固态硬盘相比也有比较明显的优势。

图 4 - 固态硬盘和机械硬盘价格对比

新型的存储介质带来了全新的特性和性能,我们在前一篇文章中曾经介绍过,因为机械硬盘的机械结构,所以它的随机 I/O 与顺序的 I/O 性能可能相差几百倍,碎片整理可以将散落在磁盘上的数据合并到一处,随机 I/O 的次数减少自然也会提高读写文件的性能。

固态硬盘的顺序 I/O 和随机 I/O 在性能上虽然也有差异,但是差距可能在十几倍到几十倍之间,而固态硬盘的随机 I/O 延迟也比机械磁盘好几十倍甚至上千倍,到现在来看整理固态硬盘上的碎片虽然有收益,但是也比较有限。

图 5 - NAND 闪存的演进

作为电子元件的固态硬盘虽然有着较好的性能表现,但是固态硬盘都有循环擦写的次数限制,也被称作 P/E。它的寿命与机械硬盘相比却比较有限。如果一个 512 GB 的固态硬盘的擦写数目是 1000 次,每次写满数据都会消耗一次寿命,等擦写次数达到 1000 次之后硬盘就会报废,碎片整理其实就是主动移动硬盘上的数据,自然会影响硬件的寿命。

总结

在软件工程中有一个非常有趣的现象,做硬件和基础架构的工程师都在拼命优化系统的性能,然而应用层的工程师很多时候并不在乎性能上的微小差异,而这也是工作职责上的差异带来的结果,不同的位置决定了不同的关注点。

硬件的演进和革新深深地影响着上层软件的设计,想要设计出通用的系统是异常困难的,在设计文件系统时如果不考虑底层硬件的特性,也就无法充分利用硬件提供的性能并得到期望的结果。这里简单总结一下 Linux 和 macOS 不需要碎片整理的两个原因:

  • 文件系统基于区块分配的设计使得磁盘上出现碎片的概率很低,延迟分配和自动的整理策略解放了操作系统的使用者,在多数情况下不需要考虑磁盘的碎片化;
  • 固态硬盘的随机读写性能远远好于机械硬盘,随机读写和顺序读写虽然也有性能差异,但是没有机械硬盘的差异巨大,而频繁的碎片整理也会影响固态硬盘的使用寿命;

到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题,与前面的问题不同,作者会在后面的文章中解答这两个问题:

  • 为什么固态硬盘的擦写次数有上限?
  • 机械硬盘在哪些情况下更容易损坏?

如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容。

推荐阅读
  • 032 为什么 CPU 访问硬盘很慢
  • 034 为什么 HugePages 可以提升数据库性能
参考资料
  1. 为什么早期的 Windows 需要整理碎片 为什么早期的 Windows 需要整理碎片 - 面向信仰编程 ↩︎

  2. Is there a tool to visualize a filesystem allocation map on Linux? Is there a tool to visualize a filesystem allocation map on Linux? - Unix & Linux Stack Exchange ↩︎

  3. Wikipedia: Apple File System https://en.wikipedia.org/wiki/Apple_File_System ↩︎

  4. HFS+ and File System Fragmentation HFS+ and File System Fragmentation - Developer Coach ↩︎

关注
打赏
1657159701
查看更多评论
立即登录/注册

微信扫码登录

0.1223s