我能给你的唯一建议是小心使用 mlock() / mlockall() .. 同时寻找有问题的气球驱动程序。
例如,如果 Xen 来宾以 1GB 启动,然后膨胀到 512 MB,特权域没有查看半虚拟化内核实际承诺给进程的内存量(即 Committed_AS)是非常典型的。实际上,对于 Xen,除非将这个值放在 Xenbus 上,否则特权主机不知道这样的气球会做什么。我相信这也与 KVM 不谋而合,具体取决于内核的配置方式.. 但您的问题假定我们对这些事情一无所知:)
所以,保护那些根本无法被分页的东西(小心,但谨慎),总是考虑到“天塌下来”的情况。
同样,使用 posix_fadvise() / posix_madvise() 告诉 PV 内核您需要或不需要缓冲多少总是一个好主意。
除此之外,您几乎无能为力......因为您只与半虚拟化内核交谈,该内核旨在使进程首先忽略虚拟化。
虽然我计划在未来更多地探索它,但我(还)不怎么使用 KVM。然而,我最近写的 90% 的东西都是专门为在半虚拟化 Xen 客户机上运行而设计的。很抱歉有点以 Xen / C 为中心,但这就是我的经验所在,pv_ops 也在主线中(很快还有 xen-0 ops):)
好问题,顺便说一句:)
编辑:
当我说“谨慎但谨慎”时,我的意思是比保守高出一步。如果您的程序分配了大多数功能需要的一些作业结构,请将其锁定。如果您分配缓冲区来读取大文件,请不要锁定它们.. 并确保调用 posix_fadvise() 让内核知道您只打算访问它一次(如果是这种情况)。此外,请务必告知内核您使用内存映射文件,特别是如果它们用于组织并发性。
简而言之,帮助您的主机内核管理内存,不要让关键分配的块陷入脏页,不要通过锁定它分配的所有内容来假设您的程序比其他任何事情都重要:)
很抱歉模棱两可。我能想到的最好的短语是“小心,但谨慎”。