为什么我的 ext4 HDD 在内核 4.9 上无声,而在 5.15 或更高版本上却有噪音?

为什么我的 ext4 HDD 在内核 4.9 上无声,而在 5.15 或更高版本上却有噪音?

我有一块硬盘,仍在内核为 4.9 的 Debian Stretch 系统上运行。硬盘也在该内核上进行了 mkfs。当我手动将硬盘安装到硬盘上时,会发出几声短暂且几乎听不见的访问噪音。

当我启动内核为 5.15 或 6.2 的 Linux 并将 HDD 安装在那里时,它会变得非常响亮且嘈杂,持续约 8 秒,似乎是由对整个 HDD 的访问引起的,就像某种密集的快速检查一样。

这是什么原因?如果可能的话:是否可以禁用此功能或至少将其限制到每个 X 启动而不会产生任何不利影响?

答案1

当文件系统以读写方式挂载时,较新版本的 Linux 内核将预取块位图。此操作在后台以较低优先级完成,以防止其减慢任何前台任务的速度。此预取的目的是防止同步写入 --- 例如,如果您正在运行数据库工作负载或 NFS 服务器,则 fsync 或文件系统写入要求在 NFS 客户端确认之前必须持久 --- 如果文件系统的可用空间严重分散,则在首次挂载文件系统时可能需要很长时间。

对于精打细算的用户来说,这往往是一个问题,他们会让云的块设备达到 99% 的容量,然后增加一点空间 --- 比如 10GB,然后等到块设备达到 99% 时再给它 10GB,依此类推。这不仅会导致性能逐渐下降,而且在 VM 重新启动后,文件系统也刚刚重新启动,现在第一次尝试同步块分配时,块分配器可能需要读取数千个块位图来找到一组连续的块,以实现最佳数据放置 --- 或者通过使用一堆单独的空闲 4k 块来妥协,导致文件非常碎片化。

为了解决这个问题,首先,我们试图传达这样的信息:为了节省每一分钱,等到最后一分钟,然后将块设备稍微增加一点,这是一个非常愚蠢的想法,因为你在存储成本上节省的几分钱,被 CPU 成本和每秒减少的交易量淹没了。接下来,我们在后台预取块位图,最后,如果在需要进行分配时没有读入所有的块位图,我们会调整块分配器,尝试在寻找最佳块分配时不那么完美,并接受一个稍微碎片化的文件,这比 fsync 需要几分钟(在某些极其病态的最坏情况下)要好。

块位图预取几乎没有缺点,而且有很多优点,因此默认情况下启用它。但是,如果这几秒钟的磁盘活动让您感到不快,您可以通过挂载选项 no_prefetch_block_bitmaps 将其关闭。(挂载选项主要用于调试,以便我们可以在开发该功能时进行 A/B 实验。)但我不建议将其关闭。

相关内容