我正在使用 rsync 从托管在 AWS 中的 NFS 服务器备份到同一 AZ 中的另一个 EC2 实例,我在备份服务器中使用的 rsync 命令如下:
rsync -avzb --backup-dir=someDirectory 172.19.0.151:/origin/* /opt/destination/
我的备份包含几千个,甚至可能超过一百万个小文件(.pdf 大约 200/500 KB)
我遇到的问题是增量文件列表发送得非常快(到目前为止一切顺利)但是当 rsync 开始复制文件时速度非常慢,它复制大约 20 个文件,然后停止 3 或 4 分钟,然后再复制一些文件,依此类推。
我每 2 小时在 crontab 中运行一次 rsync 进程,大多数时候我都有一长串未完成的 rsync 进程,这迫使我重新启动服务器。
这是我的 iowait:
iostat
Linux 4.4.0-1060-aws (prd-turecibo-backup) 06/06/2018 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.29 0.00 0.74 84.56 0.00 14.41
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
nvme1n1 0.22 6.00 0.00 20984 0
nvme2n1 240.45 959.12 17.95 3354430 62788
nvme0n1 3.43 65.19 2.03 227995 7112
通常 iowait 为 90%。
我已经更换了 EBS 卷,但问题仍然存在,算法升级了实例,但没有运气。
有任何想法吗?
答案1
我每 2 小时在 crontab 中运行一次 rsync 进程,大多数时候我都有一长串未完成的 rsync 进程,这迫使我重新启动服务器。
首先运行一个 rsync-backup 实例,
例如使用flock
shell 脚本中的命令。
您也可以使用run-one
如果你的发行版提供了它。[建议 Michael - sqlbot]
它似乎是由Linux/Ubuntu提供的。
答案2
另一件需要考虑的事情是禁用压缩。我们尝试在 AWS 中的 2 个 ec2 节点之间传输数据库 (MySQL/MariaDB),并发现此传输速度约为 15-20MB/s。
笔记:我们原本期望使用 m4.2xlarge 实例时看到更高的数量级,它们位于 2 个不同的可用区,但考虑到所有这些较小的传输(例如这些),AWS 并未施加任何限制:
$ truncate -s 500MB 500MB.file
$ ll | grep 500MB
-rw-rw-r--. 1 smingolelli smingolelli 500000000 Sep 5 14:55 500MB.file
$ rsync --progress -h -v 500MB.file 10.16.87.187:~
500MB.file
500.00M 100% 81.55MB/s 0:00:05 (xfr#1, to-chk=0/1)
sent 500.12M bytes received 35 bytes 66.68M bytes/sec
total size is 500.00M speedup is 1.00
我们在关闭压缩的情况下重复了测试,并看到传输数字攀升至我们预期的水平。因此,您可能想尝试不带以下内容的命令-z
:
$ rsync -avb --backup-dir=someDirectory 172.19.0.151:/origin/* /opt/destination/