当前位置: 首页 > 科技观察

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

时间:2023-03-14 17:22:30 科技观察

Why'sTheDesign(Why'sTHEDesign)是一系列关于计算领域编程决策的文章。在本系列的每篇文章中,我们都会提出一个特定的问题,并从不同的角度讨论设计。优缺点,影响具体实施。我相信现在很多软件工程师都使用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],这是Apple针对固态硬盘等设备优化的文件系统。早期的HFS和HFS+都采用了基于块(Extent)的设计,每个块都包含一个序号和一个连续的存储空间,这种分配方式会在文件系统中寻找连续的几个块来提供所需的空间。图3-macOS文件系统无论是Linux还是macOS,它们的文件系统都是基于块设计的,磁盘空间分配也比较合理,所以在Windows系统上不会出现磁盘碎片。除了文件系统的设计是为了避免碎片化,Linux和macOS还引入了延迟空间分配的策略。它们会通过缓冲区尽可能地延迟磁盘写入时间,这样不仅可以减少闪退的概率,还可以增加文件被写入相邻块的概率。但是,这种机制并非没有副作用,当系统断电或死机时,可能会丢失更多的数据。如果磁盘确实出现碎片,Linux和macOS文件系统也会尝试移动碎片文件,不需要额外的碎片整理工具,而且这种设计会导致用户体验比手动触发碎片整理花费的时间长很多。macOS上的HFS+系统还支持实时碎片整理,当满足以下条件时触发碎片整理[^4]:文件小于20MB;文件存储在8个以上的块上;该文件在过去一分钟更新中没有损坏;系统已启动三分钟;在大多数情况下,这些操作系统中的磁盘碎片率很低,只有在磁盘空间不足时才开始碎片化,所以这个时候我们实际上需要更大的磁盘或更新的计算机而不是对磁盘进行碎片整理。固态硬盘固态硬盘其实是一种有30年历史的存储介质,但是由于过去固态硬盘的价格一直很贵,所以一直没有在数据中心和个人电脑中普及。即使在今天,机械盘的价格与固态硬盘相比也有着明显的优势。图4——固态硬盘与机械硬盘的价格对比新的存储介质带来了新的特性和性能。我们在上一篇文章中介绍过。由于机械硬盘的机械结构,其随机I/O和顺序不同磁盘的I/O性能可能相差数百倍。碎片整理可以将分散在磁盘上的数据合并到一个地方。随机I/O次数的减少,自然会提高读写文件的性能。固态硬盘的顺序I/O和随机I/O虽然在性能上有差异,但差距可能在十几倍到几十倍之间,而固态硬盘的随机I/O延迟也是几十倍比机械盘好。甚至几千次,到现在为止,对固态硬盘进行碎片整理虽然有利可图,但也比较有限。图5-NAND闪存的演变。固态硬盘作为电子元器件虽然性能更好,但是固态硬盘对擦写次数有限制,也就是P/E。与机械硬盘相比,它的使用寿命有限。一块512GB的SSD如果可以擦写1000次,每次都装满数据,会耗掉一辈子。擦写次数达到1000次后,硬盘就报废了。碎片整理实际上是主动移动硬盘上的数据。会影响硬件的寿命。总结在软件工程中有一个非常有趣的现象。从事硬件和基础设施工作的工程师正在尽最大努力优化系统的性能。但是,应用层的工程师往往不关心性能上的小差异,这也是工作职责的差异。因此,不同的位置决定了不同的关注点。硬件的演进和革新深刻影响着上层软件的设计。设计一个通用系统是极其困难的。如果在设计文件系统时不考虑底层硬件的特性,就不可能充分发挥硬件提供的性能,得到理想的结果。这里简单总结一下Linux和macOS不需要碎片整理的两个原因:基于块分配的文件系统设计使得磁盘出现碎片的概率非常低,延迟分配和自动碎片整理策略解放了用户的操作系统。大多数情况下,不需要考虑磁盘碎片;固态硬盘的随机读写性能要比机械硬盘好很多。虽然随机读写和顺序读写在性能上存在差异,但机械硬盘并无巨大差异,频繁的碎片整理也会影响SSD的使用寿命;