kvm虚拟机性能调优

kvm性能优化,主要集中在cpu、内存、磁盘、网络,4个方面,当然对于这里面的优化,也是要分场景的,不同的场景其优化方向也是不同的,下面具体聊聊这4个方面的优化细节。

1. CPU

cpu优化需要搞清楚node、socket、core、logic processor的关系,知道内存、l3-cache、l2-cache、l1-cache和cpu的关系。

针对kvm的优化,一般情况,都是通过pin,将vm上的cpu绑定到某一个node上,让其共享l3-cache,优先选择node上的内存,bind方法可以通过virt-manage processor里面的pinning动态绑定。这个绑定是实时生效的。

由于没有下载到speccpu2005,所以写了个大量消费cpu和内存的程序,来检验绑定cpu所带来的性能提升,程序如下:

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define BUF_SIZE  512*1024*1024
#define MAX 512*1024
#define COUNT 16*1024*1024
char * buf_1 = NULL;
char * buf_2 = NULL;
void *pth_1(void *data)
{char * p1 = NULL;char * p2 = NULL;int value1 = 0;int value2 = 0;int value_total = 0;int i = 0;int j = 0;for (i = 0; i <=COUNT; i++) {value1 = rand() % (MAX + 1);value2 = rand() % (MAX + 1);p1 = buf_1 + value1*1024;p2 = buf_2 + value2*1024;for (j = 0; j < 1024; j++) {value_total += p1[j];value_total += p2[j];}}return NULL;
}
void *pth_2(void *data)
{char * p1 = NULL;char * p2 = NULL;int value1 = 0;int value2 = 0;int value_total = 0;int i = 0;int j = 0;for (i = 0; i <=COUNT; i++) {value1 = rand() % (MAX + 1);value2 = rand() % (MAX + 1);p1 = buf_1 + value1*1024;p2 = buf_2 + value2*1024;for (j = 0; j < 1024; j++) {value_total += p1[j];value_total += p2[j];}}return NULL;
}
int main(void)
{buf_1 = (char *)calloc(1, BUF_SIZE);buf_2 = (char *)calloc(1, BUF_SIZE);memset(buf_1, 0, BUF_SIZE);memset(buf_2, 0, BUF_SIZE);pthread_t th_a, th_b;void *retval;pthread_create(&th_a, NULL, pth_1, 0);pthread_create(&th_b, NULL, pth_2, 0);pthread_join(th_a, &retval);pthread_join(th_b, &retval);return 0;
}

偶数cpu在node 0 上,奇数cpu在node 1上,vm有2个cpu,程序有2个线程,分别将vm绑定到8,9和10,12,通过time命令运行程序,time ./test,测试结果如下

8,9
real 1m53.999s
user 3m34.377s
sys 0m3.020s

10,12
real 1m25.706s
user 2m49.497s
sys 0m0.699s

可以看出,绑定到同一个node上,比绑到不同node上其消耗时间小不少。测试过程中,也发现如果提供8、9、10、11的cpu,系统会在大部分时间选择8、10和9、11,所以猜测,kvm在cpu bind上,可能已经做了优化,会尽可能的往同一个node上绑定。

这里需要注意的一点是,通过virt-manage pin cpu,仅仅进行cpu bind,会共享l3-cache,并没有限制一定用某一个node上的内存,所以仍然会出现跨node使用内存的情况

2. 内存

优化项包括EPT、透明大页、内存碎片整理、ksm,下面一个一个来介绍

2.1 EPT

针对内存的使用,存在逻辑地址和物理地址的转换,这个转换时通过page table来进行的,并且转换过程由cpu vmm硬件加速,速度是很块的。

但是引入vm之后,vm vaddr----->vm padddr--------->host paddr,首先vm需要进行逻辑地址和物理地址的转换,但是vm的物理地址还是host机的逻辑地址,需要再进行一次逻辑地址到物理地址的转换,所以这个过程有2次地址转换,效率非常低。

幸亏intel提供了EPT技术,将两次地址转换变成了一次。这个EPT技术是在bios中,随着VT技术开启一起开启的。

2.2 透明大页

逻辑地址向物理地址的转换,在做转换时,cpu保持一个翻译后备缓冲器TLB,用来缓存转换结果,而TLB容量很小,所以如果page很小,TLB很容易就充满,这样就很容易导致cache miss,相反page变大,TLB需要保存的缓存项就变少,减少cache miss。

透明大页的开启:echo always > /sys/kernel/mm/transparent_hugepage/enabled

内存碎片整理的开启:echo always> /sys/kernel/mm/transparent_hugepage/defrag

2.3 KSM

简单理解就是可以将host机内容相同的内存合并,节省内存的使用,特别是当vm操作系统都一样的情况,肯定会有很多内容相同的内存,开启了KSM,则会将这些内存合并为一个,当然这个过程会有性能损耗,所以开启与否,需要考虑使用场景,如果不注重vm性能,而注重host内存使用率,可以考虑开启,反之则关闭,在/etc/init.d/下,会有两个服务,服务名称为ksm和ksmtuned,都需要关闭

3. 磁盘

磁盘的优化包括:virtio-blk、缓存模式、aio、块设备io调度器

3.1 virtio

半虚拟化io设备,针对cpu和内存,kvm全是全虚拟化设备,而针对磁盘和网络,则出现了半虚拟化io设备,目的是标准化guest和host之间数据交换接口,减少交互流程和内存拷贝,提升vm io效率,可以在libvirt xml中设置,disk中加入<target dev='vda' bus='virtio'/>

3.2 缓存模式

从vm写磁盘,有3个缓冲区,guest fs page cache、Brk Driver writeback cache(qemu的cache)、Host FS page cache,在host上的设置,无法改变guest fs page cache,但是可以改变后面2个cache,缓存模式有如下5种,当采用Host FS page cache,会有一个写同步,会实时将host cache中的数据flush到磁盘上,当然这样做比较安全,不会丢失数据,但写性能会受到影响。

writeback mode在mail server这种小文件 高io的服务器上,其性能是很差的,none模式大部分情况要比writethrough性能稍好一点,所以选择none。

启用方式在libvirt xml disk中加入<driver name='qemu' type='qcow2' cache='none'/>

3.3 aio

异步读写,分别包括Native aio: kernel AIO 和 threaded aio: user space AIO emulated by posix thread workers,内核方式要比用户态的方式性能稍好一点,所以一般情况都选择native,开启方式<driver name='qemu' type='qcow2' cache='none' aio='native'/>

3.4 块设备调度器

cfq:perprocess IO queue,较好公平性,较低aggregate throughput

deadline:per-device IO queue,较好实时性,较好aggregate throughput,不够公平,当某些vm有大量io操作,占用了大量io资源时,其它后加入的vm很有可能抢占不到io资源。

这个目前笔者还没有做过测试,但是查看网易和美团云的方案,都将其设置为cfq。

开启方式:echo cfq > /sys/block/sdb/queue/scheduler

4. 网络

优化项包括virtio、vhost、macvtap、vepa、SRIOV 网卡,下面有几篇文章写的非常好

http://www.ibm.com/developerworks/cn/linux/1312_xiawc_linuxvirtnet/
http://xiaoli110.blog.51cto.com/1724/1558984

4.1 virtio

更改虚拟网卡的类型,由全虚拟化网卡e1000、rtl8139,转变成半虚拟化网卡virtio,virtio需要qemu和vm内核virtio驱动的支持,这个原理和磁盘virtio原理一样,不再赘述。

4.2 vhost_net

vhost_net将virtiobackend处理程序由user space转入kernel space,将减少两个空间内存拷贝和cpu的切换,降低延时和提高cpu使用率

4.3 macvtap

代替传统的tap+bridge,有4中模式,bridge、vepa、private、passthrough

  • 1 Bridge
    完成与 Bridge 设备类似功能,数据可以在属于同一个母设备的子设备间交换转发. 当前的Linux实现有一个缺陷,此模式下MACVTAP子设备无法和Linux Host通讯,即虚拟机无法和Host通讯,而使用传统的Bridge设备,通过给Bridge设置IP可以完成。但使用VEPA模式可以去除这一限制. macvtap的这种bridge模式等同于传统的tap+bridge的模式.

  • 2 VEPA
    是对802.1Qbg标准中的VEPA机制的部分软件实现,工作在此模式下的MACVTAP设备简单的将数据转发到母设备中,完成数据汇聚功能,通常需要外部交换机支持Hairpin模式才能正常工作。

  • 3 Private
    Private模式和VEPA模式类似,区别是子 MACVTAP之间相互隔离。

  • 4 Passthrough
    可以配合直接使用SRIOV网卡, 内核的macvtap数据处理逻辑被跳过,硬件决定数据如何处理,从而释放了Host CPU资源。MACVTAP Passthrough 概念与PCI Passthrough概念不同,PCI Passthrough针对的是任意PCI设备,不一定是网络设备,目的是让Guest OS直接使用Host上的 PCI 硬件以提高效率。MACVTAP Passthrough仅仅针对 MACVTAP网络设备,目的是饶过内核里MACVTAP的部分软件处理过程,转而交给硬件处理。综上所述,对于一个 SRIOV 网络设备,可以用两种模式使用它:MACVTAP Passthrough 与 PCI Passthrough

4.4 PCI pass-through

直通,设备独享。

4.5 SO-IOV

优点是虚拟网卡的工作由host cpu交给了物理网卡来实现,降低了host cpu的使用率,缺点是,需要网卡、主板、hypervisor的支持。

测试结果,在实验室2台host,分别起1台vm(vm1、vm2),用iperf测试vm1和vm2之间的吞吐量,用ping测试2者之间的响应时间,host机为百兆网卡,结果如下表所示,可以看出随着优化的深入,其吞吐量和响应时间都有所改善,由于暂时没有硬件的支持,macvtap vepa和SR-IOV没有得到测试。

测试工具 Iperf(ping)

  • rtl8139
    87Mb/s(1.239ms)

  • virtio
    89Mb/s(1.140ms)

  • Virtio + host_net
    92Mb/s(1.014ms)

  • Macvtap(bridge) + virtio + host_net
    94Mb/s(0.989ms)

  • host
    95Mb/s(0.698ms)

总结来看网络虚拟化具有三个层次:

1, 0成本,通过纯软件virtio、vhost、macvtap提升网络性能;
2, 也可以用非常低的成本按照802.1Qbg中的VEPA模型创建升级版的虚拟网络,引出虚拟机网络流量,减少Host cpu负载,但需要物理交换机的配合;
3, 如果网络性能还是达不到要求,可以尝试SR-IOV技术,不过需要SR-IOV网卡的支持。

总结:文章总共阐述了cpu、内存、磁盘、网络的性能优化方案,大部分都是通过kvm参数和系统内核参数的修改来实现。

kvm虚拟机性能调优相关推荐

  1. gateway 内存溢出问题_带你学习jvm java虚拟机 arthas/性能调优/故障排除/gc回收/内存溢出等...

    学完本课程,您将掌握: 内存溢出问题实战 CPU飙升问题实战 阿里巴巴Arthas在线诊断 Class字节详细拆解 手写类加载器.四种类加载器.双亲委托模型 对象创建.存储.访问.加载解析 性能调优. ...

  2. 深入理解Java虚拟机:Jvm性能调优

    本篇内容包括:Jvm 性能调优简介:根据需求目标进行 Jvm 调优规划(即 调优的目标.调优的步骤):Jvm 调优参数.命令.工具:以及 Java 中的内存泄露问题的详解- 一.Jvm 性能调优简介 ...

  3. 深入理解JVM虚拟机14:JVM性能调优的6大步骤,及关键调优参数详解

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...

  4. java中数组的内存模型_Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型+虚拟机原理能解决什么样问题...

    在上一篇文章中,小编为您详细介绍了关于<变频器调速问题?三星R458更换CPU>相关知识.本篇中小编将再为您讲解标题Java如何在内存有限的情况下实现一个超大数组?jvm性能调优+内存模型 ...

  5. JVM(Java虚拟机)详解(JVM 内存模型、堆、GC、直接内存、性能调优)

    JVM(Java虚拟机) JVM 内存模型 结构图 jdk1.8 结构图(极简) jdk1.8 结构图(简单) JVM(Java虚拟机): 是一个抽象的计算模型. 如同一台真实的机器,它有自己的指令集 ...

  6. Java虚拟机学习总结(4)—— JVM 性能调优常用参数详解

    前言 在JVM性能调优时有三个组件: 堆大小调整(内存最够大的话,尽量搞大点) 垃圾收集器调整 JIT 编译器(比较深,需要掌握源码才能更好的优化更加底层) 大多数调优选项都与调整堆大小和为您的情况选 ...

  7. OpenstackNova-KVM性能调优

    前言:请勿轻易调优,除非很清楚在干什么 KVM 作为 Nova 的虚拟化 Driver,是真正意义上负责虚拟机生命周期管理虚拟化基础设施,所以,如果清楚 KVM 的某些调优参数和策略,就有可能为 No ...

  8. jvm调优工具_JVM性能调优监控工具jps、jstack、jmap、jhat、hprof使用详解

    来自:ITeye博客, 作者:Josh_Persistence 链接:https://www.iteye.com/blog/josh-persistence-2161848 现实企业级Java应用开发 ...

  9. Tomcat 和 JVM 的性能调优总结

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://rrd.me/enKbC Tomcat性能调优 ...

最新文章

  1. linux下从git获取有权限的代码,linux下从源代码安装git
  2. 面试中又被问到Redis如何实现抢购,赶快代码实现一波吧!
  3. mysql语句中事务可靠性_MYSQL中的事务
  4. 搜狗浏览器验证码无法显示_逃离塔科夫账号注册-验证码不显示
  5. [C++] 用Xcode来写C++程序[3] Constants
  6. 360浏览器linux版本_360安全浏览器崩溃解决方案
  7. ztree 后台异步加载_zTree树形插件异步加载方法详解
  8. 微信小程序云开发教程-微信小程序的JS基础-常用的回调函数
  9. BaseAdapter使用的三种形式,逗比式,普通式,文艺式
  10. Windows10应用Docker部署DoNet Core
  11. 读JavaScript高级程序设计感受
  12. Displaytag 详解
  13. 异名一文带你读懂Chrome小恐龙跑酷!
  14. WWDC22:ARKit 6低调发布,新功能瞄准VST MR头显
  15. 《黑白团团队》第八次团队作业:Alpha冲刺 第三天
  16. Karto Slam 参数配置
  17. accept()函数
  18. oracle数据库impdp命令的使用方法
  19. 【LaTex】利用ins文件和dtx文件生成cls或sty文件,latex宏包的生成与创建方法;配置宏包文件的方法,latex宏包文件放置目录
  20. 黄子韬被封“剧组开心果”:《艳势番》是人生精彩回忆

热门文章

  1. 【转载】DC/OS关键技术与应用场景
  2. 梦幻各种辅佐秘籍大搜查
  3. C语言实现strncpy
  4. 嵌入式学习Java第一课
  5. opencv-分水岭算法图像分割
  6. linux运行reggen文件,Linux启动问题——记Virtex-II Pro(PPC405)Linux内核移植
  7. 【转】睡五分钟等于六钟头的方法
  8. 记录常用的Linux命令行
  9. 【Django】模板语法
  10. 广金强智教务系统模拟登录