当过度使用时,我可以让虚拟机使用交换空间(swapfile)作为内存吗?

当过度使用时,我可以让虚拟机使用交换空间(swapfile)作为内存吗?

我正在用 VM 和 KVM 做一些实验。我试图认识到过度使用和交换空间的事实。首先,让我展示一下我为这个实验所做的系统设置和相关配置。

我的主机系统有:

  1. 内存(DRAM):16GB
  2. 交换空间(交换分区):32GB
  3. 固态硬盘:512G​​B

我的虚拟机有:

  1. 内存:4GB
  2. 交换空间(交换分区):8GB
  3. 虚拟磁盘容量:20GB

如果我通过 cgroup 接口将虚拟机的内存资源从 4GB 限制到 1GB。在这种情况下过度承诺发生。然后我尝试通过以下方式解决这个问题wap 空间并检查状态监测不管它是否有效。它似乎不使用交换空间作为内存。

为什么我的虚拟机在过量使用的情况下没有使用交换空间?

答案1

我认为您忽略了“过度承诺”的含义。

过度承诺并不是让你实际拥有比系统限制的资源更多的资源的伎俩。它是一种让你假装拥有更多资源的技术。

基本概念是,大多数程序分配的内存比实际使用的内存要多。例如,它们可能会分配 32K RAM 来读取只有 57 个字节的文件。它们将其读入,实际上为此使用一页内存。但仍然分配了 32K。请注意,这个例子来自 90 年代,而今天,分配的内存更大,文件更大,但关键是额外的内存仍然是一个永远不会被收回的承诺。

如果我没记错的话,这种情况甚至发生在一些无意中执行此操作的程序中,因为它们会加载执行此操作的库,甚至加载这些库也会执行此操作 - 链接器会为库分配足够的内存,但实际上只会加载实际调用的例程。这可能是共享内存,因此影响被最小化,但它仍然存在。

发生的过度承诺量很大程度上取决于所调用的程序及其使用方式。如果程序运行非常彻底,它可能会更多地使用其某些库。调用 calloc 而不是 malloc 的程序不会出现过度承诺的情况,因为 calloc 会写入分配空间的每个字节,要求操作系统履行所请求的承诺,即使实际使用的内存部分会少得多。有些程序更加谨慎,只分配它们所需的确切内存量,而其他程序则依赖操作系统支持过度承诺,​​以允许它们在数据结构安排上务实。

如果您限制服务器上的应用程序使用 1GB,但实际上它们设法访问了整整 1GB 的页面,那么它将使用您为其配置的 8GB 交换空间。但它不会将其用于超额使用。从技术上讲,它不会使用超额使用,除非它分配的 VM 超过实际拥有的 9GB。

话虽如此,这是 Linux,我记得尝试在不启用过度使用的情况下将 Linux 推向最大内存分配时,它往往会提前失败 - 它为各种事情保留了一些储备,例如少量文件缓存等。那次经历是十多年前的事了,但我并不特别认为有什么理由改变这一点;拥有能够进行文件 I/O 的内存很重要。

相关内容