恒天云技术分享系列3 – KVM性能调优

恒天云技术分享:http://www.hengtianyun.com/download-show-id-11.htmlhtml

 

KVM是什么 

KVM 是 kernel-based Virtual Machine 的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20以后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,因此相对于Xen,其核心源码不多。KVM目前已成为学术界的主流VMM之一。KVM的虚拟化须要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的彻底虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的彻底虚拟化。但Xen自己有本身到进程调度器,存储管理模块等,因此代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列也是基于软件模拟的Para-Virtualization。linux

KVM (全称是 Kernel-based Virtual Machine) 是 Linux 下 x86 硬件平台上的全功能虚拟化解决方案,包含一个可加载的内核模块 kvm.ko 提供和虚拟化核心架构和处理器规范模块。 
算法

使用 KVM 可容许多个包括 Linux 和 Windows 每一个虚拟机有私有的硬件,包括网卡、磁盘以及图形适配卡等。 
windows

KVM为何要调优 

性能的损耗是关键。KVM是全虚拟化技术,全虚拟化有一个软件模拟硬件层,有必定的损耗,特别是IO这一块,所以咱们须要优化。 
后端

KVM如何调优

KVM虚拟环境性能优化的几个措施缓存

KVM原本性能已经很不错了,但还有一些微调措施来进一步提升KVM性能。 
性能优化

1. virtio 

virtio是KVM的半虚拟化机制,用以提升IO性能,使用virtio能够显著提升KVM性能。大部分的linux都已经集成virtio驱动,windows则因没有集成virtio驱动因此须要手动安装。 
架构

2. 使用writeback缓存选项 

针对客户机块设备的缓存,drive有一个子选项cache来设置缓存模式。两个主要的选项为writeback和writethrough,man手册是这样说的 
异步

By default, writethrough caching is used for all block device. This means that the host page cache will be used to read and write data but write notification will be sent to the guest only when the data has been reported as written by the storage subsystem. Writeback caching will report data writes as completed as soon as the data is present in the host page cache. This is safe as long as you trust your host. If your host crashes or loses power, then the guest may experience data corruption. 
oop

writethrough写操做时不使用主机的缓存,只有当主机接受 到存储子系统写操做完成的通知后,主机才通知客户机写操做完成,也就是说这是同步的。而writeback则是异步的,它使用主机的缓存,当客户机写入主机缓存后马上会被通知写操做完成,而此时主机还没有将数据真正写入存储系统,以后待合适的时机主机会真正的将数据写入存储。显然writeback会更快, 可是可能风险稍大一些,若是主机忽然掉电,就会丢失一部分客户机数据。 

这样使用writeback选项 

-drive file=debian.img,if=virtio,index=0,media=disk,format=qcow2,cache=writeback CDROM设备也可使用writeback选项 

3. 客户机的磁盘IO调度策略 

磁盘IO要通过调度才能够写入磁盘,这种调度又称做电梯算法。对于客户机对磁盘的IO操做实际上要通过三次IO调度才能真正访问到物理磁盘,客户机对虚拟磁盘执行一次IO调度,KVM主机对全部上层的IO执行一次调度,当KVM主机将IO提交给磁盘阵列时,磁盘阵列也会对IO进行调度,最后才会真正读写物理磁盘。 

客户机看到的磁盘只不过是主机的一个文件,因此其IO调度并没有太大意义,反而会影响IO效率,因此能够经过将客户机的IO调度策略设置为NOOP来提升性能。NOOP就是一个FIFO队列,不作IO调度。 

linux客户机使用grub2引导时,能够经过给内核传递一个参数来使用NOOP调度策略 编辑文件/etc/default/grub 

行GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”后添加elevator=noop,变成为 GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash elevator=noop”

而后 $ sudo update-grub 

4. 打开KSM(Kernel Samepage Merging) 

页共享早已有之,linux中称之为COW(copy on write)。内核2.6.32以后又引入了KSM。KSM特性可让内核查找内存中彻底相同的内存页而后将他们合并,并将合并后的内存页打上COW标记。KSM对KVM环境有很重要的意义,当KVM上运行许多相同系统的客户机时,客户机之间将有许多内存页是彻底相同的,特别是只读的内核代码页彻底能够 在客户机之间共享,从而减小客户机占用的内存资源,从而能够同时运行更多的客户机。 

Debian系统中KSM默认是关闭的,经过如下命令来开启KSM 

# echo 1 > /sys/kernel/mm/ksm/run 

关闭KSM 

# echo 0 > /sys/kernel/mm/ksm/run 

这样设置后,从新启动系统KSM会恢复到默认状态,还没有找个哪一个内核参数能够设置在/etc/sysctl.conf中让KSM持久运行。 

能够在/etc/rc.local中添加 

echo 1 > /sys/kernel/mm/ksm/run 

让KSM开机自动运行 

经过/sys/kernel/mm/ksm目录下的文件来查看内存页共享的状况,pages_shared文件中记录了KSM已经共享的页面数。 

国人对KSM作了进一步优化,这就是UKSM(Ultra KSM)项目,听说比KSM扫描更全面,页面速度更快,并且CPU占用率更低,但愿此项目能尽快进入内核mainline。 

KSM会稍微的影响系统性能,以效率换空间,若是系统的内存很宽裕,则无须开启KSM,若是想尽量多的并行运行KVM客户机,则能够打开KSM。 

5. KVM Huge Page Backed Memory 

经过为客户机提供巨页后端内存,减小客户机消耗的内存并提升TLB命中率,从而提高KVM性能。x86 CPU一般使用4K内存页,但也有能力使用更大的内存页,x86_32可使用4MB内存页,x86_64和x86_32 PAE可使用2MB内存页。x86使用多级页表结构,通常有三级,页目录表->页表->页,因此经过使用巨页,能够减小页目录表和也表对内存的消耗。固然x86有缺页机制,并非全部代码、数据页面都会驻留在内存中。 

首先挂装hugetlbfs文件系统 

#mkdir /hugepages

#mount -t hugetlbfs hugetlbfs /hugepages 

而后指定巨页须要的内存页面数

#sysctl vm.nr_hugepages=xxx 

最后指定KVM客户机使用巨页来分配内存 

kvm -mem-path /hugepages 

也可让系统开机自动挂载hugetlbfs文件系统,在/etc/fstab中添加 

hugetlbfs /hugepages hugetlbfs defaults 0 0 

在/etc/sysctl.conf中添加以下参数来持久设定巨页文件系统须要的内存页面数 

vm.nr_hugepages=xxx 

巨页文件系统须要的页面数能够由客户机须要的内存除以页面大小也就是2M来大致估算。

相关文章
相关标签/搜索