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

Uts*_*hah 4 git stat apfs

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

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

Von*_*onC 5

首先检查您的 Git 版本,因为最近的 Git 版本有所改进(例如git add2.202.22 中的 git stash,甚至即将推出的带有子模块的 2.27)。

甚至git status使用 Git 2.24 进行了改进

feature.manyFiles设置适用于工作目录中包含许多文件的存储库。
通过设置index.version=4core.untrackedCache=true,诸如“ ”之类的命令git status应该会得到改进。


Gregory Szorc在“ APFS 中的全局内核锁”中对 APFS 中的 lstats 与 Ext4 的差异进行了分析:

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

虽然我无法确认 APFS 的源代码,但分析结果显示花费了过多的时间,lck_mtx_lock_grab_mutex()再加上并行进程数减少时执行时间减少的事实,使我得出结论:APFS 在读取期间获得了全局内核锁-仅限 readdir() 等操作。

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

  • 感谢您的回答,特别是 Gregory Szorc 的引用+链接。根据您的引文,无论 git 本身有什么潜在的改进,git 似乎都会保持 Mac 上相对于其他系统的瓶颈,因为这些也应该改进其他系统。Mac OS 环境的另一个隐性成本。 (2认同)