感谢支持
我们一直在努力

Xen虚拟机cpu负载过高性能问题

背景:


在Xen环境下,内存与CPU分配是可以动态改变的。通过动态更改内存与CPU分配,可以达到优化虚拟机性能的目的。


通常情况下,我们的虚拟机分配物理cpu的资源为自动分配的。当在一个物理机器上面分配多个虚拟机,并且虚拟机的cpu总和超过实际物理机器的cpu数量时,并且各个虚拟机在高负载的情况下,高负载的虚拟机会调用其他虚拟机器的资源


这次发现的问题是我们公司某系统新上线了三台虚机服务器,上线后发现,在流量是平均分配的前提下,新上的机器的负载比老机器高,新上的机器负载在8左右,而老机器的负载在4左右,查询了机器的配置和参数设置,新老机器都一样。后来通过iostat指令,发现新机票的steal值非常高,大于在40左右,而老机器的steal只有0.1左右。经与老大咨询,steal的值高会代表实体机的CPU负载高。后经由老大发现,新上线的三台虚拟机在一台实体机上,每个虚机分配了四个CPU,而实体机是个8CPU的服务器,导致了三个虚机之间征用CPU。(cpu要打开超线程!!!)


检查方法


1,检查系统状态


# iostat 1


avg-cpu: %user %nice %system %iowait %steal %idle
61.58 0.00 22.66 0.00 13.30 2.46


Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn


avg-cpu: %user %nice %system %iowait %steal %idle
58.77 0.00 23.70 0.00 17.54 0.00


Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
xvda 8.49 0.00 520.75 0 552
xvda1 0.00 0.00 0.00 0 0


从这里我们可以看到 %steal 的值变化比较多,也就说明存在虚拟加之间在争用CPU的资源。


2. 检查各个虚拟机分配的CPU资源是否和物理机器的CPU资源一致。

解决方法

1. 如发现虚拟机的cpu资源(数量)大于物理机器的CPU资源。检查物理机器是否已经打开超线程,如果没有打开,需要打开。


2. 重启虚拟机后,检查资源是否还是解决。如果发现%steal 值恢复正常。问题解决。


附上一篇参考资料  http://www.linuxidc.com/Linux/2012-05/60941p2.htm


通俗一点来讲:把CPU比作人,那么没有超线程时这个人只用右手干活。有了超线程之后,左右手同时干不同的事情。在一定程度上提高了效率。

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


  在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设置内存最小值非常重要,保证Dom0能够有足够的内存对虚拟机进行管理。


  要想更改虚拟机的内存分配,可以利用两个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中的优先级。

赞(0) 打赏
转载请注明出处:服务器评测 » Xen虚拟机cpu负载过高性能问题
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏