总结的vGPU性能优化和监测:

 

1.禁用控制台VGA接口

  对于 GPU 的虚拟化技术,目前的进度是通过Partitioning的方式将显存进行分片,然后通过直通给所有的虚拟机,底层通过调度实现虚拟机之间直通访问的问题。通过纯软件的方法虚拟化一个功能齐全的 GPU 是不太现实的,因为其实现的复杂性以及极度低略的性能。鉴于此,在 XenServerQemu只模拟了 VGA 接口,通过半虚拟化帧缓存来加速 2D特定帧缓存的访问。在安装完GRID vGPU之后,GRID vGPU会实现一个VGA控制台接口,允许XenCenter通过控制台中的选项卡查看虚拟机的图形输出。此功能仅仅是为了管理需要,输出的图形并不是进过显卡加速或优化过的图像。我们在使用了CitrixXenDesktopHDX 3D Pro的远程图形堆栈来显示后,才可以显示经过显卡加速或优化过的图像。

       而使用Windows远程桌面(RDP)访问Windows 7 / Windows Server 2008虚拟机的时候,RDP将会禁止GRID vGPUNVIDIA驱动程序运行,而且GPU加速的DirectXOpenGL无法使用,NVIDIA控制面板也无法使用。不但如此,安装在VM中的VNC服务器也只是允许显示基本的模拟的显卡以低性能的远程访问方式进行。

      优化VGA接口可以减少虚拟机资源的消耗,尤其是装载了大量的虚拟机vGPU的时候,禁用控制台VGA接口完全可能会产生一些性能优势。我们可以通过在虚拟机平台指定disable_vnc=1来禁用VGA接口:vgpu_extra_args参数:

Citrix XenServer vGPU性能优化和监测_vGPU


     
控制台的VGA设置将在虚拟机下次重新启动的时候生效。控制台VGA禁用了以后,XenCenter的虚拟机控制台在WIndows启动的时候将会闪屏,这是正常现象。

      那如果我们的虚拟机出现问题了,通过XenDesktop无法进入了咋办呢?这个时候就需要将这个VGA接口重新激活,通过控制台进入虚拟机进行故障诊断和问题修复了。激活VGA的接口的命令和禁用正好是相反的,指定disable_vnc=0就可以启用了。

 

2.使用“breadth-first”的分配(不是默认配置)

     “breadth-first”vGPU启动分配机制的一种,这种分配机制是GRID vGPU在启动之后vGPU分配的最佳性能,但是在默认的配置下并不是默认的,需要我们采用该分配方案提高我们的性能。在GRID vGPU中,目前我所知的有两种vGPU分配方式: “breadth-first”"depth-first" 两种。那么我们在那点选择这两种模式呢?在XenServer的主机中,我们点击属性,在GPU的选项中我们就可以看见这两种分配机制。

Citrix XenServer vGPU性能优化和监测_vGPU_02

Maximum densitydepth-first 

   新启动的VM将尽可能的放置到一个已经使用了该vGPU profileGPU卡上。如果没有GPU使用该vGPU profile, 则将尝试在一个空余的GPU启动虚拟机(如果有多余)。这是默认的设置。 

Maximum performancebreadth-first 

   新启动的虚拟机尽可能的放置到空余的GPU上,这样获取最佳的性能,但是如果使用多个不同的vGPU profiles,则可能会遇到问题。 比如:如果有2 台虚拟机使用K220Q profile, 则都会请求并分配到各自一个独立的GPU. 如果后面有不是K220Q profile的虚拟机启动,则无法分配GPU 导致无法启动,因为没有空余的GPU了,而profile又不能混合使用。

      在这里vGPU profiles是指GPU切分成为vGPU的类型:在XenCenter上有“Allowed vGPU types”选项可以设置允许GPU使用的profile类型。默认是允许每个GPU使用所有类型的vGPU profiles。如果修改了此选项,也有可能会导致虚拟机无法启动。

Citrix XenServer vGPU性能优化和监测_NUMA_03

 

3.NUMA架构下CPU SocketvCPUGPU的分配与对应

   现在的服务器一般都是两颗物理的CPU,在学术术语上称之为CPU Socket,而且一般都采用NUMA架构设计。

Citrix XenServer vGPU性能优化和监测_NUMA_04
      
如图所示, NUMA中,虽然内存直接attachCPU上,但是由于内存被平均分配在了各个die上。只有当CPU访问自身直接attach内存对应的物理地址时,才会有较短的响应时间,我们称之为本地内存。而如果需要访问其他CPU attach的内存的数据时,就需要通过inter-connect通道访问,响应时间就相比之前变慢了。既然CPU只有在Local-Access时响应时间才能有保障,那么我们就尽量把该CPU所要的数据集中在他local的内存中就OK啦!但是这和我们的GPU有什么关系?

CPU GPU 共同使用系统内存。渲染引擎从系统内存中的命令缓存中提取GPU 命令来在多个不同特性方面加速渲染图形;显示引擎从帧缓存中获取图形像素数据,然后将它们发送给外部显示器来显示图像。因此在NUMA平台获得最佳性能,建议将VM vCPU核心与CPU的物理核心进行绑定。例如,我们将物理GPU vGPU 01绑定到CPU Socket 0。同样,GPU vGPU 23绑定到CPU Socket 1

Citrix XenServer vGPU性能优化和监测_NUMA_05

具体事宜的命令如下:

我们首先使用命令:xe host-cpu-info查看下CPU的信息。

要固定虚拟机的vCPU到特定的CPU插槽,需要设置的参数为VCPU-params。此设置需要VM重新引导才能够生效。在2CPU的平台,假设有32个内核,内核0-15都在 Socket 0,内核16-31都在Socket 1上。要限制虚拟机只在Socket 0中运行:

Citrix XenServer vGPU性能优化和监测_vGPU_06

除此之外我们还可以设置虚拟机就在那几个内核上运行,而不用讲范围扩大到整个Socket

Citrix XenServer vGPU性能优化和监测_虚拟机_07

 

4.使用4vCPU

Windows的客户端操作系统最多支持两个CPU Sockets。当 Guest VM中的vCPU分配给Virtual SocketsXenServer默认分配每个插槽一个vCPU;分配给该VM的任何两个以上的vCPU将不会由Windows客户端操作系统识别。

为了解决这个问题,需要设置platform:cores-per-socket:内核中每Sockets分配给VM vCPU的数量:

Citrix XenServer vGPU性能优化和监测_虚拟机_08



5.XenCenter性能管理器看到vCPUhttp://support.citrix.com/article/CTX126524

通过XenCenter监测GPU性能,单击服务器的性能选项卡,然后在图形窗口上单击鼠标右键,选择操作,然后选择新图。为图形提供名称,并在可用的计数器资源列表中,选择一个或多个GPU计数器。计数器列出了当前使用的每个物理GPU的性能信息。

Citrix XenServer vGPU性能优化和监测_vGPU_09
还可以使用命令行的模式:

NVIDIA系统管理接口:NVIDIA-SMI,是一个命令行工具,可以通过噶工具查看GPU的信息。NVIDIA-SMIDom0shell中运行,而没有额外的参数调用,它在系统中提供了所有的GPU的摘要,包括PCI总线ID,功率状态,温度,当前内存使用等等。下图所示:

Citrix XenServer vGPU性能优化和监测_虚拟机_10

注:NVIDIA-SMI不会列出当前分配给虚拟机的任何直通GPU设备。