我需要从10GB内存(Ubuntu)的Web服务器备份数据。 要备份数据,我使用Rsync。
我的第一个testing是使用一个rsync的所有网站,但它使用5GB。 所以我决定拆分rsync,但仍然使用5GB。 在这两种情况下,它消耗大量的内存,并不总是完全自由的过程
如果我在rsync之间手动删除caching,那么只有在150Mb和500Mb之间使用完全释放内存之后。 (和免费的服务器的50%-70%的内存)
for CURDIR in "$ROOTDIR"* do echo "Start $CURDIR" rsync -aHh --stats --compress --delete "$CURDIR" --link-dest="saveofyesterday" "saveoftoday" echo "Clear" sync echo 3 > /proc/sys/vm/drop_caches echo "Finish $CURDIR." done
这似乎不推荐。 什么是实现这一目标的正确方法?
我build议寻找rsync的fadvise补丁。 目的是在备份时保存磁盘caching。 效果你应该看到你认为这个内存“使用”不会被“使用”。 实际上,你考虑使用的那个内存,它被使用,但是它被用于磁盘caching,并且如果程序需要,它将被释放。 如果系统内存不足,最终所有的磁盘caching将被从内存中逐出,以尝试为需要的应用程序提供内存。 这是不好的,特别是在没有非常快的磁盘子系统的繁忙系统上,因为一旦磁盘高速caching从内存中被逐出,所有一旦caching的数据将需要从磁盘再次读取,这将导致巨大的IO负载和等待时间。
手动删除caching也一样糟糕,将使您的服务器在困境中。 这不是可取的路线。 内存pipe理不是你的脚本应该担心的事情,内核负责这个部分。
这听起来像你想要做的是运行一个进程,并限制它可以对文件系统caching有多大的影响,所以它不会产生“吵闹的邻居”的问题。
你可以把rsync放在一个容器中,并限制内存大小。 这基本上就像激素类药物一样。
创build这样一个容器是很复杂的,幸运的是有一个工具可以为你工作,叫做LMCTFY: https : //github.com/google/lmctfy
用lmctfy,你可以创build一个像这样的内存限制的容器:
lmctfy create mycontainer "memory:{limit:100000000}" lmctfy run mycontainer "rsync ..." lmctfy destroy mycontainer