一, KVM 为什么要调优
性能的损耗是矛盾的根源, KVM 采用全虚拟化技术, 全虚拟化要由一个软件来模拟硬件层, 故有一定的损耗, 特别是 I/O 输入输出.
KVM 性能优化主要在 CPU, 内存, I/O 这几方面, 当然在这几方面也是要分场景的, 不同场景优化方向也是不同的.
二, KVM 优化思路及步骤
1,CPU 优化
要考虑 CPU 的数量问题, 所有 guestcpu 的总数目不要超过物理机 CPU 总数目, 如果超过, 则将对性能带来严重影响, 建议选择复制主机 CPU 配置.
2, 内存优化
(1)KSM---kernel Samepage Merging 相同页合并
内存分配的最小单位是 page(页面), 默认大小是 4KB, 可以将 host 主机内容相同的内存合并, 以节省内存的使用.
当 KVM 上运行许多相同系统的客户机时, 客户机之间将有很多内存页是完全相同的, 特别是只读的内核代码页完全可以在客户机之间共享, 从而减少客户机占用的内存资源, 也能同时运行更多的客户机.
ll //sys/kernel/mm/ksm/
查看 KSM 是否开启
cat run
- [root@bogon ksm]# cat run // 是否开启 KSM,0 为关闭, 1 为开启
- 0
- [root@bogon ksm]# echo 1> run // 临时开启 KSM, 只能使用重定向, 不支持 VI 编辑器
- // 若想永久开启, 可在 / etc/rc.local 中添加 echo 1> /sys/kernel/mm/ksm/run, 让 KSM 开机自动运行
- [root@bogon ksm]# cat pages_to_scan // 定期扫描相同页, sleep_millisecs 决定多长时间
- //pages_to_scan 决定每次查看多少个页面
- // 默认是 100, 越大越好, 超过 2000 无效, 需要开启两个服务 ksmtuned 和 tuned, 支持更多页面
(2) 对内存设置限制
如果我们有多个虚拟机, 为了防止某个虚拟机无节制的使用内存资源, 导致其他虚拟机无法正常使用, 就需要对使用的内存进行限制.
virsh memtune c7-1 // 查看当前虚拟机的内存限制, 单位为 KB
hard_limit : 无限制 // 强制最大内存
soft_limit : 无限制 // 可用最大内存
swap_hard_limit: 无限制 // 强制最大 swap 使用大小
设置强制最大内存为 100MB, 在线生效.
virsh memtune c7-1 --hard-limit 1024000 --live
3, 大页后端内存
在逻辑地址想物理地址转换时, CPU 保持一个翻译后备缓冲器 TLB, 用来缓冲转换结果, 而 TLB 容量很小, 所以如果 page 很小, TLB 很容易就充满, 这样就容易导致 cache miss, 相反 page 变大, TLB 需要保存的缓存项就变少, 就会减少 cache miss, 通过为客户端提供大页后端内存, 就能减少客户机消耗的内存并提高 TLB 命中率, 从而提高 KVM 性能.
查看内存信息, 无可用大页
- cat /proc/meminfo
- HugePages_Total: 0
- HugePages_Free: 0
- HugePages_Rsvd: 0
- HugePages_Surp: 0
指定大页需要的内存页面数量
echo 25000> /proc/sys/vm/nr_hugepages // 临时生效
永久生效
sysctl -w vm.nr_hugepages=25000
或者
- vim /etc/sysctl.conf
- vm.nr_hugepages=25000 // 添加行, 执行 sysctl -p 立即生效
关闭虚拟机, 编辑虚拟机 XML 配置文件使用大页来分配内存.
- virsh destroy c7-1
- vim /etc/libvirt/qemu/c7-1.xml
- ......
- <domain type='kvm'>
- <name>c7-1</name>
- <uuid>09ea8217-8943-47b1-9275-63b0357d31e2</uuid>
- <memory unit='KiB'>2097152</memory>
- <currentMemory unit='KiB'>2097152</currentMemory>
- <memoryBacking><hugepages/></memoryBacking> // 添加, 使用大页
- <vcpu placement='static'>1</vcpu>
- <os>
- <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
- <boot dev='hd'/>
- ......
重启 KVM 服务, 打开虚拟机, 查看大页内存是否生效.
- systemctl restart libvirtd.service
- virsh start c7-1
- cat /proc/meminfo | grep HugePage
关闭虚拟机, 再查看大页内存是否有变化.
4,I/O 优化
在实际的生产环境中, 为了米面过度消耗磁盘资源而对其他的虚拟机造成影响, 我们希望每台虚拟机对磁盘资源的消耗是可控的, 比如多个虚拟机往硬盘中写数据, 谁可以优先写, 就可以调整 I/O 的权重 weight, 权重越高写入磁盘的优先级越高.
对磁盘 I/O 控制方式有两种方式:
在整体中的权重, 范围在 100~1000.
限制具体的 I/O.
针对虚拟机权重设置
virsh blkiotune c7-1 // 查看当前虚拟机权重状态
virsh blkiotune c7-1 --weight 500 // 通过命令修改权重为 500
5, 系统调优工具 tuned/tuned-adm
tuned 是服务端程序, 用来监控和收集系统各个组件的数据, 并依据数据提供的信息动态调整系统设置, 达到动态优化系统的目的.
tuned-adm 是客户端程序, 用来和 tuned 打交道, 用命令行的管理方式和配置 tuned/tuned-adm, 提供了一些预先配置的优化方案可直接使用.
- yum install tuned -y
- service tuned start
- tuned-adm active
- tuned-adm list
更改解决方案
tuned-adm profile desktop
来源: http://blog.51cto.com/13659253/2155962