svn性能优化需三步诊断与五项调优:先用svnlook和iostat定位瓶颈,再禁用fsfs冗余校验、调优apache连接参数、隔离大文件仓库、升级至fsfs v7格式,可显著提升提交与检出速度。

当Subversion仓库中二进制文件增多、提交变慢、检出耗时超过30秒,或Apache代理SVN服务时出现504超时,说明性能瓶颈已真实影响开发节奏——这不是理论问题,而是每天卡在svn commit上喝第三杯咖啡的现实。
识别SVN性能瓶颈的三个必查点
第一步:用 svnlook youngest /path/to/repo 确认最新版本号,再执行 time svnlook tree -r HEAD /path/to/repo | wc -l。若返回行数超5万且耗时>2秒,说明目录树遍历已成瓶颈。
第二步:检查 Apache 的 error_log,搜索 “mod_dav_svn: Can’t open file” 或 “delta calculation failed”。出现前者代表 fsfs 文件系统碎片严重;后者意味着二进制文件未启用增量压缩,每次提交都在写全量副本。
第三步:运行 iostat -x 1,观察 %util 是否持续>95% 且 await >50ms。若成立,说明磁盘I/O已达极限,【此时绝不能盲目增加 MaxRequestWorkers】,否则会加剧排队等待。
关闭FSFS冗余校验提升写入速度
方法一:编辑仓库的 db/fsfs.conf 文件,在 [fsfs] 段落下添加一行:
enable-rep-sharing = false
方法二:对新建仓库直接指定参数创建:
svnadmin create --fs-type fsfs --config-file /tmp/svn-fast.conf /new/repo
注意:该配置禁用重复内容块共享,会使仓库体积增大10%~25%,但可将含大量相似二进制文件(如PSD、DOCX)的提交耗时降低40%以上。旧仓库需 dump/load 才能生效。
Apache + SVN 的关键连接参数调优
① 在 httpd.conf 中定位
MaxRequestWorkers 120
② 添加新指令限制单次SVN请求的内存上限:
LimitRequestBody 262144000
③ 关键一步:在 Location /svn 标签内加入:
SVNPath /var/svn/repo
SVNListParentPath off
【SVNReposName "Project Repo" 必须显式声明,否则 mod_dav_svn 会反复扫描父目录】
④ 重启Apache前,执行 apachectl configtest 验证语法。失败则回退,成功后 systemctl restart apache2。
二进制大文件的专用存储隔离方案
不推荐把ISO、VM镜像等>50MB文件塞进SVN主仓库。创建独立FSFS仓库专存大文件:
svnadmin create /var/svn/large-bin
修改其 db/fsfs.conf:
[fsfs]
max-files-per-dir = 1000
log-addressing = true
然后在Apache中新增Location映射:
DAV svn
SVNPath /var/svn/large-bin
Require valid-user
这一步做完,开发人员通过 https://svn.example.com/large-bin 访问大文件库,主仓库压力立即下降。
启用FSFS v7格式并迁移旧仓库
方法1:确认 svnadmin --version 输出 ≥1.10。低于此版本必须升级。
方法2:执行完整迁移命令:
svnadmin dump /old/repo | svnadmin load --force-uuid /new/repo-v7
方法3:迁移后验证关键指标:
svnlook youngest /new/repo-v7 → 应与原仓库一致
ls -lh /new/repo-v7/db/revs/ | head -5 → 查看前5个修订版本大小,v7格式下 revs/ 目录体积应比原仓库减少35%以上。











