微软的 Linux 工程师 Christian Brauner 提交了他的 12 个 pull 请求,涉及 Linux 内核的 VFS 部分。这些针对 Linux 6.18 内核的更改包括一个 pull 请求,它修改了写回代码,以解决用户报告的systemd 单元读取大量文件时出现的死锁问题。
这些死锁问题在实际中会出现在 systemd 单元从使用”lazytime”挂载选项的文件系统读取大量文件时。Lazytime 是仅更新文件 inode 内存版本上的访问/修改/创建时间的选项,以帮助提高性能并减少磁盘写入。磁盘上的时间戳会在 fsync 和类似操作期间或从内存中移除时更新,以及其他可能性。
Linux 开发者发现,对于使用 lazytime 挂载选项读取大量文件的 systemd 单元,在退出到父 cgroup 时可能会出现 “数十万或数百万” 个脏 inodes。反过来,系统可能会因为 100% 的 CPU 使用率而持续数小时受到影响。

该拉取请求详细说明了这个问题:
“这包含了对用户报告的问题的修复,即当 Systemd 单元从使用 lazytime 挂载选项挂载的文件系统中读取大量文件并退出时出现的死锁。
在使用 lazytime 挂载选项时,我们可以在 cgroup 退出时将许多脏 inodes 切换到父 cgroup。当大型 cron 任务的 systemd 分片退出时,实际观察到的数字很容易达到数十万或数百万。”
inode_do_switch_wbs()中的逻辑将 inode 排序到目标 wb 的 b_dirty 列表中的适当位置,但其复杂度与脏 inode 的数量呈线性关系,因此切换所有 inode 的整体时间复杂度为二次方,导致工作线程被长时间占用,CPU 使用率达到 100%,并切换 inode 到父 wb。
该拉取请求还包含一个小型示例脚本,用于在现有的 Linux 内核版本上展示该问题。
这个问题应该会在即将到来的 Linux 6.18 合并窗口中,这些补丁合并后得到解决。
转自 Linux 6.18 Will Fix Lockups When Systemd Units Read Lots Of Files – Phoronix
Linuxeden开源社区