perforce和git和svn大文件存储测试对比

Posted by 刘勇(lyonger) on 2021-04-30

perforce和git和svn大文件存储测试对比

测评背景

  • 美术资源存在大量小文件、单个文件比较大、文件频繁更新、频繁上传下载、本地仓库损坏需全量重新下载等情况,管理比较困难。

测评总结

  • 针对美术资源管理比较困难的问题,我们对市面上的一些资产管理工具,在同一环境下使用线上的真实业务数据进行了测评对比。

综合测评结果

  • 针对通用代码管理的问题:Perforce工具在性能和工具体验方面显得更为专业。它能直接兼容很多美术软件,可预览和在线编辑,对美术的工作有很大帮助。除此之外,可以和海外的开发公司、外包公司进行业界统一的对接方式。建议做为首选考虑。其次如果只考虑开源工具,且大文件下载需求不多,git-lfs工具也是一个不错的选择
  • 结合工具性能、操作使用成本、与外部公司对接的便捷性等因素,对工具进行了综合对比,结果可参考下表。
    | 工具名称 | GIT-LFS | SVN | Perforce |
    | :--------------------- | :------------------- | :------------------- | :------------------------------------- |
    | 收费 | 否 | 否 | 是 |
    | 小文件处理速度 | 快 | 慢 | 很快 |
    | 大文件处理速度 | 慢 | 慢 | 快 |
    | 客户端工具 | 社区提供,命令行为主 | 社区提供,命令行为主 | 官方提供 |
    | 权限控制 | repo级别 | 目录级别 | 目录级别 |
    | 元数据文件空间占用 | 是 | 是 | 否 |
    | 首次是否需全部拉取 | 是 | 是 | 否 |
    | 软件兼容性 | ide兼容性好 | ide兼容性好 | 美术软件兼容性好,支持预览和在线编辑。 |
    | 使用难度 | 难 | 一般 | 比较难 |
    | 与外部公司对接的便捷性 | 一般 | 一般 | 比较方便 |

性能测评结果

  • 性能方面的测评结果如下:
1
2
3
4
5
6
7
1) 针对当前美术资源使用NXN维护成本高,资源上传下载经常卡顿的问题。Perforce在资源的上传下载、权限控制方面有比较好的优势。在大文件场景下perforce比svn快8%,比git-lfs快57%。在小文件场景下perforce比git-lfs快5%,比svn快55.8%。故建议采用Perforce工具,但是需要考虑到价格和上手难度等问题。

2)针对当前美术资源使用NXN维护成本高,资源上传下载经常卡顿的问题,如果不考虑价格因素时,大文件场景下svn比git-lfs快49%,小文件场景下git-lfs比svn快50%。如果小文件居多建议使用git-lfs,如果大文件居多建议使用svn。

3)针对本地仓库损坏需重新下载大文件问题,单从上传下载速度上svn比git-lfs快49%,git-lfs并不占优势。但git-lfs仓库的健壮性优于svn,可通过object id增量下载文件,降低了仓库损坏需全量下载的概率。当然git-lfs的这种管理相比svn会给客户端带来更多的磁盘空间消耗,需定时执行lfs命令来清理。其次在附加资料部分也提供了git-lfs的使用教程。

4) 实际测试时发现客户端上传20G左右数据时会消耗8G-10G左右的内存,占满一个cpu核心。建议客户端机器至少16G内存、配置SSD固态硬盘。可提升上传与下载的体验。
  • 性能测试的数据结论
    • 大文件上传时
      • perforce比svn快8.6%,比git-lfs快27.2%。
      • svn比git-lfs快18.6%。
    • 大文件下载时
      • perforce比svn快7.6%,比git-lfs快87.3%。
      • svn比git-lfs快79.7%。
    • 小文件上传时
      • perforce比git-lfs快5.8%,比svn快47.4%。
      • git-lfs比svn快41.6%。
    • 小文件下载时
      • perforce比git-lfs快4.3%,比svn快64.2%。
      • git-lfs比svn快59.9%。

测评方案

  • 基于上面的问题,对市面上已有的工具:Gitlab-LFS、SVN、Perforce, 分别进行了测评调研,内容如下。

测评说明

  • 测试使用了一台小小云机器,系统Debian9.6,使用两块SSD磁盘,一块作为服务端,安装有gitlab、svn、perforce服务端进程,一块作为客户端使用,同台机器内测试,减少网络导致的误差。测试机器配置如下:
1
2
3
4
5
6
系统版本:Debian9.6
内核版本:4.9.0-6-amd64
CPU核数:16
内存大小:32GB
磁盘大小:200G SSD * 2
IP地址:10.202.2.5
  • 测试数据随机采样了3份,均来自线上的真实数据,里面有美术资源和非美术资源,有大文件也有小文件,详情如下:
名称 原始数据总大小(排除.git/.svn) 文件个数 说明
数据样例1 6.7G 25217 大文件和小文件相对均匀
数据样例2 9.5G 14988 大文件居多
数据样例3 1.6G 119940 小文件居多
  • 测试主要分2个部分:空间占用下载与上传速度

测评过程

空间占用测试
  • 数据样例1
    | 工具类型 | 仓库总大小(包括.git/.svn) | .git/.svn大小 | 原始文件总大小(不包括.git/.svn) |
    | :------- | :------------------------ | :------------ | :------------------------------ |
    | git-lfs | 14G | 6.5G | 6.7G |
    | svn | 14G | 6.7G | 6.7G |
    | perforce | 6.7G | 无 | 6.7G |
  • 数据样例2
    | 工具类型 | 仓库总大小(包括.git/.svn) | .git/.svn大小 | 原始文件总大小(不包括.git/.svn) |
    | :------- | :------------------------ | :------------ | :------------------------------ |
    | git-lfs | 19G | 9.5G | 9.5G |
    | svn | 19G | 9.5G | 9.5G |
    | perforce | 9.5G | 无 | 9.5G |
  • 数据样例3
    | 工具类型 | 仓库总大小(包括.git/.svn) | .git/.svn大小 | 原始文件总大小(不包括.git/.svn) |
    | :------- | :------------------------ | :------------ | :------------------------------ |
    | git-lfs | 1.8G | 0.2G | 1.6G |
    | svn | 2.9G | 1.4G | 1.6G |
    | perforce | 1.6G | 无 | 1.6G |
下载与上传速度测试
  • 数据样例1
工具类型 原始数据总大小(不包括.git/.svn) 上传时间 下载时间
git-lfs 6.7G 416秒 2013秒
svn 6.7G 642秒 368秒
perforce 6.7G 435秒 57秒
  • 数据样例2
工具类型 原始数据总大小(不包括.git/.svn) 上传时间 下载时间
git-lfs 9.5G 1101秒 3867秒
svn 9.5G 680秒 407秒
perforce 9.5G 482秒 72秒
  • 数据样例3
工具类型 原始数据总大小(不包括.git/.svn) 上传时间 下载时间
git-lfs 1.6G 327秒 24秒
svn 1.6G 963秒 121秒
perforce 1.6G 239秒 17秒

测评图表

空间大小占用

  • Y轴为数据大小,单位G。
  • X轴为指标类型:
    • 仓库总大小(包括.git/.svn) total
    • .git/.svn大小metadata
    • 原始文件总大小(不包括.git/.svn) raw

image

image

image

上传与下载速度

  • Y轴为上传数据或者下载数据的时间,单位秒。
  • X轴为工具类型即git-lfs、svn、perforce。

image

image

image

测评分析

  • 测评分析如下,下面的百分比数据为文件下载或上传占用时间百分比,比如perforce(15.6%) 代表样例3小文件上传中,perforce占用的时间百分比,即15.6%=239.0 / (327+963+239)
    | 评估项 | 具体分析 | 分析结果 |
    | :--------------- | :----------------------------------------------------------- | :-------------------------------------------- |
    | 样例文件个数 | 样例2大文件居多、样例3小文件居多、样例1大文件小文件相对均匀 | 样例3 > 样例1 > 样例2 |
    | 样例原始数据大小 | 样例2大文件居多、样例3小文件居多、样例1大文件小文件相对均匀 | 样例2 > 样例1 > 样例3 |
    | 空间管理 |
    1) perforce无需存储元数据,相对节省客户端磁盘空间。
    2) 随着文件个数增多,svn的元数据大小明显高于git-lfs,会更多的占用客户端磁盘空间。
    3) 原始文件的总大小在每个工具均保持一致。 | perforce > git > svn |
    | 小文件上传速度 | perforce优于svn、git-lfs,但没有明显优于git-lfs。svn的上传速度最差。 | perforce(15.6%) > git-lfs(21.4%) > svn(63%) |
    | 大文件上传速度 | perforce的上传速度明显优于svn和git-lfs, git-lfs的上传速度最差 | perforce(21.4%)> svn(30%) > git-lfs(48.6%) |
    | 小文件下载速度 | perforce的下载速度优于svn和git-lfs, svn的下载速度最差 | perforce(10.5%) > git-lfs(14.8%) > svn(74.7%) |
    | 大文件下载速度 | perforce的下载速度明显优于svn和git-lfs, git-lfs的下载速度最差 | perforce(1.7%) > svn(9.3%) > git-lfs(89%) |

测评总结

  • 从实际的业务数据测试来看:

    • perforce无需占用客户端空间,且不管大文件还是小文件场景均优于git-lfs和svn。
    • 相比svn来说,git-lfs比较适合小文件场景,无论是上传速度还是下载速度均优于svn。
    • 相比git-lfs来说,svn比较适合大文件场景,无论是上传速度还是下载速度均优于git-lfs。
  • 客户端情况

    • 无论是git-lfs还是svn,在下载或者上传文件时,会大量消耗客户端的内存,跑满一个cpu核心。建议客户端机器至少为16G内存并配置固态硬盘。
      • 下图为Mac机器使用git客户端上传样例2数据时的截图。
        image
      • 下图为小小云本地机器git上传样例2数据时的截图。
        image
        • 下图为本地机器svn上传数据时的截图。
          image
  • 结论
    • 大文件上传时
      • perforce比svn快8.6%,比git-lfs快27.2%。
      • svn比git-lfs快18.6%。
    • 大文件下载时
      • perforce比svn快7.6%,比git-lfs快87.3%。
      • svn比git-lfs快79.7%。
    • 小文件上传时
      • perforce比git-lfs快5.8%,比svn快47.4%。
      • git-lfs比svn快41.6%。
    • 小文件下载时
      • perforce比git-lfs快4.3%,比svn快64.2%。
      • git-lfs比svn快59.9%。

  • 当时的测试命令(备忘)。
1
2
3
4
5
6
7
8
svnadmin create /home/svn/git_lfs
cp /home/svn/git_lfs/conf/* /home/svn/git_lfs2/conf/
svnserve -d -r /home/svn/
svn add . --no-ignore --force
svn checkout svn://127.0.0.1/git_lfs2 --username=xxx --password=xxx git_lfs2_commit
time svn commit -m "git_lfs3 production3" --username=xxx --password=xxx
time svn checkout svn://127.0.0.1/git_lfs --username=xxx --password=xxx git_lfs_checkout
du -h --max-depth=1


支付宝打赏 微信打赏

赞赏一下