客户虚拟机中的 Linux /proc/sys/vm/drop_caches

客户虚拟机中的 Linux /proc/sys/vm/drop_caches

问题: 禁用客户虚拟机内的页面缓存并转而依赖主机的 ZFS ARC(和基于 SSD 的 L2ARC)是否是一个好主意?

语境: 我之所以问这个问题,是因为我正在运行一个 Proxmox 集群,它总是显示所有虚拟机的 RAM 使用率约为 90%,无论它实际需要多少。这是由于客户机内核使用页面缓存而导致的。由于我听到了很多关于 ZFS 的 ARC 的好评,这让我想到也许我可以增加对这些的依赖,减少对客户机页面缓存的依赖。本质上,ARC 将成为所有虚拟机的共享页面缓存。

通过这样做,我将获得更准确的 proxmox 统计数据和图表的额外好处,从而让我更好地了解每个虚拟机实际需要多少内存。这反过来会给我提供所需的信息,以便更好地调整每个虚拟机的 RAM 大小,并允许我将主机的 ARC 的大小增加相同的量。

我还没有真正尝试过这些,我想先向你们介绍一下。那么,我这样想是不是太愚蠢了?

后续问题:我该如何禁用(或限制)Linux VM 中的页面缓存?一种方法是使用 cronjob 并定期将“3”写入 /proc/sys/vm/drop_caches,例如每分钟一次或类似方式。但感觉有点不靠谱,有没有更好的方法?

PS 是的,我意识到我只谈论读取缓存,而不是写入缓存,写入缓存受肮脏的页。因此,我可能仍需要一定数量的可用 RAM 空间来实现这一点(但这应该在 Proxmox 中的 VM RAM 使用情况统计信息中可见,因此上述所有内容仍应适用)。

答案1

我经常(但并非总是,见下文)优化我的虚拟机管理程序,类似于您所建议的:让虚拟机大量依赖共享主机磁盘缓存。

但是,使用这种drop_caches方法对我来说似乎太过严厉,因为它会从客户机中驱逐过多的缓存内存。同时,我不知道有什么方法可以限制页面缓存(除非配置应用程序以使用直接 I/O)。因此,关键是正确调整虚拟机 RAM 资源的大小:尝试仅分配客户机真正需要的内存,再加上 1 或 2 GB 以获得一些“喘息空间”。

以这种方式管理内存具有一些重要的优点:

  • 由主机管理,缓存内存可以根据客户的 I/O 需求动态分配给客户机;
  • 通过动态管理,将内存视为真正的资源池,可以减少资源浪费并提高效率;
  • 如果你在主机上使用 ZFS,你就可以利用非常先进的 ARC/L2ARC 及其防垃圾行为

但也有一些缺点:

  • 作为共享资源,主机缓存内存可能会被恶意虚拟机破坏(影响其他更重要的虚拟机);
  • 由于位于一些上下文切换之外vmexit/vmenter,任何基于主机的缓存的峰值和持续速度都将低于相应的客户机端缓存(这就是我建议您避免drop_caches在客户机中重复的原因);
  • 尽管 ARC 更先进,命中率更高,但它比 Linux 页面缓存慢当工作量完全适合在缓存中。因此,为了在性能关键型客户机上实现最大客户机速度,您可能希望为 VM 提供足够的内存用于页面缓存。

相关内容