KVM CPU-->qemu进行模拟
ring 3-->用户应用 (用户态,用户空间)
ring 0-->操作系统 (内核态,内核空间)
虚拟化难题?
(1)CPU优化:
上下文切换:
宿主机
ring 0
ring 3
虚拟机
ring 0
ring 3
处理器设置-->Inter VT-x/EPT或AMD-V/RVI(V)
缓存:
L1-->静态内存
L2、L3-->动态内存
虚拟机在宿主机上是一个进程,受进程调度器的管理。容易导致Cache miss,为了减少缓存miss,可以通过taskset进行设定,把某个进程绑定到CPU的某个核上,进行提高性能。openstack上是无法进行绑定。
taskset -cp 1 25718

(2)内存优化:
空间优化
寻址

物理在使用内存的时候:虚拟内存-->映射-->物理内存,使用KVM的时候会有如下内存使用过程
虚拟机:虚拟内存
↓映射
虚拟机:物理内存
↓映射
宿主机:虚拟内存
↓映射
宿主机:物理内存

影子页表技术
技术分享图片

加速寻址技术:
Inter的EPT技术,内存优化技术,可以加速虚拟机到物理内存的映射

cat /proc/meminfo/

默认内存是4k,内存是分页的。大页内存

[root@linux-node1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled 
[always] madvise never

ksmd内存合并,扫描内存地址,把相同的内容进行合并释放,减少内存的占用

[root@linux-node1 ~]# ps axu |grep ksm
root        27  0.0  0.0      0     0 ?        SN   09:06   0:00 [ksmd]

(3)I/O优化:
①通过virtio技术,加速io访问,linux默认就有这个功能,windows需要装载驱动

技术分享图片

②IO调度算法
内核2.6有4种调度算法:Noop CFQ AS Deadline 默认CFQ
内核3.10有3中调度算法:Noop CFQ Deadline 默认Deadline
查看默认的IO调度算法

[root@linux-node1 ~]# dmesg |grep -i scheduler
[    0.300671] io scheduler noop registered
[    0.300674] io scheduler deadline registered (default)
[    0.300691] io scheduler cfq registered

Noop算法:
按顺序来,最简单的的I/O调度算法。该算法仅适当合并用户请求,并不排序请求:新的请求通常被插在调度队列的开头或末尾,下一个要处理的请求总是队列中的第一个请求。SSD必须设置Noop,性能最优。

  • 2.KVM的IO缓存介绍

技术分享图片

服务器的硬盘缓存是关闭的,因为会使用RAID卡缓存,RAID带电池,不会在断电的时候丢失数据。
虚拟机的应用程序写数据的方式选择:
KVM默认的方式是WriteThrough,最安全的,但是性能也最差。