由rsync启发的快速大文件同步
项目描述
pdifcopy程序通过执行增量传输并在多个CPU核心上分配其工作,以闪电般的速度在Linux服务器之间同步大型二进制数据文件。它目前在Ubuntu Linux上的Python 2.7、3.5+和PyPy(2.7)上进行了测试,但预计在大多数Linux系统上都可以工作。
状态
虽然pdifcopy的第一个原型是在2019年6月开发的,但直到2020年3月,作为开源项目发布的第一个版本。
有很多功能和改进我想添加,但更重要的是,在考虑将alpha标签更改为beta或成熟之前,这个项目需要实际使用一段时间。
安装
pdiffcopy包可在PyPI上获取,这意味着安装应该非常简单
$ pip install 'pdiffcopy[client,server]'
实际上,安装Python包有众多方式(例如,按用户site-packages目录,虚拟环境或仅全局安装)并且我无意在这里讨论这些,所以如果这让你感到害怕,那么在回到这些说明之前先了解一下你的选项吧 😉。
方括号(client 和 server)之间的名称被称为“额外功能”,它们允许你选择是否安装客户端依赖项、服务器依赖项或两者都安装。
命令行
用法: pdiffcopy [OPTIONS] [SOURCE, TARGET]
通过执行delta传输并将工作分散到多个CPU核心,以极快的速度在Linux服务器之间同步大型二进制数据文件。
预期SOURCE和TARGET参数之一是本地文件的路径名,另一个参数是提供远程pdiffcopy服务器位置和远程文件名的URL。文件数据将从SOURCE读取并写入TARGET。
如果没有给出位置参数,则启动服务器。
支持选项
选项 |
描述 |
---|---|
-b,--block-size=BYTES |
自定义delta传输的块大小。可以是普通整数(字节)或像5K、1MiB这样的表达式。 |
-m,--hash-method=NAME |
自定义delta传输的哈希方法(默认为‘sha1’,但支持Python hashlib模块提供的所有哈希方法)。 |
-W,--whole-file |
禁用delta传输算法(跳过哈希计算并无条件下载所有块)。 |
-c,--concurrency=COUNT |
更改并行块哈希/复制操作的数量。 |
-n,--dry-run |
扫描源文件和目标文件之间的差异,报告相似性索引,但不要将任何更改的块写入目标。 |
-B,--benchmark=COUNT |
通过更改目标文件(必须是本地文件)并重新同步其内容来评估delta传输的有效性。此过程重复COUNT次,相似性有所不同。最后打印概述。 |
-l,--listen=ADDRESS |
在指定的IP:PORT或PORT上监听。 |
-v,--verbose |
增加日志详细程度(可重复)。 |
-q,--quiet |
减少日志详细程度(可重复)。 |
-h,--help |
显示此信息并退出。 |
基准测试
命令行界面提供了一种简单的方法来评估delta传输实现的有效性,并将其与rsync进行比较。以下章节中的表格基于该基准测试。
低并发
- 并发性:
4个CPU核心上的6个进程
- 磁盘:
磁存储(较慢)
- 文件大小:
1.79 GiB
下表显示了在两个裸机服务器上对1.79 GiB数据文件的基准测试结果,这两个服务器各自有四个CPU核心和旋转磁盘,其中pdiffcopy以六个并发执行[1]
变化量 |
数据大小 |
pdiffcopy |
rsync |
---|---|---|---|
10% |
183 MiB |
3.20秒 |
38.55秒 |
20% |
366 MiB |
4.15秒 |
44.33秒 |
30% |
549 MiB |
5.17秒 |
49.63秒 |
40% |
732 MiB |
6.09秒 |
53.74秒 |
50% |
916 MiB |
6.99秒 |
57.49秒 |
60% |
1.07 GiB |
8.06秒 |
1分钟和0.97秒 |
70% |
1.25 GiB |
9.06秒 |
1分钟和2.38秒 |
80% |
1.43 GiB |
10.12秒 |
1分钟和4.20秒 |
90% |
1.61 GiB |
10.89秒 |
1分钟和3.80秒 |
100% |
1.79 GiB |
12.05秒 |
1分钟和4.14秒 |
高并发
- 并发性:
48个CPU核心上的10个进程
- 磁盘:
NVMe(较快)
- 文件大小:
5.5 GiB
以下是基于5.5 GB数据文件的基准测试,该数据文件在两个裸机服务器之间同步,每个服务器有48个CPU核心和高端NVMe磁盘,其中pdiffcopy以十个并发执行
变化量 |
数据大小 |
pdiffcopy |
rsync |
---|---|---|---|
10% |
562 MiB |
4.23秒 |
49.96秒 |
20% |
1.10 GiB |
6.76秒 |
1分钟和2.38秒 |
30% |
1.65 GiB |
9.43秒 |
1分钟和13.73秒 |
40% |
2.20 GiB |
12.41秒 |
1分钟和19.67秒 |
50% |
2.75 GiB |
14.54秒 |
1分钟和25.86秒 |
60% |
3.29 GiB |
17.21秒 |
1分钟和26.97秒 |
70% |
3.84 GiB |
19.79秒 |
1分钟和27.46秒 |
80% |
4.39 GiB |
23.10秒 |
1分钟和26.15秒 |
90% |
4.94 GiB |
25.19秒 |
1分钟和21.96秒 |
100% |
5.43 GiB |
27.82秒 |
1分钟和19.17秒 |
这个基准测试显示了pdiffcopy通过在大量CPU核心上运行如何提升其性能。请注意,变化量越小,pdiffcopy相对于rsync的优势就越大。这是因为pdiffcopy同时使用许多CPU核心来计算本地和远程文件之间的差异。此操作只需要读取,并且在现代NVMe磁盘上并行化得非常好。
愚蠢并发
- 并发性:
48个CPU核心上的20个进程
- 磁盘:
NVMe(较快)
- 文件大小:
5.5 GiB
如果您看了上面的高并发基准测试,注意到了可用的CPU核心数量,并且想知道进一步增加并发性是否会有所不同,本节就是为您准备的。由于我投入了开发pdiffcopy并使其能够在多个CPU核心上运行的精力,所以我好奇地重新运行了高并发基准测试,使用了20个进程而不是10个。以下是结果
变化量 |
数据大小 |
pdiffcopy |
rsync |
---|---|---|---|
10% |
562 MiB |
3.80秒 |
49.71秒 |
20% |
1.10 GiB |
6.25秒 |
1分钟和3.37秒 |
30% |
1.65 GiB |
8.90秒 |
1分钟和12.40秒 |
40% |
2.20 GiB |
11.44秒 |
1分钟和19.57秒 |
50% |
2.75 GiB |
14.21秒 |
1分钟和25.43秒 |
60% |
3.29 GiB |
16.45秒 |
1分钟和28.12秒 |
70% |
3.84 GiB |
19.05秒 |
1分钟和28.34秒 |
80% |
4.39 GiB |
21.95秒 |
1分钟和25.49秒 |
90% |
4.94 GiB |
24.60秒 |
1分钟和22.27秒 |
100% |
5.43 GiB |
26.42秒 |
1分钟18.73秒 |
如您所见,将并发性从10增加到20确实使基准测试略快,然而这种差距非常小,几乎不值得麻烦。我认为这意味着这些服务器上的NVMe磁盘使用8-12个写进程可以或多或少地饱和。
注意
最终的问题是,需要多少个CPU核心才能饱和您的存储基础设施。这可以通过实验来确定,基准测试可以提供帮助。没有基本理由说明30个甚至50个进程不能很好地工作,只要您的存储基础设施能够跟上...
限制
虽然受到rsync的启发,但目标绝对不是与rsync功能完全相同。目前,只能传输单个文件,并且只复制文件数据,而不是元数据。这是一个能工作的概念验证,但很有限。虽然我可能想添加对目录树和文件元数据的同步支持,因为这很方便,但我的意图绝对不是在同步大型目录树领域与rsync竞争,因为我很可能会失败。
错误处理目前非常有限,使用Ctrl-C中断程序可能会让您陷入一群拒绝关闭的愤怒的多进程工作者中😝。说真的,连续按几次Ctrl-C应该能退出,否则尝试按Ctrl-\(这是一个反斜杠,应该发送QUIT信号)。
历史
2019年6月,我发现自己处于一个想要快速同步大量二进制数据文件(一组非常大的总容量达数百GB的MySQL *.ibd 文件)的情况,这些文件是我可以利用的丰富的计算资源(48个CPU核心、NVMe磁盘、捆绑式网络接口等等)。
我花了很多时间尝试并行运行多个rsync进程,但是少量非常大的文件“堵塞了管道”,不管我做什么。这就是我意识到rsync实际上非常不适合的原因,这对我是令人失望的,因为rsync长期以来一直是我解决Linux服务器上即兴问题的首选程序之一。
无论如何,我决定向自己证明,我所拥有的硬件可以做得比rsync好得多。在一周的周末原型开发后,我有了可以超越rsync(尽管它是用Python编写的,并使用HTTP作为传输)的某个东西😁。在这周末,我决定我的原型值得作为一个开源项目发布,然而直到几个月后我才有时间这么做。
关于名称
pdiffcopy这个名字是为了作为一个(可能有些晦涩的)缩写“并行差异复制”
并行,因为它是为了在多个CPU核心上运行。
差异,因为使用了增量传输机制。
但主要是我需要一个短且独特的名字,比如rsync,这样搜索这个项目时就能找到这个项目,而不是其他 dozen 个项目 😇。
联系
最新版本的 pdiffcopy 可在 PyPI 和 GitHub 上找到。文档托管在 Read the Docs 上,包括一个 变更日志。如有错误报告,请 GitHub 上创建一个问题。如果您有任何问题或建议,请随时通过 peter@peterodding.com 发送电子邮件给我。
许可协议
本软件采用 MIT 许可协议 许可。
© 2020 Peter Odding。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码分发
构建分发
pdiffcopy-1.0.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4ad4d081e2f9c8d546052608845d9f9698e62b9b4ae3909abfb43085f5b2af90 |
|
MD5 | c5f0d3d2e640d6d62081aacf26e382c3 |
|
BLAKE2b-256 | e06dd7b88cb213c89d5e7e3f354f25fde03d250577e85300c9557f7638150e2b |
pdiffcopy-1.0.1-py2.py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 11bdd41d67d2db66d8f1a9c64c459eb914df4d6a7c9070b8cd96fceadc3213ff |
|
MD5 | ab10d53b2a78d619676b1374d3e4c04c |
|
BLAKE2b-256 | 124761ef28cb850bb6a5b89387ec0fa29dece3347a19f90398bc1444038e7ac1 |