Xen环境下的内存与CPU分配:性能优化

2011年7月19日 | 标签: linux, xen

在Xen环境下,硬件的管理并不是仅仅告诉它可以使用哪些PCI设备就可以完事。在准虚拟环境下,内存与CPU分配是可以动态改变的。通过动态更改 内存与CPU分配,可以达到优化虚拟机性能的目的。在本文中,TechTarget中国的特约虚拟化专家Sander van Vugt将描述这方面的所有信息。

启动物理服务器时,所有的内存资源都会默认被分配给Domain0。然后,其它虚拟机启动时,会从 Domain0获取内存资源。如果虚拟机是在完全虚拟化模式下运行,hypervisor将无法与虚拟内核对话,当前的内存分配也将无法改变。不过,如果 是在准虚拟化模式(paravirtualization)下,Xen的hypervisor就可以动态更变内存分配。采用准虚拟化模式时,一定要确保 Domain0至少可以分得一定的内存资源,以免它内存不足。对于Domain0的内存分配最小值,我建议设置为512MB。

要为Domain0预留内存,可以为内核添加一个启动项:dom0_mem= 。例如,dom0_mem=512M。打开Grub配置文件进行此设置。在Grub配置文件中,你会看到启动Xen内核的启动项。它大体如下:

title XEN
root (hd0,0)
kernel /xen.gz
module /vmlinuz-
2.6.16 .46-0.14-xen root=/dev/system/root vga=0x314
resume=/dev/system/swap splash=silent showopts
module /initrd-
2.6.16 .46-0.14.xen

在此配置文件中的第一个“module”行后面添加dom0_mem启动项。添加之后应该是这样:

title XEN
root (hd0,0)
kernel /xen.gz
module /vmlinuz-
2.6.16 .46-0.14-xen root=/dev/system/root vga=0x314
resume=/dev/system/swap splash=silent showopts   dom0_mem=512M
module /initrd-
2.6.16 .46-0.14.xen

设置好Domain0的内存分配后,就可以管理你的虚拟机内存分配了。启动一个虚拟机时,通常它会从Domain0获取内存资源。内存一旦分配给虚拟 机,Domain0将无法再收回,即使所有虚拟机都被停止也不能收回。正是因为这个原因,所以为Domain0设置内存最小值非常重要。

要想更改虚拟机的内存分配,可以利用两个xm命令:

  • xm mem-set:此命令可以更改一台虚拟机的当前内存分配;
  • xm mem-max:此命令可以限定一台虚拟机的内存使用最大值。不过,更改最大值之后需要重启才能生效。

更改内存分配之后,一定要使用xm list命令检查设置是否生效和正确:

xm list命令

  CPU管理

与内存一样,你也可以管理虚拟机的CPU分配。如果虚拟机使用的是准虚拟化,CPU的分配也可以动态更改。为虚拟机分配CPU时,不一定要根据服务器中 的物理CPU数目来分。如果你愿意,是可以这么做。不过,这样做是绝对优化不了性能的。如果将虚拟机与指定的物理CPU绑定,会帮助你大大地提高虚拟机性 能。除此之外,还可以调整CPU的运行队列(run queue),使某台虚拟机在CPU中具有更高的优先级。

所有可运行的虚拟 CPU(VCPU)都是由物理CPU中的本地运行队列管理的。这个队列是按优先级进行排序的,队列中的每个VCPU平分CPU资源。VCPU的优先级状态 有两种值:over和under。Over表示它占用的CPU资源超过了资源平分值,under表示低于这个平分值。如果VCPU的当前状态为 under,调度程序下次则会优先服务该VCPU。如果调度程序发现在其CPU上没有虚拟机为under状态,则会看其它CPU中是否有VCPU状态为 under,如果发现,则立即服务该VCPU。通过这种方式,所有CPU都会平均分配CPU资源。

通过设置weight和cap参数 值,管理员可以管理CPU的优先级。Weight参数用于分配CPU cycle,是一个相对值。一个weight为128的VCPU比一个weight为64的VCPU获得的CPU cycle多一倍。因此,利用这个参数可以决定哪个VCPU获得更多,哪个获得更少。第二个设置CPU的参数是cap,它设置的是domain获得的 CPU cycle百分数,是一个绝对值。如果设置为100,就表示那个VCPU会100%地占用物理CPU的可用cycle。如果cap为50,则表示该 VCPU占用的CPU cycle绝不会超过总量的一半。

在如下命令示例中, id为3的虚拟机weight为128,允许使用两个物理CPU的所有CPU cycle:

xm sched-credit -d 3 -w 128 -c 200

对于虚拟CPU,还要做的一个重要工作就是CPU分配。默认情况下,虚拟CPU与物理CPU是没有固定联系的。要提高性能,就需要为它们建立一个这样的 联系,这个工作很简单易行。为虚拟CPU和物理CPU建立“联系”的主要好处是可以防止虚拟CPU到处游荡。如果没有“联系”,调度程序会为虚拟CPU选 择一个物理CPU。当某个物理CPU处于繁忙状态时,虚拟CPU就会被转移,由另一个物理CPU服务。这个工作对性能的影响是很大的。因此,将虚拟CPU 与物理CPU绑定是个不错的办法。

绑定虚拟CPU时,首先利用xm list命令查看当前配置。然后,在你要查看CPU详细信息的domain中使用xm vcpu-list命令,命令输出结果如下:

lin:~ # xm vcpu-list 2

Xen

  这个命令显示,ID 2 domain当前使用了一个CPU(ID 0),该CPU当前在物理CPU 0。为了确认它的状态,可以使用如下命令:

xm vcpu-pin 2 0 1

如果你再使用xm vcpu-list命令,你会看见CPU Affinity由原来的“any cpu”变为了CPU 1。

注意,这个设置是无法被写入的。意思是,每次重启虚拟机之后,你都必须再重新设置。

最后,你还可以更改虚拟机分配的CPU数量。要更改此设置,既可以利用虚拟机管理器(Virtual Machine Manager)进行,也可以使用xm vcpu-set命令。例如,将domain 1分配的VCPU数改为4个,则:

xm vcpu-set 1 4

使用该命令时,你会发现它有时不起作用。这是因为,虚拟机的操作系统还必须支持动态更改CPU数量,不然就不能这样更改了。所以,在虚拟机的配置文件中更改其VCPU数更有效,而且不会因为重启虚拟机而失效。

  综述

对于虚拟机的性能优化,内存与CPU设置很重要,本文已阐述了其原因。此外,你还了解了如何调整虚拟机在物理CPU中的优先级。


相关博文

  1. 2011年7月19日19:01

    xen客户机启动的时候,虚拟CPU是由dom0系统决定固定在某个物理 CPU核心上的,这个分配具有随机性,比如我们的机器上有2个双核的处理器,也就是说有4个cpu核心,同时我们分配4个核给我们的虚拟客户机,那么我们 在客户机也看到4个cpu核心的,但是这四个vcpu核心并不是真的对应着物理机器上的四个核,可能四个虚拟cpu对应的是物理cpu中的1~4个核,也 就是说有下面4个可能:
    4vcpu=1cpu
    4vcpu=2cpu
    4vcpu=3cpu
    4vcpu=4cpu
    vcpu指虚拟CPU核心
    cpu指物理CPU核心
    因此,当我们的虚拟客户机上如果运行的是运算密集型的任务的时候,就必须看看我们vcpu与物理CPU的对应,必要的情况下手工固定VCPU到 物理CPU上,使该虚拟机可以使用所有的物理核心;而如果你正在运行IO密集型任务,那么最好就分配一个超线程或整个核给dom0,并且固定其他的域让他 们不能使用CPU 0。
    要查看vcpu于cpu的对应情况,可以使用两种方法:
    1、使用xm vcpu-list命令
    xm vcpu-list #列出所有域的CPU对应情况
    xm vcpu-list domname #列出指定域的CPU对应情况
    如果不进行VCPU固定,上面的list结果在最后一列CPU关联关系(cpu affinity)的值应该是any cpu,并且第三第四列就列出了VCPU和其对应的CPU
    2、进入virsh,运行vcpuinfo命令
    vcpuinfo domname #列出指定域的CPU对应情况
    如果不进行VCPU固定,上面的命令的结果中,列表中的CPU关联关系项(CPU Affinity)的值应该全部为y,物理CPU有多少核就有多少个y,而如果有指定的话,只有对应的核为y,其他的为-,比如我们的机器有4个核,那 么:
    没有进行VCPU固定: CPU Affinity: yyyy
    将VCPU固定在第二个核(编号为1)上: CPU Affinity: -y–

    Xen中虚拟客户机的cpu动态调整有两种方法
    1、使用xm vcpu-set命令可以设置cpu个数
    xm vcpu-set domname vcpu-num
    使用xm vcpu-pin命令可以固定vcpu到物理cpu
    xm vcpu-pin domname vcpu cpu
    vcpu–虚拟cpu的号码(号码可以用cat /proc/cpuinfo命令得到,一般从0~N-1[其中N为CPU核数])
    cpu–主机中cpu的号码
    2、进入virsh,然后用setvcpus命令进行设置
    setvcpus domname vcpu-num
    使用vcpupin命令可以将vcpu固定到物理cpu
    vcpupin domname vcpu cpu
    两种配置方法可以混用。
    由于上面已经提到物理CPU的分配默认是由系统分配的,所有动态地增加CPU个数之后,应该检查CPU分配情况以确保是否满足了自己的需求

    ###################

    用xm sched-credit -d 3 -w 128 -c 200命令来分配cpu资源,-d[–domain],-w[–weight],-c[–cap],在实验过程中,我设置了-w,将domain 0:domain1 =2:1,但是,在实际的运行过程中,domain1占用的cpu资源却不止1/3。原来在没有设定-c的情况下,若domain0没有运行应用程序,需 要极少cpu资源的情况下,domain1就会自动去“偷取”domain0的cpu资源,直到总的cpu资源占用为100%。所以,若要指定某一 domain只能使用总的cpu的一部分时,必须设定-c的值。因为-c的优先级高于-w。
    比如,你若指定domain1只能使用总的cpu的 20%那只需要设置-c 20就可以,而权重设置(weight)只有在两边都在运行时cpu的分配比例,但-c不设置还是会存在偷cpu的可能。

    此 外,domain 0 是不能通过xm vcpu-pin来设置的,在/etc/xen/xend-config.sxp中,有个变量为dom0-cpus ,如果系統是多处理器的环境SMP(symmetric multiprocessing) ,就可以限制 Dom0 可以使用的 CPU 个数,1 代表 Dom0 只能使用一顆 CPU,以此类推…这么做的好处是可以保留 CPU 資源給 DomU 來使用.
    預設 為 “0” 代表 Dom0 不受限制系統上所有的 CPU 都會使用到.

  2. 2012年1月10日13:57

    Your’s is a point of view where real inteillgecne shines through.

WordPress SEO fine-tune by Meta SEO Pack from Poradnik Webmastera