Vol*_*erK 12 c++ optimization virtualization
当您知道您的软件(不是驱动程序,不是操作系统的一部分,只是一个应用程序)将主要在虚拟化环境中运行时,是否存在优化代码和/或编译器设置的策略?或者你应该和不应该做什么的指南?
这可能不是0.0x%的性能提升,但可能只是可能有一些简单的事情可以大大提高性能,或者看起来很简单,但在虚拟化环境中是灾难性的.例如,在内核构建中启用CONFIG_PARAVIRT很容易,并且可以大大提高性能.现在我正在为应用程序寻找类似的东西,如果有的话.
在我的情况下,它将是C++代码,可能是VMWare,但我想尽可能保持与语言/产品无关的问题.我想知道是否有这样的策略,或者这是否完全浪费时间 - 毕竟虚拟化的概念是你不必过多关心它.
小智 3
我能给你的唯一建议是小心使用 mlock() / mlockall() .. 同时寻找有缺陷的气球驱动程序。
例如,如果 Xen 来宾以 1GB 启动,然后激增至 512 MB,则很典型的是特权域不会查看半虚拟化内核实际承诺处理的内存量(即 Commied_AS)。实际上,对于Xen,除非将这个值放在Xenbus上,否则特权主机不知道这样的气球会做什么。我相信这也与 KVM 一致,具体取决于内核的配置方式..但您的问题假设我们对此类事情一无所知:)
因此,保护那些根本无法调出的内容(小心但谨慎),始终考虑到“天塌下来”的情况。
同样,使用 posix_fadvise() / posix_madvise() 告诉 PV 内核您需要或不需要缓冲的程度始终是一个好主意。
除此之外,您几乎无能为力......因为您只与半虚拟化内核交谈,该内核旨在使进程首先忽略虚拟化。
我(还)不太使用 KVM,但我计划在将来更多地探索它。然而,我最近编写的 90% 的内容都是专门为在半虚拟化 Xen 来宾上运行而设计的。抱歉有点以 Xen / C 为中心,但这就是我的经验所在,并且 pv_ops 位于主线(很快也有 xen-0 ops):)
顺便说一句,好问题:)
编辑:
当我说“谨慎而谨慎”时,我的意思是比保守更进一步。如果您的程序分配了大多数函数需要的某些作业结构,请将其锁定。如果您分配缓冲区来读取大文件,请不要锁定它们..并确保调用 posix_fadvise() 让内核知道您只想访问它一次(如果是这种情况)。另外,请务必告知内核有关内存映射文件的使用,特别是当它们用于组织并发时。
简而言之,帮助您的主机内核管理内存,不要让关键的分配块被扔进脏分页,不要通过锁定它分配的所有内容来假设您的程序比其他任何东西都更重要:)
很抱歉含糊不清。我能想到的最好的短语是“小心但谨慎”。