我正在用 VM 和 KVM 做一些实验。我试图认识到过度使用和交换空间的事实。首先,让我展示一下我为这个实验所做的系统设置和关联配置。
我的主机系统有:
- 内存(动态随机存取存储器):16GB
- 交换空间(交换分区):32GB
- 固态硬盘:512GB
我的虚拟机有:
- 内存:4GB
- 交换空间(交换分区):8GB
- 虚拟磁盘容量:20GB
如果我通过 cgroup 接口将 VM 的内存资源从 4GB 限制到 1GB。在这种情况下会发生过度承诺。然后我尝试通过wap-space解决这个问题,并通过vmstat检查它是否有效。似乎它不使用交换空间作为内存。
为什么我的 VM 在过度使用情况下不使用交换空间?
我认为您缺少的部分是“过度承诺”的含义。
过度使用并不是用来实际拥有比您限制系统拥有的资源更多的资源的技巧。这是一种表现得好像有更多资源的技巧。
基本概念是,大多数程序会分配比实际使用更多的内存。例如,他们可能会分配 32K 的 RAM 来读取一个只有 57 字节的文件。他们将其读入,并为此实际使用了一页内存。但是仍然分配了 32K。请注意,这个例子是 90 年代的,今天,分配更大,文件更大,但关键是额外的内存仍然是一个承诺,永远不会被收集。
如果我没记错的话,这甚至会发生在一些不知情的程序中,因为它们会加载执行此操作的库,甚至加载这些库也会执行此操作 - 链接器为库分配足够的内存,但仅为例程实际调用的是实际加载的。那可能是共享内存,因此影响最小化,但它仍然存在。
发生的过度承诺的数量在很大程度上取决于调用的程序及其使用方式。如果一个程序运行得非常彻底,它可能会使用更多的一些库。调用 calloc 而不是 malloc 的程序不会显示出过多的提交,因为 calloc 写入分配空间的每个字节,要求操作系统完成请求的提交,即使将使用的内存的实际部分会少很多。有些程序会更加小心,只分配它们需要的确切内存量,而其他程序则依赖操作系统支持过度使用,以允许它们在数据结构安排上务实。
如果您限制使用 1GB 的服务器上的应用程序实际上设法访问了完整 GB 的页面,它将使用您配置它可以使用的 8GB 交换空间。但它不会将其用于过度承诺。在分配超过它实际拥有的 9GB VM 之前,它在技术上不会使用过度使用。
话虽这么说,这就是 Linux,我对尝试将 Linux 推向最大内存分配而不启用过度使用的回忆是,它往往会提前失败——它为各种事情保留了一些储备,比如少量的文件缓存和其他东西. 那是十多年前的经历,但我没有特别看到改变的理由;拥有能够执行文件 I/O 的内存很重要。