全部博文(389)
分类: 虚拟化
2017-12-19 14:25:01
专用资源绑定
计算节点可以配置CPU与内存的超配比例,例如,16个物理CPU可以执行256个虚拟CPU,16GB内存可以允许使用24GB虚拟机内存。 超配的概念可以扩展到基本的NUMA布局,但是一旦提到大页内存,内存便不能再进行超配。当使用大页内存时,虚拟机内存页必须与主机内存页一一映射,并且主机操作系统不能通过交换分区分配大页内存,这也排除了内存超配的可能。
一般情况下,尽管vCPU允许超配,但是大页内存的使用,意味着需要支持内存作为专用资源的虚拟机类型。
尽管设置专用资源时,不会超配内存与CPU,但是CPU与内存的资源仍然需要主机操作系统提前预留。如果使用大页内存。必须在主机操作系统中明确预留。对于CPU则有一些灵活性。因为尽管使用专用资源绑定CPU,主机操作系统依然会使用这些CPU的一些时间。也许不管怎么样,需要预留一定的物理CPU专门为主机操作系统服务,以避免操作系统过多占用虚拟机CPU,而造成对虚拟机性能的影响。Nova可以保留一部分CPU专门为操作系统服务,这部分功能将会在后续的设计中加强。
允许内存超配时,超出主机内存的部分将会使用到swap。Swap将会影响主机整体I/O性能,所以尽量不要把需要专用内存的虚拟机机与允许内存超配的虚拟机放在同一台物理主机上。
如果专用CPU的虚拟机与允许超配的虚拟机竞争CPU,由于cache的影响,将会严重影响专用CPU的虚拟机的性能,特别在同一个NUMA单元上时。因此,最好将使用专用CPU的虚拟机与允许超配的虚拟机放在不同的主机上,其次是不同的NUMA单元上。
内存共享
Linux内核有一项特性,叫做内核共享存储(KSM),该特性可以使得不同的处理器共享相同内容的内存页。内核会主动扫描内存,合并内容相同的内存页。如果有处理器改变这个共享的内存页时,会采用写时复制的方式写入新的内存页。当一台主机上的多台虚拟机使用相同操作系统或者虚拟机使用很多相同内容内存页时,KSM可以显著提高内存的利用率。因为内存扫描的消耗,使用KSM的代价是增加了CPU的负载,并且如果虚拟机突然做写操作时,会引发大量共享的页面,此时会存在潜在的内存压力峰值。虚拟化管理层必须因此积极地监控内存压力情况并做好现有虚拟机迁移到其他主机的准备,如果内存压力超过一定的水平限制,将会引发大量不可预知的swap操作,甚至引发OOM。
zswap特性允许压缩内存页被写入swap设备,这样可以大量减少swap设备的I/O执行,减少了交换主机内存页面中固有的性能下降。
Related resources (PCI)
关于虚拟机在主机上的CPU与内存的布局决策,也会影响其他的主机资源分配。例如,PCI设备与NUMA单元关系密切,PCI设备的DMA操作使用的内存最好在本地NUMA单元上。因此,在哪个NUMA单元上分配虚拟机,将会影响到PCI设备的分配。
技术可行性
本节讨论支持上述特性的各种虚拟化技术的可行性。
Libvirt / KVM
从2014年4月份起,libvirt开始支持以下特性:
? 虚拟CPU与物理CPU映射
? 主机NUMA内存布局与策略(例如,虚拟机从哪个单元上申请内存,以及是否为强制策略或者优选策略)
? 支持虚拟机大页内存
? 虚拟机NUMA拓扑
? 虚拟机虚拟CPU拓扑
? 为虚拟机分配资源组(使用cgroups),允许对整个组设置统一的NUMA或者调度策略
Libvirt不支持以下特性:
? 不能指定虚拟机NUMA单元与主机NUMA单元映射
? 不能控制有关NUMA单元的大页内存 (该功能需要基于虚拟机NUMA单元与主机NUMA单元映射)
? 不能检测剩余可用大页内存以及大页内存大小
? 不能控制分配的大页内存大小
? 不提供创建、定义与控制虚拟机资源组的API(必须由操作系统管理员提前定义)
? 不能检测PCI设备映射到的NUMA单元
为实现为特定虚拟机分配专有资源,有一些约束条件需要注意:
专有物理CPU
正如讨论中提到的,如果为虚拟机设置物理CPU亲和性,其他虚拟机要避免使用该虚拟机的专有物理CPU。以下几个方法可以实现这点:
? 在主机配置时,为所有虚拟机创建两个资源组,为两个组分配不同的物理CPU。使用专有资源的虚拟机与共享资源的虚拟机分别使用两个不同的资源组。
? 准备一些不超配的主机只用于专用资源
? 当出现一个需要专有资源的虚拟机时,动态更新所有现有虚拟机的物理CPU亲和性
? 为所有的虚拟机预先设置物理CPU亲和性,以预留一部分物理CPU为后面的专有资源虚拟机使用
? 为虚拟机设置固定的调度时间片,允许他们在物理CPU之间自由调度
专有内存
以下两种方法实现这一点:
? 为专有资源虚拟机使用大页内存。这需要主机拥有足够的可用大页内存,并且虚拟机内存大小是大页内存大小的倍数。
? 在主机配置时,为所有虚拟机创建两个资源组,为两个组分配不同的物理内存区域。使用专有资源的虚拟机与共享资源的虚拟机分别使用两个不同的资源组。
专用内存的分配的复杂性还在于,主要虚拟机之外,KVM还有许多不同的内存分配的需求,有些虚拟机处理视频内容,会在KVM过程处理I / O请求时,分配任意大小的内存。有些情况下,这也会影响虚拟CPU的使用,因为KVM模拟程序线程代表的就是虚拟机行为。更进一步讲,主机操作系统也需要内存与CPU资源。
VMWare
不作讨论
XenAPI
? 通过设置cores-per-socket值,可以限制虚拟CPU拓扑,不支持超线程。详细参见: