答案1
我认为您忽略了“过度承诺”的含义。
过度承诺并不是让你实际拥有比系统限制的资源更多的资源的伎俩。它是一种让你假装拥有更多资源的技术。
基本概念是,大多数程序分配的内存比实际使用的内存要多。例如,它们可能会分配 32K RAM 来读取只有 57 个字节的文件。它们将其读入,实际上为此使用一页内存。但仍然分配了 32K。请注意,这个例子来自 90 年代,而今天,分配的内存更大,文件更大,但关键是额外的内存仍然是一个永远不会被收回的承诺。
如果我没记错的话,这种情况甚至发生在一些无意中执行此操作的程序中,因为它们会加载执行此操作的库,甚至加载这些库也会执行此操作 - 链接器会为库分配足够的内存,但实际上只会加载实际调用的例程。这可能是共享内存,因此影响被最小化,但它仍然存在。
发生的过度承诺量很大程度上取决于所调用的程序及其使用方式。如果程序运行非常彻底,它可能会更多地使用其某些库。调用 calloc 而不是 malloc 的程序不会出现过度承诺的情况,因为 calloc 会写入分配空间的每个字节,要求操作系统履行所请求的承诺,即使实际使用的内存部分会少得多。有些程序更加谨慎,只分配它们所需的确切内存量,而其他程序则依赖操作系统支持过度承诺,以允许它们在数据结构安排上务实。
如果您限制服务器上的应用程序使用 1GB,但实际上它们设法访问了整整 1GB 的页面,那么它将使用您为其配置的 8GB 交换空间。但它不会将其用于超额使用。从技术上讲,它不会使用超额使用,除非它分配的 VM 超过实际拥有的 9GB。
话虽如此,这是 Linux,我记得尝试在不启用过度使用的情况下将 Linux 推向最大内存分配时,它往往会提前失败 - 它为各种事情保留了一些储备,例如少量文件缓存等。那次经历是十多年前的事了,但我并不特别认为有什么理由改变这一点;拥有能够进行文件 I/O 的内存很重要。