《KVM实战:原理、进阶与性能调优》

网友投稿 1007 2022-05-28

云计算与虚拟化技术丛书

KVM实战:

原理、进阶与性能调优

任永杰 程舟 著

Preface  前  言

为什么要写这本书

自《KVM虚拟化技术:实战与原理解析》(以下简称“上一本书”)出版以来,受到了读者的热烈欢迎,几度脱销重印。这给了笔者强烈的鼓舞和责任感,觉得有必要与时俱进给读者介绍最新的KVM虚拟化技术的相关知识。

从上一本书出版后到现在近5年时间里,国内虚拟化技术迅速普及,云计算应用风起云涌,阿里云、腾讯云、华为云等国内云服务提供商迅速崛起,使得云计算、虚拟化不再是原来象牙塔里虚无缥缈的技术概念,而是与普通大众日常生活息息相关的新名词,KVM被这几大云服务提供商广泛采用,使得它成为云计算世界里事实上的虚拟化标准。在这样的市场背景下,以Intel为代表的x86硬件厂商,这些年也愈加重视虚拟化技术的硬件支持与创新,ARM平台的硬件虚拟化支持也愈加完善。硬件层面的创新也促使QEMU、KVM在软件层面日新月异。比如,从2013年第1版发行至今,KVM(内核)版本从3.5发展到了4.8;QEMU版本从1.3发展到了2.7;专门针对KVM的qemu-kvm代码树已经废弃(被合并到了主流QEMU中)……因此,上一本书中的很多用例、方法和结论等,在新的代码环境下已经有些不合时宜,甚至会出错。我们有必要给读者提供最新且正确的信息。

相对于上一本书的修改

总体来说,我们对上一本书里所有的用例、图例都做了大量修改更新,实验环境采用笔者写作时的最新技术:硬件平台采用Intel Broadwell Xeon Server,KVM(内核)为4.8版本,QEMU为2.7版本,操作系统环境是RHEL 7.3。文中注释改成脚注的形式,而不是像上一本书那样出现在每章末尾。我们认为这样更方便读者阅读。当然,文字表述上也进行了许多修改。

另外,我们对章节的结构也进行了重新组织,全书共分3篇,10章:第一篇“KVM虚拟化基础”(第1章~第5章),第二篇“KVM虚拟化进阶”(第6章~第9章),第三篇“性能测试与调优”(第10章)。

除了上述的总体修改外,各章主要修改内容如下。

第1章,我们重新组织了结构,精简了一些文字介绍,加入了一些数据图表以便于读者的理解。加入了云计算几种服务模型的描述和图示。加入了一节关于容器(Container)的简介,以便读者对比学习。

第2章,对上一本书相关章节进行了更为系统的梳理,介绍了硬件虚拟化技术、KVM、QEMU、与KVM配合的组件以及相关工具链。

第5章,着重对其中的网络配置一节进行了更新。将上一本书中的第5章拆分成了第6章、第7章、第8章和第9章,并分别进行了内容扩充。

第6章,对应上一本书中的第5章的半虚拟化、设备直接分配、热插拔这3节,并分别进行了补充。在半虚拟化驱动一节中,我们新增了“内核态的vhost-net后端以及网卡多队列”“使用用户态的vhost-user作为后端驱动”“对Windows客户机的优化”这3小节。在设备直接分配一节中,我们使用VFIO替换掉了已经被废弃的Legacy passthrough。在热插拔一节,我们将内存热插拔独立出来,并着重更新,因为在上一本书出版时它还未被完全支持。除此之外,我们还新增了磁盘热插拔和网络接口的热插拔两节。

第7章,我们将上一本书中的第4章中内存大页部分和上一本书中的第5章中的KSM、透明大页等内容凑在一起,组成了KVM内存管理高级技巧,同时新增了NUMA(非统一内存访问架构)一节。

第8章,由上一本书中的第5章的“动态迁移”和“迁移到KVM虚拟化环境”两节组成。

第9章,在上一本书中的第5章的“嵌套虚拟化”“KVM安全”等内容的基础上,新增了“CPU指令相关的性能优化”一节,着重介绍了最近几年Intel的一些性能优化新指令在虚拟化环境中的应用。

第10章,对应上一本书中的第8章,专门讲KVM性能测试与优化。我们在最新的软硬件环境中重做了CPU、内存、网络、磁盘的性能测试,获取了最新的数据,尤其对一些测试工具(benchmark)进行了重新选取,比如磁盘性能测试,我们放弃了IOzone和Bonnie++,而选用业界更认可的fio。另外,我们还加入了“CPU指令集对性能的提升”和“其他的影响客户机性能的因素”两节进行分析,希望对读者进行虚拟化系能调优有所启示。

上一本书中的第7章“Linux发行版中的KVM”和第9章“参与KVM开源社区”分别作为本书的附录A和附录B,并进行了相应的内容更新。

其他章节的内容保持不变,即第3章为上一本书的第3章且内容不变;第4章为上一本书的第6章,内容不变。

读者对象

本书适合对Linux下虚拟化或云计算基础技术感兴趣的读者阅读,包括Linux运维工程师、KVM开发者、云平台开发者、虚拟化方案决策者、KVM的用户以及其他对KVM虚拟机感兴趣的计算机爱好者。希望本书对这些读者了解KVM提供以下帮助。

Linux运维工程师:了解KVM的使用方法、功能和基本的性能数据,能够搭建高性能的KVM虚拟化系统,并应用于生产环境中。

KVM开发者:了解KVM的基本原理和功能,也了解其基本用法和一些调试方法,以及如何参与到KVM开源社区中去贡献代码。

云平台开发者:了解底层KVM虚拟化的基本原理和用法,以促进云平台上层应用的开发和调试的效率。

虚拟化方案决策者:了解KVM的硬件环境需求和它的功能、性能概况,以便在虚拟化技术选型时做出最优化的决策。

普通用户:了解KVM的功能和如何使用KVM,用掌握的KVM虚拟化技术来促进其他相关的学习、开发和测试。

如何阅读本书

《KVM实战:原理、进阶与性能调优》

前面已经提到,本书相比上一本书内容更加集中,分类更加合理。如果读者朋友对KVM没有什么了解,笔者建议按本书章节顺序阅读,通读一遍之后再对感兴趣的章节进行仔细阅读。对于已有一定KVM知识基础的读者,可以根据自己的兴趣和已经掌握的知识情况来有选择地阅读各个章节。当然,笔者建议今后可能会经常使用KVM的读者,在阅读本书时,可以根据书中示例或者其他示例来进行实际操作。如果是开发者,也可以查看相应的源代码。

勘误和支持

KVM、QEMU等开源社区非常活跃,QEMU/KVM发展迅速,每天都有新的功能加进去,或者原有功能被改进。特别是qemu命令行参数很可能会有改动,故本书中qemu命令行参数只能完全适用于本书中提及的QEMU版本,读者若使用不同的版本,命令行参数可能并不完全相同。例如,本书写作时,“-enable-kvm”已经被社区标为“将要废弃”,很可能在读者拿到本书的时候,需要用“-accel kvm”来代替它。

由于KVM和QEMU的发展变化比较快,加之笔者的技术水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者朋友批评指正。读者朋友对本书相关内容有任何的疑问、批评和建议,都可以通过笔者之一(任永杰)的博客网站 http://smilejay.com/ 进行讨论。也可以发邮件给我们(smile665@gmail.com、Robert.Ho@outlook.com),笔者会尽力回复并给读者以满意的答案。全书中涉及的示例代码程序(不包含单行的命令)和重要的配置文件,都可以从网站https://github.com/smilejay/kvm-book 查看和下载。

如果读者朋友们有更多的宝贵意见或者任何关于KVM虚拟化技术的讨论,也都欢迎发送电子邮件至邮箱smile665@gmail.com、Robert.Ho@outlook.com,我们非常期待能够得到朋友们的真挚反馈。

Contents  目  录

前言

第一篇 KVM虚拟化基础

第1章 虚拟化简介2

1.1 云计算概述2

1.1.1 什么是云计算2

1.1.2 云计算的历史4

1.1.3 云计算的几种服务模型5

1.2 虚拟化技术6

1.2.1 什么是虚拟化6

1.2.2 软件虚拟化和硬件虚拟化7

1.2.3 半虚拟化和全虚拟化8

1.2.4 Type1和Type2虚拟化8

1.3 KVM简介9

1.3.1 KVM的历史9

1.3.2 KVM的功能概览10

1.3.3 KVM的现状12

1.3.4 KVM的展望13

1.4 其他的虚拟化解决方案简介14

1.4.1 Xen14

1.4.2 VMware14

1.4.3 HyperV16

1.4.4 Container17

1.5 本章小结17

第2章 KVM原理简介18

2.1 硬件虚拟化技术18

2.1.1 CPU虚拟化18

2.1.2 内存虚拟化20

2.1.3 I/O虚拟化22

2.1.4 Intel虚拟化技术发展24

2.2 KVM架构概述25

2.3 KVM内核模块26

2.4 QEMU用户态设备模拟27

2.5 与QEMU/KVM结合的组件28

2.6 KVM上层管理工具30

2.7 本章小结31

第3章 构建KVM环境32

3.1 硬件系统的配置32

3.2 安装宿主机Linux系统34

3.3 编译和安装KVM37

3.3.1 下载KVM源代码37

3.3.2 配置KVM39

3.3.3 编译KVM43

3.3.4 安装KVM44

3.4 编译和安装QEMU46

3.4.1 曾经的qemu-kvm46

3.4.2 下载QEMU源代码47

3.4.3 配置和编译QEMU47

3.4.4 安装QEMU49

3.5 安装客户机50

3.6 启动第一个KVM客户机53

3.7 本章小结53

第4章 KVM管理工具55

4.1 libvirt55

4.1.1 libvirt简介55

4.1.2 libvirt的安装与配置58

4.1.3 libvirt域的XML配置文件63

4.1.4 libvirt API简介76

4.1.5 建立到Hypervisor的连接78

4.1.6 libvirt API 使用示例82

4.2 virsh87

4.2.1 virsh简介87

4.2.2 virsh常用命令88

4.3 virt-manager95

4.3.1 virt-manager简介95

4.3.2 virt-manager编译和安装96

4.3.3 virt-manager使用96

4.4 virt-viewer、virt-install、virt-top和libguestfs105

4.4.1 virt-viewer105

4.4.2 virt-install106

4.4.3 virt-top107

4.4.4 libguestfs107

4.5  云计算管理平台109

4.5.1 OpenStack简介109

4.5.2 ZStack简介111

4.6 本章小结111

第5章 KVM核心基础功能112

5.1 硬件平台和软件版本说明112

5.2 CPU配置114

5.2.1 vCPU的概念115

5.2.2 SMP的支持116

5.2.3 CPU过载使用123

5.2.4 CPU模型124

5.2.5 进程的处理器亲和性和vCPU的绑定127

5.3 内存配置131

5.3.1 内存设置基本参数132

5.3.2 EPT和VPID简介133

5.3.3 内存过载使用136

5.4 存储配置137

5.4.1 存储配置和启动顺序137

5.4.2 qemu-img命令142

5.4.3 QEMU支持的镜像文件格式145

5.4.4 客户机存储方式149

5.5 网络配置150

5.5.1 用QEMU实现的网络模式151

5.5.2 使用直接的网桥模式154

5.5.3 用网桥实现NAT模式161

5.5.4 QEMU内部的用户模式网络170

5.5.5 其他网络选项174

5.6 图形显示175

5.6.1 SDL的使用175

5.6.2 VNC的使用177

5.6.3 VNC显示中的鼠标偏移186

5.6.4 非图形模式187

5.6.5 显示相关的其他选项189

5.7 本章小结191

第二篇 KVM虚拟化进阶

第6章 KVM设备高级管理194

6.1 半虚拟化驱动194

6.1.1 virtio概述194

6.1.2 安装virtio驱动196

6.1.3 使用virtio_balloon203

6.1.4 使用virtio_net208

6.1.5 使用virtio_blk210

6.1.6 内核态的vhost-net后端以及网卡多队列212

6.1.7 使用用户态的vhost-user作为后端驱动215

6.1.8 kvm_clock配置216

6.1.9 对Windows客户机的优化218

6.2 设备直接分配(VT-d)219

6.2.1 VT-d概述219

6.2.2 VFIO简介220

6.2.3 VT-d环境配置221

6.2.4 VT-d操作示例230

6.2.5 SR-IOV技术240

6.3 热插拔251

6.3.1 PCI设备热插拔252

6.3.2 PCI设备热插拔示例253

6.3.3 CPU的热插拔259

6.3.4 内存的热插拔260

6.3.5 磁盘的热插拔264

6.3.6 网卡接口的热插拔265

6.4 本章小结266

第7章 KVM内存管理高级技巧268

7.1 大页268

7.1.1 大页的介绍268

7.1.2 KVM虚拟化对大页的利用271

7.2 透明大页274

7.3 KSM277

7.3.1 KSM基本原理278

7.3.2 KSM操作实践280

7.3.3 QEMU对KSM的控制286

7.4 与NUMA相关的工具288

7.4.1 numastat289

7.4.2 numad290

7.4.3 numactl294

7.5 本章小结295

第8章 KVM迁移297

8.1 动态迁移297

8.1.1 动态迁移的概念297

8.1.2 动态迁移的效率和应用场景298

8.1.3 KVM动态迁移原理299

8.1.4 KVM动态迁移实践302

8.1.5 VT-d/SR-IOV的动态迁移306

8.2 迁移到KVM虚拟化环境307

8.2.1 virt-v2v工具介绍307

8.2.2 从Xen迁移到KVM308

8.2.3 从VMware迁移到KVM310

8.2.4 从VirtualBox迁移到KVM311

8.2.5 从物理机迁移到KVM虚拟化环境(P2V)312

8.3 本章小结313

第9章 其他高级功能314

9.1 嵌套虚拟化314

9.1.1 嵌套虚拟化的基本概念314

9.1.2 KVM嵌套KVM315

9.2 KVM安全318

9.2.1 SMEP/SMAP/MPX318

9.2.2 控制客户机的资源使用—cgroups319

9.2.3 SELinux和sVirt327

9.2.4 其他安全策略336

9.3 CPU指令相关的性能优化340

9.3.1 AVX/AVX2/AVX512340

9.3.2 XSAVE指令集342

9.3.3 AES新指令343

9.3.4 完全暴露宿主机CPU特性349

9.4 QEMU监控器351

9.4.1 QEMU monitor的切换和配置351

9.4.2 常用命令介绍352

9.5 qemu命令行参数358

9.5.1 回顾已用过的参数358

9.5.2 其他常用参数363

9.6 本章小结372

第三篇 性能测试与调优

第10章 KVM性能测试及参考数据374

10.1 虚拟化性能测试简介374

10.2 CPU性能测试376

10.2.1 CPU性能测试工具376

10.2.2 测试环境配置378

10.2.3 性能测试方法381

10.2.4 性能测试数据382

10.3 内存性能测试384

10.3.1 内存性能测试工具384

10.3.2 测试环境配置385

10.3.3 性能测试方法385

10.3.4 性能测试数据387

10.4 网络性能测试388

10.4.1 网络性能测试工具388

10.4.2 测试环境配置389

10.4.3 性能测试方法391

10.4.4 性能测试数据393

10.5 磁盘I/O性能测试394

10.5.1 磁盘I/O性能测试工具394

10.5.2 测试环境配置395

10.5.3 性能测试方法397

10.5.4 性能测试数据400

10.6 CPU指令集对性能的提升403

10.7 其他影响客户机性能的因素405

10.8 本章小结407

附录A Linux发行版中的KVM408

附录B 参与KVM开源社区417

KVM

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《KVM实战:原理、进阶与性能调优》一前言+目录
下一篇:【华为云学院·微认证】《一分钟自动化部署》 助您业务轻松上云。这一分钟学会,下一分钟兑现价值!
相关文章