在客户机看来其所拥有的cpu即是vcpu
在普通的linux系统中,进程一般有两种执行模式:内核模式和用户模式,而在KVM环境中,增加了第三种模式:客户模式
Vcpu在三种模式下不同分工:1.用户模式 主要处理IO的模拟和管理,由qemu的代码实现
2.内核模式:主要处理特别需要高性能和安全相关的指令,如处理客户模式到内核模式的转换,处理客户模式下的IO指令或其他特权指令引起的退出,处理影子内存管理
3.主要执行Guest中的大部分指令,IO和一些特权指令除外
kvm的内核部分是作为可动态加载内核模块运行在宿主机中的,其中一个模块是和硬件平台无关的实现虚拟化核心基础架构的kvm模块,另一个是硬件相关的kvm_intel或kvm_amd模块。 kvm中一个客户机是作为一个用户空间进程运行的,一个客户机的多VCPU就是qemu进程中的多个线程
SMP的支持:
SMP多处理结构,在一个计算机上汇集一组cpu。在SMP系统中,多个程序可以做到真正的并行执行。而且单个进程的多个线程也可以并行执行。
查看逻辑cpu个数
[root@baobao ~]# cat /proc/cpuinfo | grep "processor" |wc -l
实现客户机的smp
1.将不同的vcpu的进程交换执行
2.将在物理smp硬件系统上同时执行多个vcpu的进程
qemu-kvm -smp n
n 设置逻辑cpu数量
CPU过载使用
kvm允许客户机过载使用物理资源,允许客户机分配的cpu和内存数量多于物理上实际存在的资源
cpu模型
qemu/kvm 在默认情况下会向客户机提供一个qemu64或qemu32的基本cpu模型
linux对进程执行的调度采用时间片法则(即用完自己的时间片立即暂停执行)
cpu的绑定设置:将进程绑定到特定的一个或多个cpu上区执行 而不允许将进程调度到其他的cpu上,设置进程的处理器亲和性带来的好处是可以减少进程在多个cpu之间交换运行带来的缓存命中失效。
EPT和VPID简介
EPT(扩展页表)针对内存管理单元MMU的虚拟化扩展
客户机物理地址空间,这个地址空间不是真正的硬件上的地址空间,他们之间有一层映射。
即客户机应用程序可见的虚拟地址GVA到客户机物理地址GPA转换,再从客户机物理地址GPA到宿主机物理地址HPA的转换
前一个转换由客户机操作系统完成,后一个由kvm完成
影子页表是从软件上维护了从客户机虚拟地址GVA到宿主机物理地址HPA之间的映射 避免了2次地址转换 kvm 将影子页表载入到物理的内存管理单元MMU
intel的cpu提供的EPT技术(AMP的NPT) 直接在硬件上 进行地址的2次转换 降低了内存虚拟化实现的复杂度
vpid虚拟处理器标识 是在硬件上对TLB资源管理的优化,通过在硬件上为每个TLB项增加一个标识,用于不同的TLB的虚拟处理器的地址空间,从而能够区分开kvm和不同处理器的TLB
TLB:后备缓冲器是一个内存管理单元 用于改进 虚拟地址到 物理地址转换的速度的缓存
[root@baobao ~]# cat /sys/module/kvm_intel/parameters/ept
[root@baobao ~]# cat /sys/module/kvm_intel/parameters/vpid
大页
linux 2.6及以上支持大页 huge page ,如果使用了大页 内存页的数量会减少,从数量上需要更少的页表 从而提高页表所占用的内存数量。所需的地址转换也减少了,TLB缓存失效的次数也就减少了。另外由于地址转换的所需的信息保存在cpu的缓存中,大页的使用让地址转换信息减少,从而减少了cpu缓存的使用,减轻了cpu缓存的压力,让cpu缓存能更多的用于应用程序的数据缓存,也能整体提升系统的性能
检查默认的内存大小
[root@baobao ~]# getconf PAGESIZE
[root@baobao ~]# mount -t hugetlbfs hugetlbfs /dev/hugepages 挂载hugetlbfs文件系统
[root@baobao ~]# mount
/dev/sda3 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
vmware-vmblock on /var/run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/root/Desktop/rhel6u4.iso on /mnt/rhel6u4 type iso9660 (rw,loop=/dev/loop0)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/root/Desktop/rhel6u4.iso on /mnt type iso9660 (rw,loop=/dev/loop1)
hugetlbfs on /dev/hugepages type hugetlbfs (rw)
设置hugepage的数量
[root@baobao ~]# sysctl vm.nr_hugepages=1024
vm.nr_hugepages = 1024
[root@baobao ~]# cat /proc/meminfo
HugePages_Total: 236
HugePages_Free: 236
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
启动时 后面跟 -mem-path /dev/hugepages 来使用大页的内存
坏处:大页的内存不能被换出(swap out) 也不能使用ballooning方式自动增长
内存的过载使用
即kvm能够让分配给客户机的内存总数大于实际可用的物理内存总数
三种方式来实现内存的过载使用:
1.内存交换:用户交换空间来弥补内存的不足
2.气球:通过virio_ballon驱动来实现宿主机kvm和客户机之间的协作
3.页共享:通过KSM合并多个客户机进程使用的相同内存页
交换分区的大小设置举例:
某个服务器有32G的内存,想在其上运行64个内存为1G的客户机,在宿主机中,大约需要4GB大小的内存来满足系统进程,驱动,磁盘缓存及其他应用程序所需内存,计算过程如下:
客户机所需交换分区为:64*1+4-32=36
根据redhat建议,对于32G的物理内存推荐使用8G的交换分区,所以宿主机总共需要36+8=44G的交换分区来满足需要
qemu-kvm -M pc 虚拟系统类型pc
-localtime 使虚拟系统与宿主机系统时间一致
qemu支持的镜像文件格式
1.raw 这种格式的文件的优势在于它非常简单且非常容易移植到其他模拟器上去使用。
2.qcow2支持稀疏文件(即支持空洞)以节省存储空间,支持AES加密以提高镜像文件安全性,支持基于zlib的压缩,支持在一个镜像文件中有多个虚拟机快照。
客户机存储方式:
1.LVM
2.NFS
3.ISCSI
4.GFS2
使用文件来做镜像有很多优点
1.存储方便,在一个物理存储设备上可以存放多个镜像文件;
2.易用性,管理多个文化比管理多个磁盘,分区,逻辑分区等都要方便
3.可移动性,可以非常方便地将镜像文件移动到另外一个本地或远程的物理存储系统中去
4.可复制性,可以非常方便地将一个镜像文件复制或修改,从而供另外一个新的客户机使用
5.稀疏文件可以节省磁盘空间,仅占用实际写入过数据的空间
6.网络远程访问,镜像文件可以方便地存储在通过网络连接的远程文件系统中。
qemu支持的网络模式
主要有4中不同模式:
1.基于网桥的虚拟网卡
2.基于NAT的虚拟网络
3.qemu内置的用户模式网络
4.直接分配网络设备的网络
qemu内部的用户模式网络
qemu使用Slirp实现了一整套TCP/IP协议栈,并且使用这个协议栈实现了一套虚拟的NAT的网络
缺点:
1.由于其在qemu内部实现所有网络协议栈,因此其性能较差
2.不支持部分网络功能(ICMP),所以不能在客户机中使用ping 命令测试外网连通性
3.不能从宿主机或外部网络直接访问客户机。
#######################################################################
图形显示
SDL的使用
SDL是一个用C语言编写的,跨平台的,免费和开源的多媒体程序库,他提供了一个简单的接口用于操作硬件平台的图形显示,声音,输入设备等。qemu模拟器中的图形的显示默认就是使用SDL的,在rhel6.3中还需要SDL_devel这个rpm包的支持。
在配置qemu-kvm时加上 --disable-sdl的参数即可
VNC的使用
VNC是图形化的桌面分享系统,它使用RFB协议来远程控制另外一台计算机系统。
1.host :N qemu会根据数字N对应的TCP端口,其端口为5900+N ,host值是一个主机名或一个IP地址,如果host为空,即代表允许任何主机连接
示例:qemu-kvm rhel6u3.img -m 1024 -vnc :2
解决vnc鼠标偏移的问题, 参数-usbdevice tablet 表示添加一个tablet类型的USB设备,tablet类型的设备是一个使用绝对坐标定位的指针设备,就像在触摸屏中那样定位,这样可以让qemu能够在客户机不抢占鼠标的情况下获得鼠标的定位信息。
“-nographic” 参数可以完全关闭qemu的图形界面输出,从而让qemu在该模式下完全成为简单的命令行工具。