使用数十万个小文件提高 git 存储库的性能

Improving performance of git repo with hundreds of thousands of small files

我正在尝试提高 git 存储库的性能,我几乎专门使用它来对科学计算项目进行版本控制。该项目的模拟软件将极小(小于 100KB)的纯文本文件压缩到相当深的目录中,代表独立的、相对经济的模拟结果。我指出这些是经济的,表明我可以在短时间内创建数千个,这意味着情况只会越来越糟。这些模拟是 运行 作为批次,这可能意味着单个提交可以包含数百 MB 的数据,所有这些数据都以这些填充有极小文本文件的深层子树的形式出现。我 运行 正在使用的机构计算集群使用 33TB RAID6 磁盘驱动器阵列来存储我组的所有数据(如果重要的话,这个驱动器目前没有大量的空间百分比 -约 1.6 TB)。

我有理由相信 RAID6 阵列的性能很差,因为当我 运行 顶级 git add . 可能需要几十分钟,即使只有几个文件已改变。承诺同样糟糕。推送,一旦事情被提交通常仍然需要几分钟,但速度要快一些(推送的缓慢部分不是它通过网络发送数据的部分)。在我请求额外内核的交互式会话中执行所有这些操作也会加快速度,但完成添加新模拟结果仍需要几分钟时间。当我在装有现代 NVME-PCIE SSD 的笔记本电脑上执行相同操作时,这些操作需要几秒钟。

那么,有什么建议吗?我查看了 git lfs,但我不相信这会对我有很大帮助,因为它创建的指针不会比它们指向的文件小一百万倍,这是正常的用例。如果人们仍然认为它有帮助,我想我可以尝试一下。此外,如果重要的话,集群的 linux 是旧的(当然)所以:git version 1.8.3.1...

很高兴在需要时添加更多上下文。编辑 git count-objects -vH returns:

count: 1
size: 4.00 KiB
in-pack: 229216
packs: 1
size-pack: 1.25 GiB
prune-packable: 0
garbage: 0
size-garbage: 0 bytes

P.S。我确实添加了 large-data 标签,即使我的数据可以轻松地放在一台设备的存储介质上。我添加它是因为数据已经变得 large/complicated 足以变得笨拙,正如 post 所解释的那样。如果人们认为那真的不合适我可以删除它。

正如@CodeCaster 指出的那样,我集群上的 git 确实很古老,这在一定程度上是问题的根源。我不完全相信我学校集群上的 raid 阵列不仅速度慢,而且在更新到最近的 git 之后,我的拉、推、添加和提交都变得不那么痛苦了。他们已经从几十分钟变成了几秒钟(这是我习惯的速度)。

就其价值而言,this SO answer 是说服我尝试升级 git 的原因(再次感谢@CodeCaster)。正如@torek 指出的那样,回购协议是向后兼容的,因此处理我的回购协议没有任何问题,该回购协议由 2015 年的 git 和今年的 git 处理。

如果任何阅读本文的人得出结论,因为他们在共享基础架构上没有 root 权限,因此追求此解决方案会很烦人,我的方法是使用 conda 在 git无论如何,我正在使用 conda 环境。从这个 post conda install -c conda-forge git 开始,在干净的 miniconda3 环境中将为您提供 git 2.30.2,这是最新的。另一个 SO post 中提到的最新性能更新是在版本 2.24 中。我想本地 git 安装还有其他途径,但在科学计算环境中,通常用户可以使用本地 conda 而不会遇到太多麻烦,这似乎是更新版本的最简单途径。