【问题标题】:Can I optimize a Mercurial clone?我可以优化 Mercurial 克隆吗?
【发布时间】:2011-09-30 19:27:38
【问题描述】:

我的 Mercurial 克隆变得异常缓慢,可能是由于磁盘碎片。有办法优化吗?

创建一个新克隆的明显方法,然后将我的 MQ、保存的包、hgrc 等复制到新克隆并删除旧克隆。但似乎有人可能以前遇到过这个问题并做了一个扩展来做到这一点?

【问题讨论】:

  • 根据我对 Mercurial 的了解,Mercurial 所做的任何事情都不会使其在碎片等方面变慢。您是否尝试过在磁盘上运行普通磁盘碎片整理程序?还有,什么样的操作慢,有多慢等等?
  • hg qref 真的很慢。一个有 70000 次提交的 repo 可能需要 50 秒。我同意这不是一个反复无常的特定问题(尽管我认为反复无常的访问模式会加剧它),但 Mac 没有内置的碎片整理程序 (AFAICT)。

标签: optimization mercurial defragmentation


【解决方案1】:

如果清单变得特别大,则可能会导致性能下降。 Mercurial 有另一种存储库格式 - generaldelta - 通常可以生成更小的清单。

您可以使用以下方法检查清单的大小:

ls -lh .hg/store/*manifest*

从generaldelta中获取最大值:

  1. 安装 Mercurial 2.7.2 或更高版本(2.7.2 包含对一般delta 中的一个错误的修复,该错误可能会导致更大的清单大小 - 但很有可能您不会遇到早期版本的错误) .

  2. 执行hg --config format.generaldelta=1 clone --pull orig orig.gd

这可能会改善清单大小,但不会带来全部好处。

  1. 执行hg --config format.generaldelta=1 clone --pull orig.gd orig.gd.gd

克隆的克隆可能会在清单大小上提供更大的改进。这是因为从 generaldelta repo 中提取时,将重新排序以优化清单大小。

作为 generaldelta 潜在好处的一个例子,我最近转换了一个大约 55000 个 SVN 提交(使用 hgsubversion 拉取)加上大约 1000 个 Mercurial 提交/合并/移植等的存储库。原始存储库中的清单是 ~1.4国标。第一个克隆中的清单约为 600MB。克隆的克隆中的清单约为 30MB。

关于 generaldelta 在线的信息并不多 - 在它成为默认格式之前还有很多工作要做,但它适用于许多项目。最初的几个 Google 搜索结果包含了一些首次引入时的信息,并且最近在 mercurial-dev 邮件列表上进行了一些讨论。

【讨论】:

  • +1 即使对于约 3400 次提交的较小存储库和更小约 17MB 的原始清单大小,两个克隆将一些 hg 操作减少到原始时间的三分之一(最终清单为 11MB)。
【解决方案2】:

我删除了 repo 并重新克隆,这提高了性能。

【讨论】:

  • 这意味着:你失去了所有的历史。这是很少见且有利的解决方案。
  • Abel:你为什么会失去所有的历史?
  • 哦,对不起,我误会了,以为你的意思只是小费的副本。仍然不确定如何重新克隆已删除的内容。或者你的意思是让服务器状态保持原样,只进行一个新的克隆?即,您的意思是仅删除本地克隆?不是和purge一样吗?
  • 这个想法是,当您进行克隆时,它们将在磁盘上以低碎片创建(也就是说,它们将彼此相邻,这意味着它们会很快访问)。但是,稍后添加新文件时,它们将存储在磁盘的不同部分,访问速度会较慢。随着时间的推移,这将变得缓慢。通过重新开始,您可以在磁盘的同一部分获取所有文件,从而加快速度(有点像 Windows 上的碎片整理程序)。
  • 啊,也许这应该反映在您的回答中))。不过,使用 ram 驱动器对我的情况没有帮助。
【解决方案3】:

关闭对 repo 克隆到的文件夹的实时防病毒监控和碎片整理。您无能为力。

【讨论】: