在 16GB RAM 的虚拟机中,我们在生产中将 rsync 作为 cron 作业(每 10 分钟一次)运行,以将 GB 的文件夹从 AWS EFS 同步到本地存储。运行几天后,我们发现虚拟机内存不足,并且我们发现缓冲区/缓存的大小超过 4GB,并且使用虚拟触摸我们确认我们正在同步的整个文件夹都被缓存。
由于我们在生产环境中运行此程序,因此我们有一个警报系统,每当虚拟机中的可用内存低于 20% 时就会发出警报。
因此,作为快速修复,我们在每次使用命令运行 rsync 后清除缓存echo 2 > /proc/sys/vm/drop_caches
。
我完全反对这一点,因为清除缓存会影响性能。但在互联网上,很少有文章建议在运行 rsync 作业后清除缓存,其中一些是1,2。互联网上还有很多其他资源都说不要清除缓存。
仅考虑rsync
- 我们是否真的需要担心它正在执行的激进缓存,因为我们的 buff/缓存非常高
- 世界其他地区如何应对这一问题?你们每次运行 rsync 时都会清除缓存吗
我们正在使用的 rsync 命令
rsync -aA --delete /... /...
答案1
未使用的内存会被浪费,因此任何空闲内存都会被内核视为可用作缓冲区高速缓存。如果应用程序需要内存,则可以在必要时立即将其丢弃。
如果整个文件夹都被缓存,那么这应该意味着源文件和目标文件之间的比较非常有效。
该rsync
命令本身看起来不错。您没有使用-H
(这可能非常消耗内存),并且您可以有效地保留时间戳(-t
由 暗示-a
)。唯一需要注意的另一部分是,就您而言rsync
,您正在从本地文件系统的一个部分复制到另一部分,因此只需要更新的文件仍将被完整复制。