3

在大型存储库上分析 Git 时,我发现 git status 在 mac 上比在 linux 上慢得多(10 倍)。git statuslstat在存储库中的每个文件上运行,这就是缓慢的来源。

与 linux 相比,mac 上的这个系统调用慢得多有什么特别的原因吗?

4

1 回答 1

3

首先检查你的 Git 版本,因为最近的 Git 版本已经有了改进(比如git add2.202.22 中的 git stash,甚至是即将到来的带有子模块的 2.27)。

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

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


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

很明显,macOS 10.14 Mojave 已经收到了相对于 macOS 10.13 的性能工作!
尽管有这些改进,APFS 仍然在内核中花费大量 CPU 时间。并且内核 CPU 时间与 Linux/EXT4 相比仍然比较高,即使对于单进程操作也是如此。

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

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

于 2020-04-17T05:48:14.793 回答