为啥 lstat 在 APFS (OSX) 上的性能比 Ext4 (Linux) 差

Posted

技术标签:

【中文标题】为啥 lstat 在 APFS (OSX) 上的性能比 Ext4 (Linux) 差【英文标题】:Why is performance of lstat poor on APFS (OSX) compared to Ext4 (Linux)为什么 lstat 在 APFS (OSX) 上的性能比 Ext4 (Linux) 差 【发布时间】:2020-07-30 09:59:38 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

首先检查你的 Git 版本,因为最近的 Git 版本已经有了改进(比如 git add in 2.20、git stash in 2.22 甚至是 upcoming 2.27 with submodules)。

甚至git status improved with Git 2.24

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


Gregory Szorc 在“Global Kernel Locks in APFS”中对 APFS 中 lstats 与 Ext4 的差异进行了分析:

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

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

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

【讨论】:

感谢您的回答,尤其是 Gregory Szorc 的引用 + 链接。根据您的引用,无论 git 本身的底层改进如何,git 似乎都将维持 Mac 上相对于其他系统的瓶颈,因为这些也应该改进其他系统。 Mac OS 环境的另一个隐藏成本。

以上是关于为啥 lstat 在 APFS (OSX) 上的性能比 Ext4 (Linux) 差的主要内容,如果未能解决你的问题,请参考以下文章

为啥 OSX 上的 std::mutex 这么慢?

为啥异常不适用于 OSX 上的 gcc7 和 -static-libgcc?

Apple 文件系统 (APFS) 检查文件是不是是终端 (shell) 上的克隆

带有 APFS 的 High Sierra 上的小部件

osx 上的 emacs 23 和 24:为啥 aquamacs-kill-word 有时会删除到行尾?

Mac OSX 上的 XAMPP:为啥作为“守护进程”运行? [关闭]