【IT168 评论】虚拟化技术优势众多,其中最显著的自然要数随时为虚拟机添加CPU与内存的能力。想让自己的虚拟环境瞬间性能爆表?只要为其分配更多内存容量,就能得到令人满意的结果。对于系统管理员而言,这简直是梦幻般的解决方案——面对运算量巨大的任务,我们不必再进行停机升级和烦人的断线维护,也无需担心重要资料因重新启动而丢失,这在无形中消除了日常工作中的巨大麻烦。
然而,无论是动态方式还是其它类似方式,为虚拟机分配额外CPU与内存在某些情况下还是可能对服务器造成潜在危害。在方便之余,我们还必须正确认真设备的工作负载与操作系统运行状态。
这一切都取决于大家平时所执行的工作负载类型、操作系统高度方案以及虚拟机中的虚拟CPU布局。虚拟CPU在资源分配方面有着得天独厚的优势,其便于上手且流程简单的特性赢得无数喝彩与人气。设定虚拟CPU数量然后导入新配置,虚拟机性能直接就会迈上新台阶。不过随着物理CPU运算核心数量的不断攀升以及NUMA的普及,以往简单的选择如今也开始复杂起来。现在,几乎每款主流管理程序都提供多套虚拟CPU备选方案。
举例来说,如果我们要为自己的虚拟机设置四个虚拟CPU,那么可行方案就有四个单核CPU、两个双核CPU和一个四核CPU三种。三者的运行机制差异很大,这些不同之处很可能会影响虚拟服务器中操作系统的资源调度机制,进而给管理工作带来诸多问题。
虚拟机的魔力
由于缺乏快捷的硬性衡量标准,因此我们很难从上述方案中直接做出选择。要做出适合业务需求的判断,我们必须认真考量工作负载配置文件、资源调度机制以及操作系统或内核版本。早期版本的系统内核通常不太善于处理多核心CPU,因此在这类情况下我们最好选择单核CPU选项。新内核及操作系统版本则更偏向于多核心CPU,擅长利用多计算单元进行复杂的任务处理。
除此之外,工作负载本身的性质同样影响重大。单线程与多线程工作负载在处理具体实例时所采取的方式有所不同,也许在某些负载中细微到足以忽略不计的差别,却可能在其它环境下引发难以估量的后续问题。
现代操作系统需要与NUMA紧密契合。在充分利用NUMA的优势之下,内存访问速度将得到显著提高,进而大大加快处理器与内存密集型处理流程的运行周期。当CPU核心只与由其控制的内存交互时,由于无需跨越到其它CPU辖区内进行内存分配及调用,速度自然会大大加快。
这是一种基础特性而且很容易理解,就像去街对面的商店肯定比跑到其它城镇购物更快捷。然而当我们把管理程序塞入操作系统底层之后,CPU核心与内存分配之间的关系却变得更为复杂且难以捉摸。
根据管理程序为虚拟服务器提交CPU的不同方式,操作系统可能会认为每个CPU拥有其独立内存控制器或者四个核心共享一套内存控制器。在这种情况下,虚拟机管理程序会不断查询虚拟服务器的内存分配状况,同时评估是否需要为当前处理虚拟机工作负载的CPU分配更多活动内存。当上述状况同时出现时,虚拟机的整体性能可能会随之大幅下降——事实上这种失速现象相当常见。
金玉良言
幸运的是如今我们已经找到了能够确定当前工作负载类型的有效方法——测试,情况一测咱就有数了。首先建立多套虚拟服务器,并为其设定彼此不同的虚拟CPU布局,然后运行相对较简单的日常工作负载。接下来在更深层面的调整中,我们可以在虚拟机管理程序级别进行NUMA分配,并测试不同情况下的具体运行效果,最终确定合适的参数分配方案。
举例来说,VMware vSphere就拥有asnuma.vcpu.maxPerMachineNode 和 numa.vcpu.maxPerClient两条调整参数,其作用在于允许我们调整可以驻留在单个NUMA节点中的最大虚拟CPU数量以及由管理程序作为整体控制的最大虚拟CPU数量。当然以上二者只是其中一部分,另有一些能够在特殊情况下发挥巨大作用的其它参数。总而言之,大多数情况下我们只要进行少量调试与检测工作,就能为日常工作负载找到最合适的性能解决方案。
这绝不算是什么新概念。早在18个月之前,我就已经在InfoWorld网站的虚拟化方案评析文章中提到过这种性能调整模式,并以红帽企业级虚拟化产品为例展开过讨论。不过那时候我只是把它当成大家容易忽视的知识要点来谈,但今天我则把它作为实实在在的必要管理技能。在大家创建并调整自己的虚拟机时,请记住在虚拟CPU领域,同样的数字“四”却可能包含着完全不同的意义。花点时间做好测试工作,未来的执行流程可能因此变得更加顺畅——这就是磨刀不误砍柴工的道理。