与 Ext4 (Linux) 相比,为什么 lstat 在 APFS (OSX) 上的性能较差

2024-03-19

在对大型存储库上的 Git 进行分析时,我发现 git status 在 Mac 上比在 Linux 上慢得多(10 倍)。 git status 运行lstat在存储库中的每个文件上,这就是缓慢的根源。

与 Linux 相比,这个系统调用在 Mac 上慢得多,是否有特殊原因?


首先检查您的 Git 版本,因为最近的 Git 版本有一些改进(例如git add in 2.20 https://stackoverflow.com/a/53346723/6309, 2.22 中的 git stash https://stackoverflow.com/a/59347116/6309甚至是即将推出的 2.27 及子模块 https://stackoverflow.com/a/60905327/6309).

Even git status使用 Git 2.24 进行了改进 https://stackoverflow.com/a/43644347/6309

The feature.manyFiles设置适用于工作目录中有许多文件的存储库。
通过设置index.version=4 and core.untrackedCache=true,诸如 'git status' 应该改进。


APFS 与 Ext4 中 lstats 差异的一项分析是在“APFS 中的全局内核锁 https://gregoryszorc.com/blog/2018/10/29/global-kernel-locks-in-apfs/" by 格雷戈里·索尔克 https://github.com/indygreg:

很明显,macOS 10.14 Mojave 相对于 macOS 10.13 获得了性能提升!
尽管有这些改进,APFS 仍然在内核中花费了大量的 CPU 时间。与 Linux/EXT4 相比,即使对于单进程操作,内核 CPU 时间仍然相对较高。

虽然我无法确认 APFS 的源代码,但分析结果显示在lck_mtx_lock_grab_mutex()结合并行进程数减少时执行时间减少的事实,我得出结论:APFS 在 readdir() 等只读操作期间获得全局内核锁。

换句话说,APFS 在尝试执行并行只读 I/O 时会变慢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与 Ext4 (Linux) 相比,为什么 lstat 在 APFS (OSX) 上的性能较差 的相关文章

随机推荐