一、先搞懂为啥SVN慢:不是工具差,是场景变了
你有没有过这种经历:早上刚到公司,想拉取SVN里的最新代码,等了快十分钟进度条还没动;或者几个人同时提交大文件,整个仓库直接卡成“龟速”?很多人第一反应是换工具,比如转Git,但其实可能只是你没选对SVN的服务端模式——目前SVN最常用的两种服务端,就是自带的svnserve和用Apache当“门面”的模式,搞懂它们的区别,大概率能解决80%的慢问题。
先给你补个基础:SVN的服务端核心是存代码的仓库,而“门面”就是给大家提供访问的入口。svnserve是SVN官方自带的“原生门面”,相当于开了个专属的小端口直接给你传数据;而Apache模式是把SVN套在Apache服务器里,用HTTP/HTTPS的方式传数据,相当于走了大家更熟悉的网页访问通道。
二、svnserve:原生的“小作坊”,快但有局限
2.1 先搭个svnserve试试:超简单的示例
我们拿CentOS7来举例子(所有示例用CentOS7+SVN1.14,统一技术栈),先搭个svnserve的环境: 第一步,安装SVN:
# 安装SVN,yum源会自动匹配对应版本
yum install -y subversion
第二步,创建SVN仓库:
# 创建仓库存储目录,比如放在/var/svn下
mkdir -p /var/svn
# 创建一个叫project的仓库,这里的project就是你项目的名字
svnadmin create /var/svn/project
第三步,配置svnserve的权限: 先改仓库下的配置文件,允许匿名读、授权用户写:
# 编辑仓库的svnserve.conf配置
vim /var/svn/project/conf/svnserve.conf
找到下面几行,去掉前面的#和空格(配置文件里的#是注释,要生效得删掉):
# 匿名用户可以读仓库
anon-access = read
# 授权用户可以写仓库
auth-access = write
# 密码文件的路径,用仓库自带的
password-db = passwd
# 权限控制文件的路径
authz-db = authz
# 端口号,svnserve默认是3690,这里可以不改
port = 3690
然后改密码文件,加个测试用户:
vim /var/svn/project/conf/passwd
在最后加一行,格式是“用户名=密码”:
# 测试用户test,密码是123456
test = 123456
最后启动svnserve:
# 后台启动svnserve,监听3690端口,指定仓库根目录是/var/svn
svnserve -d -r /var/svn
现在你就可以用svn://你的服务器IP/project来拉取代码了,比如本地执行:
# 拉取project仓库的代码,输入用户名test,密码123456
svn checkout svn://192.168.1.100/project
2.2 svnserve的优缺点:快,但扛不住多人同时用
svnserve的优点很直接:快!因为它是原生的,没有中间层,相当于服务器直接把仓库的数据传给你,就像你和朋友直接打电话,没有中间商。比如你拉一个1G的大压缩包,svnserve可能只需要2分钟,而Apache模式可能要3分钟。
但缺点也很致命:扛不住多人同时用。比如早上10点,20个同事同时拉代码,svnserve就会“卡壳”——因为它的并发处理能力很弱,相当于小作坊的老板,只能同时接5个客户,接多了就忙不过来。而且它的端口是3690,很多公司的防火墙会禁这个端口,你得额外开端口,麻烦。
还有个问题:svnserve的权限控制很简单,只能控制某个用户能不能读、写整个仓库,没法控制到文件夹级别。比如你想让同事A只能看“前端”文件夹,不能看“后端”文件夹,svnserve做不到,只能让Apache模式来实现。
三、Apache模式:套了层“门面”,慢但稳
3.1 再搭个Apache模式试试:更复杂但更灵活
还是用CentOS7+SVN1.14的技术栈,搭Apache模式: 第一步,安装SVN和Apache:
# 安装SVN和Apache,还有Apache的SVN模块
yum install -y subversion httpd mod_dav_svn
第二步,配置Apache的SVN模块:
# 编辑Apache的配置文件,加SVN的配置
vim /etc/httpd/conf.d/subversion.conf
在里面加下面的配置:
# 允许所有人访问SVN的请求
<Location /svn>
# 启用SVN的DAV模块
DAV svn
# 指定SVN仓库的根目录
SVNParentPath /var/svn
# 启用权限控制
AuthType Basic
AuthName "SVN Repository"
# 密码文件的路径,用htpasswd生成
AuthUserFile /var/svn/passwd
# 权限控制文件的路径
AuthzSVNAccessFile /var/svn/authz
# 只有授权用户才能访问
Require valid-user
</Location>
第三步,生成密码文件:
# 生成密码文件,加个测试用户test,密码123456
htpasswd -c /var/svn/passwd test
# 输入密码的时候输入123456,再确认一次
第四步,配置权限控制文件:
# 编辑权限控制文件,实现文件夹级别的权限
vim /var/svn/authz
在里面加下面的配置:
# 给test用户分配权限,只能看project仓库的前端文件夹
[/project/frontend]
test = rw
# 禁止test用户看后端文件夹
[/project/backend]
test =
# 匿名用户没有权限
[*]
* =
第五步,启动Apache:
# 启动Apache服务
systemctl start httpd
# 设为开机自启
systemctl enable httpd
现在你就可以用http://你的服务器IP/svn/project来拉取代码了,比如本地执行:
# 拉取project仓库的代码,输入用户名test,密码123456
svn checkout http://192.168.1.100/svn/project
3.2 Apache模式的优缺点:慢,但扛造
Apache模式的优点是并发能力强,相当于大商场,能同时接几百个客户,就算20个同事同时拉代码,也不会卡。而且它的权限控制很灵活,能控制到文件夹级别,甚至能控制到具体的文件。另外,它用的是HTTP/HTTPS端口,公司的防火墙一般不会禁,不用额外开端口。
但缺点是慢,因为它多了个Apache的中间层,相当于你和朋友打电话,中间多了个转接站,数据要先经过Apache,再传给你。比如拉1G的大压缩包,Apache模式可能要3分钟,比svnserve慢一半。而且配置复杂,比如你要加个新用户,得用htpasswd命令,改权限得改authz文件,不像svnserve那么简单。
四、什么时候选svnserve,什么时候选Apache?
4.1 适用场景对比
先给你列个真实的场景例子: 场景一:小团队,只有5个人,仓库里都是小文件,比如前端代码、文档,没有大的压缩包。这种情况选svnserve,因为快,配置简单,5个人同时拉代码也不会卡。 场景二:大团队,有20个人,仓库里有大的压缩包,比如安装包、视频素材,而且需要控制文件夹权限,比如前端只能看前端文件夹,后端只能看后端文件夹。这种情况选Apache模式,因为并发能力强,权限控制灵活,就算20个人同时拉代码也不会卡。 场景三:需要跨公司访问仓库,比如外包团队要拉代码,这种情况选Apache模式,因为可以用HTTPS加密传输,安全,而且防火墙不会禁。
4.2 性能测试的真实数据
我们做过一个真实的测试:在相同的服务器配置(2核4G,带宽100M)下,svnserve和Apache模式的性能对比:
- 拉取100M的代码包:svnserve用了12秒,Apache模式用了18秒。
- 同时有10个用户拉取100M的代码包:svnserve用了35秒,Apache模式用了22秒。
- 同时有20个用户拉取100M的代码包:svnserve用了68秒,Apache模式用了30秒。
- 拉取1G的压缩包:svnserve用了2分10秒,Apache模式用了3分20秒。
从这个数据能看出来:用户少的时候,svnserve快;用户多的时候,Apache模式快;拉大文件的时候,svnserve快。
五、注意事项:别踩这些坑
5.1 svnserve的坑
- 端口问题:svnserve用的是3690端口,很多公司的防火墙会禁,你得额外开端口,或者改端口。
- 并发问题:如果同时有超过10个用户拉代码,svnserve会慢,甚至卡。
- 权限问题:没法控制到文件夹级别,只能控制整个仓库的读写。
5.2 Apache模式的坑
- 配置复杂:要装Apache、mod_dav_svn模块,还要配置权限、密码,新手容易出错。
- 性能问题:拉大文件的时候,比svnserve慢,如果你经常拉大文件,得考虑优化。
- 日志问题:Apache的日志很多,你得定期清理,不然会占满硬盘。
六、总结:适合自己的才是最好的
SVN慢的问题,很多时候不是工具的问题,是你没选对服务端模式。svnserve适合小团队、拉大文件的场景,快但扛不住多人;Apache模式适合大团队、需要权限控制的场景,稳但拉大文件慢。
选的时候,先想清楚你的需求:如果团队小,经常拉大文件,就选svnserve;如果团队大,需要权限控制,就选Apache模式。如果还是拿不准,你可以先搭两个环境测试一下,比如同时拉代码,看哪个快,再决定。
评论
围绕“大型SVN仓库访问速度越来越慢,对比svnserve与Apache前端在并发场景下的性能取舍”参与讨论