我的 HDD 仍然在内核为 4.9 的 Debian Stretch 系统上运行。HDD 也在该内核上进行了 mkfs。当我手动将硬盘安装到其上时,会出现一些短促且几乎听不见的访问噪音。
当我启动内核为 5.15 或 6.2 的 Linux 并安装 HDD 时,它会变得非常吵闹并持续大约 8 秒,似乎是由整个 HDD 的访问引起的,就像某种密集的快速检查一样。
这是什么原因呢?如果可能的话:是否可以禁用或至少限制每个 X 初创公司而不带来任何缺点?
我的 HDD 仍然在内核为 4.9 的 Debian Stretch 系统上运行。HDD 也在该内核上进行了 mkfs。当我手动将硬盘安装到其上时,会出现一些短促且几乎听不见的访问噪音。
当我启动内核为 5.15 或 6.2 的 Linux 并安装 HDD 时,它会变得非常吵闹并持续大约 8 秒,似乎是由整个 HDD 的访问引起的,就像某种密集的快速检查一样。
这是什么原因呢?如果可能的话:是否可以禁用或至少限制每个 X 初创公司而不带来任何缺点?
当文件系统以读/写方式挂载时,较新版本的 Linux 内核将预取块位图。这是在后台以较低优先级完成的,以防止它减慢任何前台任务的速度。此预取的目标是防止同步写入 --- 例如,如果您正在运行数据库工作负载或 NFS 服务器,则 fsync 或文件系统写入的要求在 NFS 客户端确认之前必须持久--- 如果文件系统的可用空间碎片严重,则在首次安装文件系统时可能需要很长时间。
对于吝啬的用户来说,这往往是一个问题,他们会让云的块设备达到 99% 的满载率,然后将其增长一小部分空间——比如 10GB,然后等到块设备达到满载状态。 99%,然后再给它10GB,依此类推。这不仅会导致性能逐渐下降,而且在虚拟机重新启动并且文件系统重新重新启动后,现在第一次尝试同步块分配时,块分配器可能需要读入潜在的数千个块位图以找到一组连续的块以实现最佳数据放置 --- 或者通过使用一堆单独的空闲 4k 块来妥协,从而导致文件碎片非常严重。
为了解决这个问题,首先,我们试图传达这样的信息:试图通过等到最后一刻然后以非常小的数量增加块设备来节省最后一分钱是一个非常愚蠢的想法,因为您所花费的几美分存储成本被 CPU 成本和每秒交易量减少所淹没。接下来,我们对块位图进行后台预取,最后,如果在我们需要进行分配时未读入所有块位图,我们会调整块分配器,以尽量不那么完美地找到最佳分配器可能的块分配,并选择稍微碎片化的文件,因为它比花费几分钟的 fsync 更可取(在一些极其病态的最坏情况下)。
块位图预取几乎没有缺点,而且有很多优点,因此默认情况下启用它。但是,如果这几秒钟的磁盘活动让您感到不舒服,您可以通过挂载选项 no_prefetch_block_bitmaps 将其关闭。(挂载选项主要用于调试,因此我们可以在开发该功能时进行 A/B 实验。)但是,我不建议将其关闭。