了解主内存碎片和大页

了解主内存碎片和大页

我有一台用于一般用途的机器,我也用它来运行 QEMU 虚拟机。由于虚拟机应尽可能提高性能,因此我希望使用大页(最好是 1GB 大页)来支持 VM 内存。该机器有 32GB 内存,我想为虚拟机提供 16GB。问题是,在我正常使用机器期间,我可能需要使用全部 32GB,因此在启动时分配 16G 大页面不是一个选择。

为了解决这个问题,我有一个钩子脚本,它在虚拟机启动时分配 16G 的大页面。正如您所期望的,对于 1GB 大页,如果主机已使用任意时间,此操作就会失败(它似乎可以可靠地处理 2M 大页,尽管这并不理想)。

我不明白的是为什么会发生这种情况。例如,我可以打开多个应用程序(浏览器窗口、代码编辑器等,只是为了强制进行一些碎片测试),然后关闭它们,以便只有我的桌面打开。本例中我的内存使用量约为 2.5G/32G。

内核真的没有办法在剩余的 30G RAM 中找到 16 个 1G 页的连续对齐内存吗?这似乎是一个非常高的碎片化。此外,我可以运行

$ sudo tee /proc/sys/vm/compact_memory <<<1

尝试对 RAM 进行碎片整理,但即便如此,我也从未成功为 VM 分配 16 个 1G 大页。这对我来说尤其令人震惊,因为在对 2.5G RAM 进行碎片整理后,剩余的 30G仍然不连续或不对齐。

我对这个过程有什么误解?这看起来像预期的行为吗?另外,有什么方法可以检查是否compact_memory真的做了什么?dmesg运行该命令后,我没有看到任何输出或类似的输出。

答案1

您可以在以下位置预先分配大页:主持人启动时间,因为在线分配可能无法工作(由于您提到的问题)。

像这样的事情可能会成功,但你必须重新启动你的主机:

GRUB_CMDLINE_LINUX_DEFAULT="hugepagesz=1GB default_hugepagesz=1G hugepages=16"

请查看 Fernando Laudares 在 FOSDEM 2019 的第 20 分钟左右发表的精彩演讲,了解分配大页面的在线方法和启动时方法: https://www.youtube.com/watch?v=jTJ_X3fJ1Ik

幻灯片在这里: https://fosdem.org/2019/schedule/event/hugepages_databases/attachments/slides/3038/export/events/attachments/hugepages_databases/slides/3038/Huge_pages_and_databases___FOSDEM19.pdf

相关内容