微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2017版:KVM性能优化之CPU优化

《2017版:KVM性能优化之cpu优化》要点:
本文介绍了2017版:KVM性能优化之cpu优化,希望对您有用。如果有疑问,可以联系我们。

前言

任何平台根据场景的不同,都有相应的优化.不一样的硬件环境、网络环境,同样的一个平台,它跑出的效果也肯定不一样.就好比一辆法拉利,在高速公路里跑跟乡村街道跑,速度和激情肯定不同…

所以,我们做运维工作,也是如此.首先你得充分了解你所用的软件平台,然后根据你现有的生产环境去充分的测试,最后得出结果,做最优的调整.

KVM也是一样,首先要做的是充分的了解它,看看有哪些参数和设置我们可以做出调整,最终应用以求发挥最高的性能.

那么KVM的性能调优,我们可以从四个方面入手 —— cpu、内存、磁盘IO、网络.

KVM cpu性能调优

cpu这块我们是针对NUMA这块的调优,那么什么是NUMA呢?NUMA是英文 Non Uniform Memory Access Architecture 的缩写,意思就是非统一内存访问,它是一种解决cpu共同工作的解决方案.我们知道现在的服务器配置都比较高了,cpu很多都是多路多核的,而且cpu是需要跟存储器进行数据交互的,以往的年代,那时候的cpu运算速率不高,而且都是单cpu模式,那么存储器里的数据要放到cpu里进行运算这是完完全全跟得上的.但是现在的cpu运算速度大大增强了,而且都是多cpu模式,于是就出现了不平衡,那就是存储器里的数据完全不够让cpu消化,并且还会出现多个cpu抢食存储器的情况… 这种情况下cpu就表现得非常的饥渴… 数据不够享用,而且存储器还不够分配.

因此计算机科学家为了提升计算机的性能,就认真的研究了下cpu和存储器之间的协调交互模式.总体核心思想就是寻找一个cpu模式下,如何让cpu能最大化的“享用”更多来自多个存储器的数据.

于是就设计出了以下几套解决方案:

1.1 SMP技术

最开始是SMP技术,SMP(Symmetric Multi-Processing )技术就是对称多处理结构,这种结构的最大特点就是cpu共享所有资源,比如总线,内存,IO系统等等.

既然是共享所有的资源,所以,各个cpu之间是平等的关系,然后操作系统管理着这些cpu对资源的访问(通常是用队列的形式去管理).每个cpu依次的去处理队列中的进程,如果两个cpu同时访问,那么一般是通过软件锁的机制去解决争夺的问题,软件锁这概念跟开发里的线程安全锁机制道理是一样的,当一个cpu处理着一进程,一般会先锁住,处理完再释放.

所以说到这里,这里的对称指的就是cpu之间是平等的无主从,访问资源也是平等的.我们可以看下面这张图:

CPU

这个结构是最早出现的方案,但是就是因为最早出现,所以它的弊端很快就显现出来了,那就是它的扩展能力不强.我们看上面这张图就明显感觉到,如果服务器要提升性能增加cpu,那么内存(内存最大化的情况下)就明显不够了,因为是共享模式,多一个cpu就多一个吃内存数据的人…  因此多增加cpu没法享受到内存的数据,就会停歇,这样就造成了cpu的浪费.

有实验数据表明,SMP型的服务器cpu最好是2-4颗就OK了,多余的就浪费了.

SMP

由此可见,这种方式是有缺陷的...因此科学家又想到了另外一个结构方案,那就是NUMA.

1.2 NUMA技术

NUMA刚才我们在前面说了是非统一内存访问的意思,它的出现就很好的解决了SMP的扩展问题.有了NUMA技术那么就可以把几十个甚至上百个cpu组合在一个服务器內.

NUMA架构设计图:

NUMA技术

从图中我们发现,每个cpu模块之间都是通过互联模块进行连接和信息交互,cpu都是互通互联的,同时,每个cpu模块平均划分为若干个Chip(不多于4个),每个Chip都有自己的内存控制器及内存插槽.

在NUMA中还有三个节点的概念:

  1. 本地节点: 对于某个节点中的所有cpu,此节点称为本地节点.
  2. 邻居节点:与本地节点相邻的节点称为邻居节点.
  3. 远端节点:非本地节点或邻居节点的节点,称为远端节点.

邻居节点和远端节点,都称作非本地节点(Off Node).

这里要注意的是,cpu访问不同类型节点内存的速度是不相同的,访问本地节点的速度最快,访问远端节点的速度最慢,即访问速度与节点的距离有关,距离越远访问速度越慢,此距离称作Node distance.正是因为有这个特点,所以我们的应用程序要尽量的减少不通cpu模块之间的交互,也就是说,如果你的应用程序能有方法固定在一个cpu模块里,那么你的应用的性能将会有很大的提升.

CPU

访问速度:本地节点>邻居节点>远端节点

因此KVM也是一样,我们在cpu优化这块就是要让KVM绑定在指定的cpu上,这样减少跨cpu的交互使用,让KVM的性能提升.现在我们的服务器还有linux操作系统都是认走NUMA模式,所以我们接下来说说如何去做cpu的绑定.

那么具体如何操作?

1.3 numactl 命令讲解

我们这里用一台真实的物理机演示,这台物理机的是IBM 3650M4.

首先我们用numactl命令查看NUMA的情况,如果你系统没有这个命令,用 yum install numactl 安装下即可.

 命令讲解

OK,以上是numactl的详细命令,那么接下来我们先看看当前服务器cpu的numa情况:

我们执行lscpu命令可以查看到一些cpu信息:

scpu

我们用numactl –hardware可以查看,如这里我准备了两台IBM的服务器,一个3650M4另外一个是3850M2.

我们可以从命令返回的情况看出,这台服务器numa有2个node(node0和node1):

numa

我们再看另外一个服务器,这是一台IBM 3850M2,那么它就只有一个node:

node

通过这个numactl –hardware命令,我们可以看出上面那台机器每个node有81894 MB的内存可以使用(大概79G),而IBM 3850M2这个服务器node有131070MB(120多G)内存可用(基本上是整个服务器的内存)

那么接下来我们可以看下cpu numa的调度分配情况:

我们运行numastat命令可以查到:

numasta

3650M4

2017版:KVM性能优化之CPU优化

3850M2

参数解释:

  • numa_hit 使用本节点内存次数
  • num_miss  计划使用本节点内存而被调度到其他节点次数
  • num_foregin  计划使用其他节点内存而使用本地内存次数
  • interleave_hit  交叉分配使用的内存中使用本节点的内存次数
  • local_node  在本节点运行的程序使用本节点内存次数
  • NB other_node  在其他节点运行的程序使用本节点内存次数

接着我们看下这个命令:numastat -c  ,这个命令c 后面跟上进程名就能看到相关进程的NUMA内存使用情况.比如:numastat -c qemu-kvm,这样我们就知道了qemu-kvm这个进程,它在node0 和node1上使用的内存大小,单位是MB:

2017版:KVM性能优化之CPU优化

OK 通过这几个命令我们可以查看一些numa的基本状态和使用情况.那么针对cpu Numa技术,linux操作系统本身呢也有自身对这块的设计.拿linux来说,它认使用的就是NUMA自动平衡策略,系统会自动的调配numa的内存使用,以求一个平衡.

当然,这个设置是可以用户自己控制的,如果我们想关闭,直接运行

# echo 0 > /proc/sys/kernel/numa_balancing    即可

# echo 1 > /proc/sys/kernel/numa_balancing    就是开启

1.4 cpu绑定操作

说到这,既然我们的操作系统还有cpu特性都采用了NUMA架构,那么我们完全可以通过调整KVM对应的NUMA关系来达到KVM cpu这方面的优化.这里,我们一般是通过cpu绑定的方法来做相关操作的.

那么具体的操作是怎么样的呢?那么接下来我们通过一个例子来演示.这里是一台物理机,之前我们看过了,现在上面装好了KVM,然后运行着几个虚拟机,我们用 virsh list 命令可以查看到当前运行的虚拟机列表.

绑定操作

比如我们要看这个Win7-ent虚拟机里vcpu对应物理cpu的情况,那么可以运行: # virsh vcpuinfo Win7-ent  可以查看

绑定操作

这个虚拟机是2个vcpu 双核的,然后都是跑在了物理机的cpu8上,使用的时间是2964.6s.最后一个cpu的亲和性,这个yyyyy 表示的是使用的物理cpu内部的逻辑核,一个y就代表其中一个cpu逻辑核.全部是y,那么说明这台物理机的24个cpu核,这个cpu都能调度使用.

当然,我们可以进入vrish,然后运行emulatorpin Win7-ent,通过这个命令我们可以更详细的得到这个虚拟机可以用哪几个核:

2017版:KVM性能优化之CPU优化

我们可以看到目前这个虚拟机0-23的cpu它都能调度使用

那么以上就是查看虚拟机cpu NUMA调度的信息,如果我们要把虚拟机绑定到固定的cpu上,我们就要做以下操作: # virsh emulatorpin Win7-ent 18-23 –live   通过这个命令,我们把这个win7的虚拟机vcpu绑定在了18-23这6个cpu间的核上.

我们用命令查看下 emulatorpin Win7-ent

2017版:KVM性能优化之CPU优化

我们也可以用virsh dumpxml Win7-ent 查看确认:

2017版:KVM性能优化之CPU优化

这是让虚拟机里的vcpu一起绑定的方法.

那么有的人会疑问,一个虚拟机我有两个vcpu,比如这个win7,它就是双核的,我想让里面的vcpu1和vcpu2分别绑定在不同的物理cpu上可以吗?怎么操作呢?这也是可以的,我们通过下面的方法可以进行相关的vcpu分别绑定

# virsh vcpupin Win7-ent 0 22

# virsh vcpupin Win7-ent 1 23

# virsh dumpxml Win7-ent

2017版:KVM性能优化之CPU优化

# virsh vcpuinfo Win7-ent

2017版:KVM性能优化之CPU优化

OK,这里要注意的是,你把虚拟机用reboot重启,这个绑定配置还是生效的,但是你shutdown的话,cpu绑定的效果会失效.我们要让VM关机然后起来也生效,就必须把参数写入到虚拟机的XML里,然后保存,这样关机了也不会失效,这里要注意下

2017版:KVM性能优化之CPU优化

 

2017版:KVM性能优化之CPU优化

OK,以上就是cpu绑定技术的操作.通过这样的操作,我们可以在一台多cpu的物理机上固定几个cpu给虚拟机用.当然,至于为什么可以这样做,前面我们提到了关于NUMA的原理,如果固定了虚拟机的cpu,那么它就不会去找远端节点了,另外就是有些场景下,一物理机多个cpu,如果前面几个cpu负载很高,利用率大,后面几个cpu利用率低,那么我们可以协调下,做cpu的绑定,平衡下cpu负载.

以上是cpu的绑定,接下来我们讲讲cpu的热添加.

1.5 cpu 添加

首先我们先了解下什么叫热添加,热添加就是在虚拟机运行不关机的情况下,做cpu添加操作.那么要注意的是,这个热添加是在Redhat7.0以后才出现的,之前是没有的.所以要享用这功能那必须要求KVM宿主机和虚拟机都得在7.0版本以后.那么具体怎么操作我们通过一个演示给大家操作下.

比如目前这个虚拟机,这是一个CentOS7.1的.我们先看下目前虚拟机的cpu的数值,我们可以进系统查看,cat /proc/cpuinfo| grep “processor”| uniq| wc -l ,我们看到当前是2个cpu

2017版:KVM性能优化之CPU优化

然后我们解释下这个最大cpu分配数是怎么个意思,它的意思就是给这个虚拟机最大预留的cpu个数,这个设置很重要,如果你想给虚拟机热添加,那么这个设置必须写.比如我们这里写的4,那么我们可以给虚拟机最大热添加到4个cpu,而且4是上限.

那么接下来说下,具体怎么热添加.我们先在宿主机里先给这个虚拟机添加第三个cpu,原来是2个,现在再添加一个变成3个: setvcpus VM3_CentOS7.1 3 –live

然后我们到虚拟机里面把这个cpu激活 :

echo 1 >/sys/devices/system/cpu/cpu2/online

2017版:KVM性能优化之CPU优化

我们再运行查看,发现已经变成3个了.

如果要减少,那么只能在虚拟机里减少刚才的cpu

# echo 0 >/sys/devices/system/cpu/cpu2/online

2017版:KVM性能优化之CPU优化

但是在宿主机层面看这个虚拟机的vcpu数还是3个,也就是说不支持热减少,我们运行vcpuinfo VM3_CentOS7.1命令发现还是3个:

2017版:KVM性能优化之CPU优化

同理,Windows的添加也是如此,直接在宿主机里添加第三个cpu即可

# setvcpus VM4_Win2008 3 –live

然后虚拟机里不用操作,它会自动刷新成3个cpu,我们也可以一个windows虚拟机做相关的演示,具体的可以由读者自己操作了.

到这为止,以上就是KVM cpu方面的优化.总结起来就两点,一个cpu绑定,还有一个就是热添加.

cpu绑定首先得了解NUMA技术,然后站在整个宿主机cpu资源的层面去调节.

添加,当你某个虚拟机正在运行,然后突然业务压力增大了,可以通过这方法达到0停机提升虚拟机cpu性能.


参考链接

http://www.cnblogs.com/yubo/archive/2010/04/23/1718810.html

http://cenalulu.github.io/linux/numa/

宝哥,云技术社区专家,资深IT运维工程师,多年IT运维经验,擅长Linux,VMware&Openstack虚拟化,ELK大数据日志分析等运维技术,扎实的一线运维经验,目前在某大型云计算公司担任openstack高级运维工程师.

文章来自微信公众号:云技术实践


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐