2017-04-08 12:42:30 weixin_36908057 阅读数 1233

《kvm虚拟化技术 实战与原理解析》

1、kvm原理简介

 x86平台虚拟化技术中,新引入的虚拟化层通常称为虚拟机监控器(Virtual Machine Monitor,VMM),也叫做Hypervisor.
 宿主机是真实的物理平台,客户机是虚拟出来的平台。
 虚拟化实现的技术方式有多种,比如软件虚拟化和硬件虚拟化,再比如准虚拟化和全虚拟化。准虚拟化需要修改客户机操作系统。
 Xen是开源准虚拟化技术的例子,是取代内核由自身管理系统资源的架构。
 KVM全称 kernel Virtual Machine,内核虚拟机。它作为一个模块,成为linux内核的一部分。它是全虚拟化的解决方案,部分准虚拟化。
 虚拟级监控器的主要职能是管理真实的物理平台,并为每个虚拟客户机提供对应的虚拟硬件平台。
 虚拟机的架构分为类型一和类型二。类型一是虚拟机在系统上电后首先加载运行虚拟机监控程序,而传统的操作系统运行在创建的虚拟机上。类型二是系统上电后运行一般意义上的操作系统,虚拟机监控程序作为特殊的应用程序,视作操作系统功能的扩展。
 虚拟机的创建和运行是一个用户空间的应用程序(QEMU)和KVM模块相互配合。大部分的输入和输出设备交给QEMU来负责。

2、kvm核心基础功能

  1. 内存管理
  2. 存储
  3. cpu
  4. 网络
  5. 显示

3、kvm管理功能

它们一般对qemu-kvm命令进行封装和功能增强,提供更友好的用户交互接口。基于libvirt API, openstack提供一个模块化的web用户界面。libvirt API为其他虚拟化管理工具提供一套通用的API管理包括qemu/kvm的多种Hypervisor.

4、kvm性能测试以及参考数据

  1. 内存性能测试
    1. 磁盘I/O性能测试
    2. cpu性能测试
    3. 网络性能测试
2014-11-11 21:24:23 dapao123456789 阅读数 9557
入门级书籍——一种KVM,Qemu的使用手册

转载请说明出处。

   
全书一共9章:
        第1章介绍了云计算和虚拟化的概念,并对KVM等几种流行的虚拟化技术做了比较;
        第2章介绍了KVM的基本架构、QEMU的作用以 及Intel的硬件虚拟化技术;
        第3章详细讲解了KVM依赖的硬件环境配置,编译和安装KVM和QEMU的步骤与方法,以及KVM客户机的启动;
        第4章深 入讲解了KVM的基础功能,包括虚拟的CPU、内存、存储、网络、图形显示等的配置和基本原理,以及CPU和内存的过载使用;    
        第5章讲解了KVM的高级功 能,包括半虚拟化驱动virtio、设备直接分配VT-d、热插拔、动态迁移、嵌套虚拟化、KSM、透明大页、KVM安全技术、QEMU监控器、QEMU 命令行参数以及从物理机或其他虚拟机迁移到KVM的方法;
        第6章介绍了管理KVM虚拟化的上层软件;
        第7章介绍了RHEL等所有流行的Linux发行版中 的KVM虚拟化功能的使用;
        第8章首先介绍了虚拟化性能测试,然后详细介绍了对KVM虚拟化的CPU、内存、网络、磁盘I/O等重要组件进行性能测试的方 法、工具和步骤;
        第9章介绍了Linux、KVM、QEMU等开源社区的情况,KVM、QEMU和KVM单元测试代码的基本结构,以及如何向 QEMU/KVM开源社区贡献自己的代码和如何提交KVM相关的bug。

目录


前言

第1章 虚拟化与云计算
1.1 云计算概念
1.1.1 发展历史和现状
1.1.2 概念
1.1.3 云计算模式:SaaS,PaaS,IaaS


1.2 云计算技术
1.2.1 Map/Reduce
1.2.2 资源管理平台,CloudStack,VMware,OpenStack
1.2.3 虚拟化


1.3 虚拟化技术
1.3.1 软件虚拟化和硬件虚拟化(软件虚拟化Qemu,硬件VMM)
1.3.2 准虚拟化与全虚拟化(准Xen)
1.4 KVM简介
1.4.1 KVM的历史——内核虚拟机
1.4.2 KVM功能概览,基本架构,内存管理,存储,设备驱动程序,性能简介
1.4.3 KVM的前景
1.5 Xen简介
1.5.1 Xen的历史——架构简介,微内核
1.5.2 Xen功能概览
1.5.3 Xen的前景


1.6 其他虚拟化方案简介
1.6.1 VMware
1.6.2 VirtualBox
1.6.3 Hyper-V
1.7 本章小结
1.8 本章注释





第2章 KVM原理简介
2.1 Linux操作系统简介——微内核(Xen)和单内核(KVM)设计
2.2 虚拟化模型,(底层是物理机,上层是一个虚拟机监控器(VMM,Hypervisor),非操作系统,上层为真正的虚拟机OS)
2.3 KVM架构

      类型一:虚拟机监控器,Xen,VMWare ESX/ESXi  , Hyper-V

      类型二:虚拟机监控程序,KVM ,VMware Workstation,VirtualBox,为单内核结构

2.4 KVM模块

    CPU虚拟化,内存虚拟化,浅

2.5 QEMU设备模型
2.6 Intel虚拟化技术
2.7 本章小结





第3章 构建KVM环境
3.1 硬件系统的配置,在BIOS中开启VT和VT-d
3.2 安装宿主机Linux系统
3.3 编译和安装KVM——内核空间KVM模块
          下载KVM源代码,配置KVM(配置命令),编译KVM,安装KVM
3.4 编译和安装qemu-kvm——用户空间的KVM模块

          下载qemu-kvm源代码,配置和编译qemu-kvm(make -j 10),安装qemu-kvm
3.5 安装客户机
3.6 启动第一个KVM客户机
3.7 本章小结
3.8 本章注释和参考阅读





第4章 KVM核心基础功能
4.1 硬件平台和软件版本说明
4.2 CPU配置
4.2.1 vCPU的概念,KVM的三种模式相互切换,切换图
4.2.2 SMP的支持,参考cpu-info.sh,/proc/cpuinfo文件查看系统cpu,多核心,超线程等情况

     qemu-system-x86_64 -smp(或不加) 8  其他参数   /*.img
4.2.3 CPU过载使用

         利用客户机使用物理CPU时间差异,保证物理CPU一直处在最大状态,如果8核物理机,开3个客户机都是8核的,但3个客户机运行的时间不一样,一个早上,一个下午,一个晚上。

4.2.4 CPU模型

      qemu64,kvm64,等

      好处:便于迁移,兼容等问题

4.2.5 进程的处理器亲和性和vCPU的绑定(**)

      一个进程在前一个时间片是在CPUM上,但是在后一个时间片是在CPUN上,

      亲和性是指:将进程绑定到指定的一个或多个CPU上,而不允许将进程调度到其他进程上。

      每个vCPU是宿主机上的一个普通的Qemu进程,使用taskset工具,设置处理器的亲和性,将某个vCPU绑定到某个或几个固定的cpu上去调度。

      测试步骤:

        1)启动宿主机时,在linux内核上加上“isolcpus="参数,实现cpu的隔离,从宿主机中隔离出几个cpu供客户机使用;

        2)启动2个客户机,并实现vcpu和物理cpu的绑定。


4.3 内存配置
4.3.1 内存设置基本参数

    1)qemu-system-x86_64 rhe16u3.img

    2)客户机中,free -m  ,查看内核使用的情况

                         dmesg


4.3.2 EPT和VPID简介

    客户机虚拟地址GVA——>客户机物理地址GPA转换,通过客户机操作系统实现

    客户机物理地址GPA——>宿主机物理地址HPA转换,通过Hypervisor实现

   

    影子页表,软件实现GVA——>HPA的转换过程,后来引入EPT,硬件实现GVA——GPA——HPA的转换。

    VPID,虚拟处理器标识,在硬件上为每个TLB项增加一个标识,用于区分不同的虚拟处理器的地址空间。

4.3.3 大页(Huge Page)

    4KB的内存页——>2MB的内存页,减少了内存页的数量,提高了缓存命中率,这是一种提高性能的技术手段。
4.3.4 内存过载使用

    内存不足,解决方案

    1)内存交换,和交换分区来交换,openstack目测使用的就是这种方式。

            性能较差,要求(物理内存空间+交换空间大小总和)>所有客户机的内存总和。

            举例:64个内存1G的客户机,32G内存的物理机,如何分区,其中宿主机维持自身进程占用资源4G。

                   客户机要求的交换分区总和   64x1G+4G-32G=36G.

                   安装redhat建议,32G的物理内存,建议使用8G的交换分区。

                   故而,在宿主机中使用 44GB(36GB+8GB)的交换分区来满足安全使用内存过载问题。

    2)气球(ballooning技术),通过virio_balloon驱动来实现宿主机和客户机之间的协作。网易的openstack实践中好像就是用这种。

    3)页共享(page sharing),通过KSM合并多个客户机进程使用相同的内存页。
4.4 存储配置
4.4.1 存储配置和启动顺序

         1)qumu-kvm参数      -hda file    /  -hdb file  / ... /  -fdb  file  ; -driver参数

         2)客户机的启动顺序:即类似Bios中系统引导顺序

         3)举例

4.4.2 qemu-img命令

        1)qemu-img check rhe16.img 检查镜像文件;

        2)qemu-img create -f qcow2 -o ? temp.cow

        3)  qemu-img convertmy -o qcow2 rhe16.img rhe16-1.gcow2

        4)  qemu-img info rhe16.img

        5)  snapshot  /rebase /resize  
4.4.3 QEMU支持的镜像文件格式

        1)raw——原始格式,一次性占用磁盘空间。

        2)qcow2——支持稀疏文件和加密、压缩。qcow——老版本,支持后端镜像和加密

        3)sheepdog——为KVM虚拟化提供块存储,单点无故障,淘宝贡献较多。

        4)clinder——openstack镜像块存储。

4.4.4 客户机存储方式

        1)物理磁盘或磁盘分区;

        2)LVM

        3)分布式文件系统,NFS,iSCSI,GFS2

4.5 网络配置

        1)QEMU支持的网络模式——virtio类型
        A.使用网桥模式,通过linux-bridge来实现。此部分可以实际参考。

        B.使用NAT模式——此部分可以参考,讲的不错。

                dnsmasq,宿主机中运行的DHCP工具,给宿主机分配NAT内网的IP地址。基本架构图。

                bridge-util 管理linux-brige的工具

                iptables 对内核中IPv4包过滤工具和NAT管理工具。
        C.QEMU内部的用户模式网络

                Qeum自身实现的网络管理,性能差,不常用。
        D.其他网络选项


4.6 图形显示
4.6.1 SDL的使用
4.6.2 VNC的使用
4.6.3 VNC显示中的鼠标偏移
4.6.4 非图形模式
4.6.5 显示相关的其他选项
4.7 本章小结
4.8 本章注释和参考阅读



第5章 KVM高级功能详解
5.1 半虚拟化驱动
5.1.1 virtio概述(Qemu模拟I/O设备的基本原理和优缺点,virtio的基本原理和优缺点
5.1.2 安装virtio驱动(Linux、Windows中virtion驱动程序的安装、使用)
5.1.3 使用virtio_balloon(1.ballooning简介;2.KVM中balloning的原理及优劣势;3.KVM中ballooning使用示例;4.通过ballooning过载使用内存)
5.1.4 使用virtio_net(半虚拟化网络设备--1.配置和使用;2.宿主机中的TSO和GSO设置;3.用vhost_net后端驱动)
5.1.5 使用virtio_blk(使用virtio API为客户机提供访问块设备的IO方法)
5.1.6 kvm_clock配置(半虚拟化时钟,为客户机提供精准的System time和Wall time)
5.2 设备直接分配(VT-d)
5.2.1 VT-d概述

     Emulated device: QEMU纯软件模拟的设备

     Virtio device:实现virtio API的半虚拟化驱动的设备

     PCI device assignment:PCI设备直接分配(VT-d)

5.2.2 VT-d环境配置

     (1.硬件支持和BIOS设置;2.宿主机内核的配置;3.在宿主机中隐藏设备;4.通过Qemu命令行分配设备给客户机)
5.2.3 VT-d操作示例

      (1.网卡直接分配;2.硬盘直接分配;3.USB直接配置;4.VGA显卡直接分配)
5.2.4 SR-IOV技术——多个虚拟机共享一个物理设备资源,达到设备直接分配的性能。

      (1.SR-IOV概述,物理功能,虚拟功能)

      (2.SR-IOV操作示例)

      (3.SR-IOV使用问题解析)


5.3 热插拔——电脑运行时(不关闭电源)插上或拔除硬件
5.3.1 PCI设备热插拔
5.3.2 PCI设备热插拔示例(1.网卡的热插拔;2.USB的热插拔;3.SATA硬盘的热插拔)
5.3.3 CPU和内存的热插拔


5.4 动态迁移
5.4.1 动态迁移的概念

      (迁移概念,静态迁移,动态迁移。)
5.4.2 动态迁移的效率和应用场景

       (衡量条件:整体迁移时间,服务器停机时间,对服务器性能的影响)
5.4.3 KVM动态迁移原理和实践

       (先迁移内存、后迁移配置;KVM动态迁移应该注意的事项,在KVM上具体进行的操作步骤)
5.4.4 VT-d/SR-IOV的动态迁移


5.5 嵌套虚拟化
5.5.1 嵌套虚拟化的基本概念(Xen On Xen和KVM On Xen,VMware on VMware 和KVM on KVM等等)
5.5.2 KVM嵌套KVM(主要步骤)


5.6 KSM技术—写实复制。
5.6.1 KSM基本原理—内核同页合并。

    KSM允许内核在两个或多个进程(包括虚拟机客户机)之间共享完全相同的内存页。
5.6.2 KSM操作实践

    配置文件
5.7 KVM其他特性简介
    5.7.1 1GB大页

       (2MB->1GB,减少内存页表数量,提高TLB缓存的效率,从而提高了系统的内存访问性能。

         1GB大页的使用步骤)
    5.7.2 透明大页

        (提高系统内存的使用效率和性能。

          使用透明大页的步骤)

5.7.3 AVX和XSAVE——高级矢量扩展。
5.7.4 AES新指令——指令的配置、测试
5.7.5 完全暴露宿主机CPU特性——CPU模型特性、CPU信息查看。
5.8 KVM安全
5.8.1 SMEP—安全渗透,监督模式执行保护
5.8.2 控制客户机的资源使用-cgroups—linux内核中的一个特性,用于限制、记录和隔离进程组对系统物理资源的使用。

       cgroups的功能—资源限制,优先级控制,记录,隔离,控制。

       cgroups子系统。

       cgroups操作示例:通过cgroups的blkio子系统来设置2个客户机对磁盘I/O读写的优先级。
5.8.3 SELinux和sVirt

       SELinux—linux内核中的安全访问体系(MAC,强制访问控制模式),为每一个应用程序提供一个“沙箱”,只允许应用程序执行它设计需要的且在安全策略中明确允许的任务,对每个应用程序只分配它正常工作所需要的对应权限。

       sVirt—对虚拟化客户机使用强制访问控制来提高安全性,阻止因为Hypervisor的bug而导致的从一台客户机向宿主机或其他服务器的攻击。

       SELinux和sVirt的配置和操作示例。
5.8.4 可信任启动-Tboot

       TXT—在PC或服务器系统启动是对系统关键部位进行验证的硬件解决方案。

       TBoot—可信启动,是使用TXT技术在内核或Hypervisor启动之前的一个软件模块,用于度量和验证操作系统或Hypervisor的启动过程。

       使用TBoot的示例。
5.8.5 其他安全策略

       1.镜像文件加密

       2.虚拟网络的安全

       3.远程管理的安全

       4.普通Linux系统的安全准则


5.9 QEMU监控器
5.9.1 QEMU monitor的切换和配置

5.9.2 常用命令介绍

      help,info,info version ,info ,commit,cont,change,balloon,cup index,log,sendkey keys,x和xp,p或print fmt expt
5.10 qemu-kvm命令行参数

      qemu-system-x86_64[options] [disk_images]

      cpu的相关参数—-cpu参数,-smp参数

      磁盘相关的参数

      网络相关的参数

      图形显示相关的参数

      Vt-d和SR-IOV相关参数

      动态迁移的参数

      已用过的其他参数
5.10.1 回顾已用过的参数
5.10.2 其他常用参数


5.11 迁移到KVM虚拟化环境
5.11.1 virt-v2v工具介绍—将虚拟客户机从一些Hypervisor(也包括KVM自身)迁移到KVM环境中去。
5.11.2 从Xen迁移到KVM

      virt-v2v-ic xen+ssh://root@xen0.demo.com -os pool -b brnamevm-name
5.11.3 从VMware迁移到KVM

      virt-v2v-ic esx://esx.demo.com/ -os pool --bridege brame vm-name
5.11.4 从VirtualBox迁移到KVM

      virt-v2v -ic vbox+ssh://root@vbox.demo.com -os pool -b bramevm-name
5.11.5 从物理机迁移到KVM虚拟化环境(P2V)

      
5.12 本章小结
5.13 注释和参考阅读





第6章 KVM管理工具
6.1 libvirt
6.1.1 libvirt简介

   对KVM虚拟机进行管理的工具和应用程序接口、守护进程和管理工具。

   libvirt目标、交互框架、支持的虚拟机、主要的功能、支持的语言、主要进程

6.1.2 libvirt的编译、安装和配置
6.1.3 libvirt和libvirtd的配置

  /etc/libvirt/libvirt.conf——用来配置一些常用libvirt连接(通常是远程连接的)别名

  /etc/libvirt/libvirtd.conf——libvirt的守护进程libvirtd的配置文件,是一些启动设置,包括打开TCP连接、设置TCP监听端口、TCP连接认证授权方式、设置UNIX domain的保存目录等。

  /etc/libvirt/qemu.conf——对Qeum的驱动的配置文件

  /etc/libvirt/qume/目录/——存放的是使用Qume驱动域的配置文件

  libvirtd——是libvirt虚拟化管理工具的服务器端的守护进程。(要让某个节点能够使用libvirt进行管理,都需要在这个节点上安装该守护进程) libvirt的客户端程序包括——virsh,virt-manager。

  libvirtd的常见命令行。
6.1.4 libvirt域的XML配置文件

    Libvirt对虚拟机管理,实质是基于xml文件作为配置文件。

    客户机的XML文件,其中CPU配置(vcpu、cpuset,vcpupin),内存的配置(memory),客户机系统类型及其启动顺序,网络的配置(桥接方式,NAT方式,用户模式网络的设置,网卡设备直接分配(VT-d),存储的配置,域的配置,QEMU模拟器的配置,图形显示的方式,客户机声卡和显卡的配置,PCI控制器

6.1.5 libvirt API简介

    连接Hypervisor相关API:以virConnect开头的一系列操作,

        连接函数 virConnectOpen,virConnectOpenReadOnly,virConncetOpenAuth

        交互:virConectGetCapabilities,virConnectListDomains

        关闭操作:virConnectClose

    域管理的API:以virDomain开头的一系列函数

        获取域对象:virDomainPtrvirDomainLookupByID,virDomainPtrvirDomainLookupByID

        查询域信息,控制域的生命周期

    节点管理的API:以virNode开头的一系列函数

        获取各种资源信息:virNodeGetInof,virNodeGEtCPUStatus,virNodeGetMemoryStats,virNodeGetFreeMemory,virNodeSuspendForDuration

    网络管理的API:以virNetwork开头的和virInterface开头的

    存储卷管理的API:以virStorageVol开头的一系列函数

    存储池管理的API:以virStroagePool开头的一系列函数

    事件管理API:以virEvent开头的一系列函数

    数据流管理的API:以virStream开头的一系列函数

6.1.6 建立到Hypervisor的连接

    CS架构,服务器端运行Hypervisor,其上需要Libvirtd这个守护进程,科幻段连接到Libvirtd从而进行管理操作。

    本地URI——客户端使用本地URL用于连接本系统范围内的Hypervisor;

    远程URI

    使用URI   virsh -c qemu:///system

              virsh -c qemu+ssh://root@192.168.158.31/system


6.1.7 libvirt API使用示例

     使用C API连接客户机,查询域信息

     使用python API连接客户机,查询域信息


6.2 virsh

6.2.1 virsh简介

      管理虚拟化环境中的客户机和Hypervisor的命令行工具,客户端连接程序。两种工作模式,交互模式和非交互模式。
6.2.2 virsh常用命令

      域管理命令(list,dominfo,domid,....)

      宿主机和Hypervisor的管理(version,sysinfo,nodeinfo,...)

      网络管理命令(iface-list,iface-name,net-list,net-edit,...)

      存储池和存储卷的管理命令(pool-list,pool-info<pool-name>,...)
6.3 virt-manager

6.3.1 virt-manager简介

      管理虚拟机的图形化的桌面用户接口
6.3.2 virt-manager编译和安装

6.3.3 virt-manager使用

      1.打开virt-manager

      2.创建、启动、暂停、关闭一个客户机;

      3.连接到本地和远程的Hypervisor

      4.查看和修改客户机的详细配置

      5.动态迁移

      6.性能统计图像界面,可以统计客户机CPU利用率、客户机磁盘IO,客户机网络IO等

6.4 virt-viewer、virt-install和virt-top
6.4.1 virt-viewer——用于与虚拟化客户机的图形显示的轻量级的交行接口工具。
6.4.2 virt-install——为virt-manager的图形界面和创建客户机提供安装系统的API。
6.4.3 virt-top——用于展示虚拟化客户机状态和资源利用率的工具。


6.5 OpenStack云计算平台
6.5.1 OpenStack简介
6.5.2 使用DevStack安装和配置OpenStack开发环境
6.5.3 在OpenStack中使用KVM
6.6 本章小结
6.7 本章注释和参考阅读




第7章 Linux发行版中的KVM
7.1 RHEL和Fedora中的KVM
7.1.1 Red Hat、RHEL、Fedora和CentOS简介
7.1.2 RHEL中的KVM
7.1.3 Fedora中的KVM
7.2 SLES和openSUSE中的KVM
7.2.1 SLES中的KVM
7.2.2 openSUSE中的KVM
7.3 Ubuntu中的KVM
7.4 本章小结
7.5 本章注释和参考阅读




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

虚拟化方案——功能和性能;功能是实现虚拟化的基础,性能是虚拟化效率的关键指标。评价一个系统的性能指标:

 响应时间:客户端发出请求到响应的整个过程所花费的时间

 吞吐量:指在一次性能测试过程中网络上传输的数据量的总和。

 并发用户数:指在使用一个系统服务的用户数量

 资源占用率:使用某个服务时,客户端和服务器占用资源的情况。

     CPU密集型:科学计算;网络IO秘籍型:web服务;磁盘IO密集型:数据库服务;内存密集型:缓存服务


8.1 虚拟化性能测试简介


8.2 CPU性能测试
8.2.1 CPU性能测试工具

   SPECCPU2006

   SPECjbb2005:评估服务器端Java应用性能的基准测试程序

   UnixBench:类Unix系统提供的基础的衡量指标

   SysBench:系统在模拟高压力数据库应用中的性能

   PCMark:针对一个计算机系统整体及其部件进行性能评估的基准测试工具。

   内核编译:CPU密集型、也可是内存密集型

   Super PI:典型的计算CPU密集型基准测试工具。

8.2.2 测试环境配置

   宿主机、客户机软硬件环境,内核选项配置情况

8.2.3 性能测试方法

   SPEC CPU2006测试安装

   内核编译

   Super PI
8.2.4 性能测试数据


8.3 内存性能测试
8.3.1 内存性能测试工具

     LMbench——评价系统综合性能的良好工具。

     Memtest86++——内存检测工具

     STREAM——衡量系统运行一些简单矢量计算内核是能达到的最大内存带宽和相应的计算速度。
8.3.2 测试环境配置
8.3.3 性能测试方法

     LMbench——评估KVM内存虚拟机性能。会生成一个系统测试文档和测试结果报告
8.3.4 性能测试数据

8.4 网络性能测试
8.4.1 网络性能测试工具

     Netperf——网络性能测试工具,可以测试多个方面。

     Iperf——常用的网络测试工具

     NETIO——使用不同大小的数据包来测试TCP和UDP网络连接的吞吐量。

     SCP——最常用的远程文件复制工具。

8.4.2 测试环境配置

     注意网卡配置,使用默认的rt181139模式的网桥网络、使用virtio-net(QEMU做后端驱动)的网桥网络,使用virtio-net模式的网桥网络,

     VT-d直接分配PF,SR-IOV直接分配VF
8.4.3 性能测试方法

     Netperf

     SCP
8.4.4 性能测试数据

     不同配置下的Netperf测试数据;不同配置下的SCP测试数据

     结论:

       配置对比:virtio、VT-d和SR-IOV模式,可以达到和原生系统网络差不多的性能;在达到相同带宽的情况下,VT-d和SR-IOV方式占用的CPU资源比virtio略少;纯软件模拟的rt181139和e1000网卡的性能较差。


8.5 磁盘I/O性能测试
8.5.1 磁盘I/O性能测试工具

  DD——文件复制工具;

  IOzone——通过对多种文件进行操作,来衡量一个文件系统的性能。

  Bonnie++——可以模拟数据库去访问一个单一的大文件

  hdparm——获取和设置SATA和IDE设备的参数工具,粗略的测试磁盘IO的性能。

8.5.2 测试环境配置

  使用纯软件模拟IDE磁盘和使用virtio-blk驱动的磁盘。
8.5.3 性能测试方法

  DD、IOZone、Bonnie++
8.5.4 性能测试数据
8.6 本章小结
8.7 本章注释和参考阅读




第9章 参与KVM开源社区

9.1 开源社区介绍
9.1.1 Linux开源社区

     Linux内核代码维护层次结构
9.1.2 KVM开源社区

     KVM Forum,http://www.linux-kvm.org/page/KVM_Forum
9.1.3 QEMU开源社区

     Qume:  http://git.qemu.org/    
9.1.4 其他开源社区

     Libvirt 一个虚拟化API项目   www.libvirt.org

     OpenStack  www.openstack.org

     CloudStack cloudstack.apache.org

     Xen        www.xen.org

     Apache     httpd.apache.org

     Nginx      www.nginx.org

     Hadoop     hadoop.apache.org 

9.2 代码结构简介
9.2.1 KVM代码   

     kvm框架核心代码  位于目录 virt/kvm/下

     与硬件架构相关的代码,位于  arch/*/kvm
9.2.2 QEMU代码

     QEMU代码实现了对PC客户机的完全模拟。

     QEMU配合KVM启动一个客户机的流程。先打开 /dev/kvm设备,通过名为 KVM_CREATE_VM的IOCTL调用来创建一个虚拟机对象,然后通过KVM_CREATE_VCPU为虚拟机创建vcpu对象,最后通过 KVM_RUN 让vCPU 运行起来。这个抽象后的简化过程如下:

     main(): vl.c

     configure_accelerator():vl.c -> kvm_init(): kvm_all.c

     machine->init():vl.c            qemu_open("/dev/kvm"):kvm_all.c

     pc_init_pci():pc_piix.c         kvm_ioctl(KVM_CREATE_VM):kvm_all.c

     pc_init1():hw/i386/pc_piix.c

     pc_nex_cpu():hw/i386/pc.c

     ...

     qemu_init_vcpu():cpu.c

     qemu_kvm_start_vcpu():cpu.c

     qemu_thread_create():util/qemu-thread-posix.c

     pthread_create():#create vCPU thread

     qume_kvm_cpu_thread_fn(): cpu.c

     kvm_init_vcpu:kvm-all.c

     kvm_vm_ioctl(KVM_CREATE_VCPU)


9.2.3 KVM单元测试代码

     基本原理:将编译好的轻量级测试内核镜像(*.flat文件)作为支持多重启动的QEMU的客户机内核镜像来启动,测试使用一个通过客户机BIOS来调用的基础架构,该基础架构将会主要初始化客户机系统(包括CPU等),然后切换到长模式(x86_64 CPU架构的一种运行模式)并调用各个具体测试用例的主函数从而执行测试,在测试完成QEMU进程自动退出。

9.2.4 KVM Autotest代码

     
9.3 向开源社区贡献代码
9.3.1 开发者邮件列表
9.3.2 代码风格

     缩进;长的行和字符串打乱(每一行的长度不要超过80个词);大括号的位置;空格的使用;
9.3.3 生成patch

     patch:添加的新功能或者修复某个bug的代码。

     使用diff工具或git工具可以生成patch

      diff -urN kvm.git/ kvm-my.git/ >my.patch

      git add virt/kvm/kvm_main.c
9.3.4 检查patch

      使用脚步检查patch是否合规: scripts/checkpatch.pl

9.3.5 提交patch
9.4 提交KVM相关的bug
9.4.1 通过邮件列表提交bug
9.4.2 使用bug管理系统提交bug
9.4.3 使用二分法定位bug
9.5 本章小结
9.6 本章注释和参考阅读

2016-10-18 21:39:25 nirendao 阅读数 3394

第一章和第二章

第一章 虚拟化和云计算

Saas(软件即服务):将已经部署好的软件作为一种服务来提供,比如:Google Docs, Google Apps
Paas(平台即服务):将开发环境作为一种服务来提供。
Iaas(基础设施即服务):将多台服务器组成的“云端”基础设施作为计量服务提供给客户。

软件虚拟化:

利用纯软件的方法在现有的物理平台上(往往并不支持硬件虚拟化)实现对物理平台访问的截获和模拟。
常见的软件虚拟机如QEMU,它是通过纯软件来仿真x86平台处理器的取指、解码和执行,客户机的指令并不在物理 平台上直接执行。
由于所有指令都是软件模拟的,因此性能往往比较差,但是可以在同一平台上模拟不同架构平台的虚拟机。

VMware的软件虚拟化使用了动态二进制翻译技术。虚拟机监控机(VMM)在可控制的范围内,允许客户机的指令在物理平台上直接运行。但是,客户机指令在运行前会被虚拟机监控机扫描,其中突破虚拟机监控机限制的指令会被动态替换为可以在物理平台上直接运行的安全指令,或者替换为对虚拟机监控机的软件调用。优点是比纯软件模拟性能有大幅提升,缺点是失去了跨平台虚拟化的能力。

硬件虚拟化:

物理平台本身提供对特殊指令的截获和重定向的支持;甚至新的硬件会提供额外的资源来帮助软件实现对关键硬件资源的虚拟化,从而提升性能。

以x86平台的虚拟化为例,支持虚拟技术的x86 CPU 带有特别优化过的指令集来控制虚拟过程,通过这些指令集,VMM很容易将客户机置于一种受限制的模式下运行,一旦客户机试图访问物理资源,硬件会暂停客户机的运行,将控制权交回给VMM处理。VMM可以将客户机在受限模式下对一些特殊资源的访问完全由硬件重定向到VMM指定的虚拟资源。整个过程不需要暂停客户机的运行和VMM软件的参与。

由于虚拟化硬件可提供全新的架构,支持操作系统直接在其上运行,无需进行二进制转码,减少了相关的性能开销,极大简化了VMM的设计,进而使得VMM能够按照通用标准进行编写,性能更加强大。

准虚拟化:

改动客户机操作系统,使它以为自己运行在虚拟环境下,能够同虚拟机监控机协同工作。所以,准虚拟化需要修改客户机的操作系统的源代码来实现主动通知。

Xen是准虚拟化的一个例子,它适用于Linux这样的开源操作系统,而不适合于Windows这样的闭源操作系统。

全虚拟化:

支持运行任何理论上可在真实物理平台上运行的操作系统。不需要对客户机操作系统进行任何修改。

KVM

KVM的开发人员并不是从底层开始新写一个Hypervisor,而是选择了基于Linux Kernel,通过加载新的模块而使Linux Kernel变身成为一个Hypervisor.
KVM目前设计为通过可加载的内核模块,支持广泛的客户机操作系统,包括Windows.

在KVM架构中,虚拟机实现为常规的Linux进程,由标准Linux调度程序进行调度。事实上,每个虚拟CPU实现为一个常规的Linux进程。这使得KVM可以享受Linux内核的所有功能。

KVM本身不执行任何模拟,需要用户空间程序通过/dev/kvm接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的I/O,并将它的视频显示映射回宿主的显示屏。这个应用程序(注:上述的“用户空间程序”)就是大名鼎鼎的QEMU.

REHL6.x系统中的一个KVM客户机可以支持160个虚拟CPU和多达2TB的内存,KVM宿主机支持4096个CPU核心和多达64TB的内存。


第二章 KVM原理简介

操作系统内核设计分为:微内核和单内核。

单内核指的是整个内核从整体上作为一个单独的大过程来实现,并且同时运行在一个单独的地址空间内。所有的内核服务都在这样一个大的内核空间运行,内核之间的通信可以简单地实现为函数调用。

对于微内核来说,内核的功能被划分为多个独立的过程,每一个过程叫做一个服务器。多个服务器都运行在自己的地址空间,只有少量核心的服务器运行在特权模式下,服务器之间的通信采用了进程间通信机制。独立的服务器进程提高系统的健壮性,但是进程间通信由于涉及内核空间和用户空间的上下文切换,其开销比函数调用大得多。

Linux采用实用主义的设计:Linux内核被设计成单内核以满足性能要求;但同时,Linux内核还具有模块化设计和动态装载内核模块的能力。除了诸如进程切换、内存管理等核心内核功能,将大部分内核功能作为单独的内核模块设计并实现。这些内核模块编译好后以单独的二进制文件的形式存在,内核在运行过程中,按照需求,动态地加载并链接进入内核空间运行。不使用的模块还可以在运行过程中动态卸载。这样的设计,既保证了内核的性能,也改进了传统单内核设计的灵活性。
KVM就是以内核模块的形式存在,为Linux内核增加了虚拟化的功能。

从虚拟机的基本架构来区分,分为2种:类型一和类型二。
类型一:
系统上电之后首先加载运行虚拟机监控程序,而传统的操作系统则是运行在其创建的虚拟机中。
类型一的虚拟机监控程序,可以视为一个特别为虚拟机而优化裁剪的操作系统内核。
著名的开源虚拟化软件Xen、商业软件VMware ESX/ESXi 和微软的Hyper-V就是类型一的代表。

类型二:
在系统上电之后仍然运行一般意义的操作系统(也就是俗称的宿主机操作系统),虚拟机监控程序作为特殊的应用程序,可以是为操作系统功能的扩展。
对于类型二虚拟机来说,最大的优势在于可以充分利用现有的操作系统;但也会受到宿主机操作系统的一些限制。
KVM、VMware Workstation、VirtualBox就是属于类型二虚拟机。

KVM模块

P38-39

KVM模块的主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
KVM仅支持硬件虚拟化。

以KVM在Intel公司的CPU上运行为例:
1. 在内核被加载的时候,KVM模块会先初始化内部的数据结构;
2. 做好准备之后,KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关;
3. 通过执行VMXON指令将宿主操作系统(包括KVM模块本身)置于虚拟化模式的根模式;
4. 最后,KVM模块创建特殊设备文件 /dev/kvm 并等待来自用户空间的命令;
5. 接下来,虚拟机的创建和运行将是一个用户空间应用程序(QEMU)和KVM模块相互配合的过程。

KVM模块和用户空间QEMU的通信接口主要是一系列针对特殊设备文件的IOCTL调用。
KVM模块加载之初,只存在 /dev/kvm 文件,而针对该文件的最重要的IOCTL调用就是“创建虚拟机”,其可以被理解为KVM为了某个特定的虚拟客户机(用户空间程序创建并初始化)创建对应的内核数据结构。同时,KVM还会返回一个文件句柄来代表所创建的虚拟机。

针对虚拟处理器最重要的IOCTL调用就是“执行虚拟处理器”。通过它,用户空间准备好的虚拟机在KVM模块的支持下,被置于虚拟化模式的非根模式下,开始执行二进制指令。在非根模式下,所有敏感的二进制指令都会被处理器捕捉到,处理器在保存现场之后,自动切换到根模式,由KVM决定如何进一步处理(要么由KVM模块直接处理,要么返回用户空间交由用户空间程序处理)。

除了处理器的虚拟化,内存虚拟化也是由KVM模块实现的。实际上,这一部分是一个虚拟机实现代码中代码量最大、实现最复杂的部分(至少在硬件支持二维地址翻译之前是这样的)。

处理器对设备的访问主要是通过IO指令和MMIO,其中IO指令会被处理器直接截获,MMIO会通过配置内存虚拟化来捕捉。但是,外设的模拟一般并不由KVM模块负责。一般来说,只有对性能要求比较高的虚拟设备才会由KVM内核模块来直接负责,比如虚拟中断控制器和虚拟时钟。大部分输入输出设备还是会交给用户态程序QEMU负责。

QEMU设备模型

QEMU本身并不是KVM的一部分,其自身就是一个著名的开源虚拟机软件。它是一个纯软件的实现,所以性能低下。

为了简化开发和代码重用,KVM在QEMU的基础上进行了修改。在虚拟机运行期间,QEMU会通过KVM模块提供的系统调用计入内核,由KVM模块负责将虚拟机置于处理器的特殊模式运行。遇到虚拟机进行输入输出操作,KVM模块会从上次的系统调用出口处返回QEMU,有QEMU来负责解析和模拟这些设备。

2013-11-12 09:23:17 lihang421 阅读数 975

kvm虚拟化技术:实战与原理解析


在具体内容上,本书不仅系统介绍了 KVM虚拟机的功能、特性和使用方 法,而且还深入地剖析了 KVM虚拟机的核心技术和工作原理,对 KVM做了全面而透彻的讲解。


对其内容详细阅读

2018-11-01 16:30:25 dongfei2033 阅读数 508

1、软件虚拟化和硬件虚拟化:实现虚拟化的重要一步在于:虚拟化层必须能够截获计算元件对物理资源的直接访问,并将其重定向到虚拟资源池中。硬件虚拟化,就是物理平台本身提供了对特殊指令的截获和重定向的硬件支持

2、准虚拟化与全虚拟化:改动客户操作系统,使他以为自己运行在虚拟环境下,能够与虚拟机监控协同工作叫做准虚拟化,准虚拟化弱化了对虚拟机特殊指令的被动截获要求,需要修改客户机操作系统的源代码实现主动通知

3、内存管理:内存页面共享通过一项名为内核同页合并ksm)的内核功能来支持。KSM扫描每个虚拟机的内存,如果虚拟机拥有相同的内存页面,将它合并到一个在虚拟机之间共享的页面,仅存一个副本。如果一个客户机尝试更改这个共享页面,他讲得到自己的专用副本

4、kvm的作用:kvm仅支持硬件虚拟化,他打开并初始化系统硬件以支持虚拟化的运行,在被内核加载的时候,kvm模块会先初始化内部的数据结构,检测当前的cpu,打开cpu控制寄存器的cr4中的虚拟化控制开关,执行VMXON指令将宿主操作系统置于虚拟化模式种的根模式,最后,kvm模块创建特殊设备/dev/kvm并等待来自用户空间的命令,接下来虚拟机的创建和运行将是一个用户空间的程序qemu与kvm配合交互过程

5、处理器中的内存管理单元(MMU)是通过页表的形式将程序运行的虚拟地址转换成为物理内存地址。在虚拟机模式下,内存管理单元的页表则必须在一次查询的时候完成俩次地址转换,客虚地址-->客物地址-->真物地址

解决方案:影子页表,客户机运行的时候,处理器使用的页表不是客户机操作系统维护的页表,而是kvm模块根据这个页表维护的另外一套影子页表,但他开销蛮大的,intel的EPT技术解决,即通过·引入第二级页表来描述客户机虚拟地址和真是物理地址的转换,硬件可以自动进行俩级转换生成正确的内存访问地址,kvm称二维分页机制 (影子:单层表;ERT:俩层表)

VPID:虚拟处理器标志,是在硬件上对TLB资源管理(tlb用于缓存页表)的优化,通过在硬件上为每个TLB项增加一个标志,用于不同虚拟处理器的地址空间,从而区分开hypervisor和不同处理器的TLB。

6、内存过载使用:内存交换swapping + 气球+页共享(ksm)

7、总的来说,内存访问密集型的应用,使用huge page 可以提高客户机性能,但注意大页内存不能被换出(swap out),也不能使用气球机制自动增长

8、buffer/cache:前者缓存超级块、inode信息,后者缓存文件信息;free命令显示的总内存是除去内核执行文件占用内存和一些系统保留的内存之后使用的内存 (buffer/cache),查内存用dmesg     

9、Cache写机制:Write-through与Write-back    http://witmax.cn/cache-writing-policies.html

             Write-through(直写模式)在数据更新时,同时写入缓存Cache和后端存储。此模式的优点是操作简单;缺点是因为数据修改需要同时写入存储,数据写入速度较慢.  Write-back(回写模式)在数据更新时只写入缓存Cache。只在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。此模式的优点是数据写入速度快,因为不需要写存储;缺点是一旦更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。  

10、半虚拟化驱动:virtio,i/o频繁时cpu过高;  qemu是全虚拟化模拟,vm频繁进出exit;VT-d是设备直接分配   。。。SR-IOV使网卡产生多个独立的虚拟网卡

没有更多推荐了,返回首页