rsync 之后如何释放内存?

rsync 之后如何释放内存?

我需要从具有 10GB RAM 的 Web 服务器 (Ubuntu) 备份数据。我使用 Rsync 来备份数据。

我的第一个测试是使用一个 rsync 来同步所有网站,但它占用了 5GB。所以我决定拆分 rsync,但它仍然占用了 5GB。在这两种情况下,它都消耗了太多内存,而且在处理之后并不总是完全释放

如果我在 rsync 之间手动删除缓存,它只会使用 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

这似乎不推荐。实现此目的的正确方法是什么?

答案1

我建议调查一下fadvisersync 补丁。目的是在备份时保留磁盘缓存。效果是,您应该看到您认为“已使用”的内存不会被“使用”。实际上,您认为已使用的内存确实被使用过,但它用于磁盘缓存,如果程序需要,它将被释放。如果系统内存不足,最终所有磁盘缓存都将从内存中逐出,以尝试为有需要的应用程序提供内存。这很糟糕,尤其是在没有极快磁盘子系统的繁忙系统上,因为一旦磁盘缓存从内存中逐出,所有曾经缓存的数据都需要再次从磁盘读取,这将导致巨大的 IO 负载和等待时间。

手动删除缓存同样糟糕,会让你的服务器陷入困境。这不是明智的做法。内存管理不是你的脚本应该担心的事情,内核会处理这部分。

答案2

听起来您想要做的是运行一个进程并限制它对文件系统缓存的影响程度,这样它就不会产生“吵闹的邻居”问题。

您可以将 rsync 放入容器中并限制内存大小。这基本上就像是 fadvise 的强化版。

创建这样的容器很复杂,幸运的是,有一个名为 LMCTFY 的工具可以为您完成这项工作:https://github.com/google/lmctfy

使用 lmctfy,您可以创建一个具有内存限制的容器,如下所示:

lmctfy create mycontainer "memory:{limit:100000000}"
lmctfy run mycontainer "rsync ..."
lmctfy destroy mycontainer

相关内容