我们有一个相当大的 SVN 存储库。我们添加的代码越多,进行 SVN 更新所花费的时间就越长。我们添加svn:externals
到在一些项目中重复的文件夹中,例如各种网站上的FCKeditor。这有帮助,但没有那么多。
减少更新时间和提高 SVN 速度的最佳方法是什么?
我们有一个相当大的 SVN 存储库。我们添加的代码越多,进行 SVN 更新所花费的时间就越长。我们添加svn:externals
到在一些项目中重复的文件夹中,例如各种网站上的FCKeditor。这有帮助,但没有那么多。
减少更新时间和提高 SVN 速度的最佳方法是什么?
如果它是一个较旧的 SVN 存储库(或者甚至是相当新的,但没有以最佳方式设置),它可能使用较旧的 BDB 存储库数据库样式。 http://svn.apache.org/repos/asf/subversion/trunk/notes/fsfs有关于新的注释。从一个转换到另一个并不难 - 转储整个历史记录,使用新的 svn 文件系统格式重新初始化并重新导入。同时过滤 repo-dump 以删除无用信息的整个签入可能也很有用(例如,我删除了某人签入的 20MB+ tarball 文件)。
就一般速度而言 - 质量(快速)的硬盘驱动器和基于操作系统的缓存的额外内存在提高 SVN 的工作速度方面很难出错。
在客户端,如果您通过 PuttyAgent 设置了 tortoisesvn 以通过 SSH 访问外部存储库机器,您还可以启用 SSH 压缩,这也有帮助。
编辑: SVN v1.5 还具有fsfs-reshard.py工具,它可以帮助将基于 FSFS 的 svn 存储库拆分为多个目录 - 这些目录本身可以链接到不同的驱动器主轴。如果您有数千个修订版,那也会有所帮助 - 如果没有其他原因,只是在数千个文件中查找一个文件需要时间(并且您可以通过查看 IOwait 时间来判断这是否是一个问题)
禁用对包含工作副本代码的文件夹的病毒检查。这导致我的更新速度提高了一倍。
不是一个真正的答案,但知道 svn 如此 I/O 繁重的原因之一是它在 .svn/text-base 目录中存储了每个文件的一个额外副本,这可能会很有趣。这使得本地差异操作快速,但会占用大量硬盘空间和 I/O。
http://subversion.tigris.org/issues/show_bug.cgi?id=525有详细信息。
听起来您在一个存储库中有多个项目。在适当的地方将它们分开会给你带来很大的提升。
据推测,由于它存储/处理更改的方式,Git 比 Subversion 快得多,但我没有第一手经验。
有一些常见的性能调整。SVN 的 I/O 非常繁重,因此可以选择更快的硬盘(在两端)。为您的服务器添加更多内存。确保您的客户端具有碎片整理的硬盘(适用于 Windows)。
您使用什么访问方法也很重要。存储在远程文件系统上的存储库(使用 file:/// 访问)将比使用 mod_svn 的 svnserve 或 Apache 慢得多。如果您在简单文件共享上拥有存储库,请考虑使用后者之一。
确保您与服务器的连接速度尽可能快(千兆以太网)。确保服务器在阵列中有快速磁盘。而且,当然,只检查你需要什么。
TotoiseSVN 默认在后台查看文件更改,我发现这会降低我的机器速度。我更改了配置以排除所有内容,然后仅包含我有结帐的目录。您也可以关闭背景调查。这两个设置都在 Icon Overlays 设置节点中。
有时缓慢的 svn 操作,尤其是在有许多外部的情况下,是与 DNS 相关的。看起来 svn 执行每个 svn:external 的 DNS 查找,即使是相对的。将您的 svn 服务器主机名添加到 /etc/hosts 或修复 resolv.conf 会很有用。
我根据自己的经验(即:不是通过任何实际测试)发现,特别是如果 SVN 存储库服务器是远程的,使用外部似乎会减慢速度。如果你在多个地方有重复的代码(比如你的 FCK 编辑器),我会倾向于坚持使用外部,因为保持这些文件同步和可管理比更新速度更重要 - 不过,你可以考虑使用符号链接来带来而是在重复的代码中。(如果您使用的是 Windows XP,则可以使用junction points)。
我们将代码库拆分为几个同级模块并编写了 Ant 脚本,这样一位开发人员就可以一次处理一个模块,而不必过多地关心其他模块中发生的事情。
通常,开发人员需要每周更新他们的整个树几次,但在午餐/咖啡休息时间之前很容易完成。
使用读访问权限(即限制对某些人/组的读访问)会大大降低存储库的速度。特别是当以某种特殊方式进行身份验证时,例如针对 Windows 域。当然,写访问权限也是如此,但写的频率不如读的频繁。限制写访问可能比限制读访问更重要
如果你的仓库根目录有很多文件夹,而你的本地副本反映了仓库,那么尝试将单体本地副本分割成许多单独的可下载文件夹,并分别更新这些文件夹,这将比一个大文件夹快得多。