前言:请勿轻易调优,除非很清楚在干什么

KVM 作为 Nova 的虚拟化 Driver,是真正意义上负责虚拟机生命周期管理虚拟化基础设施,所以,如果清楚 KVM 的某些调优参数和策略,就有可能为 Nova 提供调优的基础和入口。Qemu-KVM 负责虚拟机的 CPU、Memory、存储和网络的虚拟化,所以可从该四个方面进行调优。


1. CPU Tuning

1.1 Cache share tuning

参考: https://libvirt.org/formatdomain.html#cpu-allocation

对于物理 CPU,同一个 core 的 threads 共享 L2 Cache,同一个 socket 的 cores 共享 L3 cache,所以虚拟机的 vcpu 应当尽可能在同一个 core 和 同一个 socket 中,增加 cache 的命中率,从而提高性能。IBM 测试过,合理绑定 vcpu 能给 JVM 来的 16% 的性能提升。

虚拟机 vcpu 尽可能限定在一个 core 或者一个 socket 中。例如:当 vcpu 为 2 时,2 个 vcpu 应限定在同一个 core 中,当 vcpu 大于 2 小于 12 时,应限定在同一个 socket 中。对 Nova 而言,需要搜集 CPU 详细的拓扑信息,并根据虚拟机 vcpu 的信息和绑定策略生成 libvirt 所需要的 xml 文件。

<vcpu placement='static' cpuset='0-5'>4</vcpu>       #  cpuset 限定 vcpu

1.2 NUMA tuning

参考: https://libvirt.org/formatdomain.html#numa-node-tuning

网易运维团队测试得出:2 个 vcpu 分别绑定到不同 numa 节点的非超线程核上和分配到一对相邻的超线程核上的性能相差有 30%~40%(通过 SPEC CPU2006 工具测试)。可见,同一个虚拟机的 vcpu 需限定在同一个 NUMA 节点,并且分配该 NUMA 节点下的内存给虚拟机,保证虚拟机尽可能访问 local memory 而非 remote memory。对 Nova 而言,可增加配置项,并在 nova/virt/libvirt/config.py 代码中增加该字段。

关于 memory allocation mode: If memory is overcommitted in strict mode and the guest does not have sufficient swap space, the kernel will kill some guest processes to retrieve additonal memory. Red Hat recommends using preferred allocation and specifying a single nodeset (for example, nodeset=’0’) to prevent this situation[1].

<numatune><memory mode="preferred" nodeset="0"/>
</numatune>

1.3 IRQ tuning

CPU0 常用于处理中断请求,本身负荷较重。事实上,线上环境 CPU0 完全处理 eth0 的 IRQ,eth1 的 IRQ 完全由另一个 CPU 处理,同时 CPU0 处理着大量的 CAL 类型中断。预留 2 个或者 4 个物理 CPU,这些 CPU 和对应网卡中断做绑定,使得其它 CPU 更好更完整的为云主机所用。对 Nova 而言,在生成 libvirt 所需要的 xml 文件时,需避免写入 cpu0等信息。


2. Disk IO Tuning

2.1 Disk IO cache Tuning

kvm 支持多种虚拟机多种 IO Cache 方式:writeback, none, writethrough 等。

  • 性能上: writeback > none > writethrough
  • 安全上 writeback < none < writethrough。

权衡安全性和性能,Kvm 推荐使用 none,Nova 也是默认选用 none cache mode。

<disk type='file' device='disk'><driver name='qemu' type='qcow2' cache='none'/>  #  cache 可为 writeback, none, writethrough,directsync,unsafe 等...
</disk>

2.2 Disk IO scheduler

Linux kernel 提供了三种 Disk IO 的调度策略,分别为 noop,deadline,cfq。

  • noop: noop is often the best choice for memory-backed block devices (e.g. ramdisks) and other non-rotational media (flash) where trying to reschedule I/O is a waste of resources
  • deadline: deadline is a lightweight scheduler which tries to put a hard limit on latency
  • cfq: cfq tries to maintain system-wide fairness of I/O bandwidth

由于一个宿主机上会运行大量虚拟机,为了防止某个因某个虚拟机频繁的 IO 操作影响其它虚拟机,所以应该选择 cfq 这种公平的调度策略。

2.3 Disk format

KVM 常用 Raw 和 Qcow2 格式作为虚拟机的镜像文件。对虚拟机而言,通俗的说,Raw 格式相当于裸盘,Qcow2 是 copy on write,二者对比如下:

  • 性能:Raw > Qcow2
  • 节省空间:Qcow2 > Raw
  • 安全:Qcow2 > Raw

Qcow2 格式发展到现在,已经有和 Raw 相近的性能,同时能较好的节省空间,所以 Nova 推荐使用 Qcow2 镜像,但是要最大可能的发挥性能,使用 Raw 格式也未尝不可。


3. Memory Tuning

3.1 Disable KSM

参考: https://libvirt.org/formatdomain.html#memory-backing

When KSM merges across nodes on a NUMA host with multiple guest virtual machines, guests and CPUs from more distant nodes can suffer a significant increase of access latency to the merged KSM page. Disable KSM 方式有两种:

  1. 禁止某个 Guest 与其它 Guest 共享内存,XML 文件可配置为:
<memoryBacking><nosharepages/>
</memoryBacking>
  1. 禁止所有 Guest 直接共享内存,Host 配置为:
echo 0 > /sys/kernel/mm/ksm/pages_shared
echo 0 > /sys/kernel/mm/ksm/pages_sharing

3.2 Open huge page

KVM guests can be deployed with huge page memory support in order to improve performance by increasing CPU cache hits against the Transaction Lookaside Buffer (TLB)。打开透明大页方式有两种:

  1. 允许某个 Guest 开启透明大页
<memoryBacking><hugepages/>
</memoryBacking>
echo 25000 > /pro c/sys/vm/nr_hugepages
mount -t hugetlbfs hugetlbfs /dev/hugepages
service libvirtd restart
  1. 允许 Host 中所有 Guest 开启透明大页
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag

4. Network IO Tuning

4.1 Enable vhost_net

VhostNet provides better latency (10% less than e1000 on my system) and greater throughput (8x the normal virtio, around 7~8 Gigabits/sec here) for network.

modprobe vhost-net

4.2 Mutil-queue

对虚拟机而言,virtio-net 不能并行的处理网络包,当网络流量很大时,单个 vCPU 有限的处理能力将直接影响虚拟机的网络流量,所以可以通过多队列的 virtio-net 提高虚拟机网络吞吐量,该特性已合入 L 版本。

  <devices><interface type='network'>...<driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off' queues='N'/>  # queues=N</interface></devices>

5. 一次调优的悲剧

Libvirt [CPU host passthrough](https://libvirt.org/formatdomain.html# elementsCPU)支持把宿主机的 CPU 指令集透传给虚拟机,如此虚拟机尽可能的利用宿主机的指令集,从而提升效率。事实上,更改后的短短的三天时间里,有多台宿主机莫名其妙的 kernel panic,虽然未能查明具体原因,但是禁止该配置后,宿主机和虚拟机稳定如初。

Reference

  1. Red Hat Enterprise Linux 6 Virtualization Tuning Optimization Guide
  2. Tuning KVM for performance
  3. 网易 openstack 部署运维实战
  4. Nova-KVM 性能调优

OpenstackNova-KVM性能调优相关推荐

  1. kvm虚拟机性能调优

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

  2. hive性能调优实战pdf_Nginx 性能调优实战

    来自:Linux社区 1.Nginx运行工作进程数量 Nginx运行工作进程个数一般设置CPU的核心或者核心数x2.如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpui ...

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

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

  4. ELASTIC SEARCH 性能调优

    ELASTICSEARCH 性能调优建议 创建索引调优 1.在创建索引的使用使用批量的方式导入到ES. 2.使用多线程的方式导入数据库. 3.增加默认刷新时间. 默认的刷新时间是1秒钟,这样会产生太多 ...

  5. OCM_第十二天课程:Section6 —》数据库性能调优_ 资源管理器/执行计划

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

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

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

  7. JVM解读-性能调优实例

    2019独角兽企业重金招聘Python工程师标准>>> JVM性能调优 1 堆设置调优 年轻代大小选择 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选 ...

  8. Java性能调优、LinkedIn容器部署、阿里移动性能调优——首届APMCon精彩演讲先睹为快...

    APMCon2016,在盛夏的8月等你. \\ 作为第一届APM垂直领域的技术大会,我们能拿出什么呈现给参会者? \\ 答案是,除了会场可以纳凉避暑之外,还有来自国内外顶级技术大拿带来的Java性能管 ...

  9. elasticsearch原理_ElasticSearch读写底层原理及性能调优

    ES写入/查询底层原理 1. Elasticsearch写入数据流程 客户端随机选择一个ES集群中的节点,发送POST/PUT请求,被选择的节点为协调节点(coordinating node) 协调节 ...

最新文章

  1. matlab 手掌轮廓,CG_图片轮廓mask提取-matlab
  2. Java计算一个对象所占内存大小_Java程序计算各种对象所占内存的大小的方法
  3. 【转】C# 中Linq查询所有上级节点或所有下级节点
  4. 安恒月赛 image up
  5. 迭代最近点(Iterative Closest Point, ICP)算法及matlab实现
  6. ES2017异步函数现已正式可用
  7. java制作h5视频聊天_JAVA实现大华摄像头WEB方式实时显示视频,H5界面展示方式思路。...
  8. a - 数据结构实验之图论一:基于邻接矩阵的广度优先搜索遍历_数据结构--图
  9. LeetCode 258 Add Digits
  10. 基于顺序存储结构的图书信息表的旧图书的出库(C++)
  11. dnf新起号怎么才不出人脸_DNF玩家花8千买号,还不到1年,眼前的一幕让他目瞪口呆...
  12. 在sql server中用正则表达式替换html标签,SQL Server中利用正则表达式替换字符串
  13. python的numpy教程_python numpy 基础教程 | 学步园
  14. 天堂2单机版如何架设mysql_天堂2单机版 L2J-som-rotm 安装全过程及常用工具 一步到位...
  15. 电流探头常见的三大类型
  16. js中求2个数的最大值的几种方法
  17. 央视《每周质量报告》:揭秘假宽带真相
  18. 删除MySQL历史数据并修改sqlsource.status lastindex脚本
  19. html5 vr图片展示,three.js——通过 HTML5 页面呈现 VR 内容
  20. linux环境怎么更新离线rpm包,SUSE Linux 11系统rpm包离线安装GCC

热门文章

  1. python扫题软件_python 实现端口扫描工具
  2. python io_Python 的 io.StringIO()
  3. Setting Up ODI's Schedule
  4. swiper实现触摸滑动
  5. liferay search container的两种实现方式
  6. 中国程序员的最后归宿
  7. MOSS 2007 系列学习之安装篇(一)
  8. infopath视图切换
  9. 基于DNS实现智能化访问网站
  10. 通过拓展Function.prototype实现一个AOP