1、虚拟化介绍
软件全虚拟化:软件捕获翻译,宿主机OS-软件模拟(用户空间)-软件上的虚拟机OS-虚拟机OS应用
半虚拟化:宿主机OS-内核翻译(内核转发)-虚拟机OS-虚拟机OS应用
直通:硬件-虚拟机OS-虚拟机OS应用,Intel的VT-x(CPU指令改造),VT-d(IO改造),VT-c(网络改造)
容器虚拟化:利用CGroups、Namespace将进程隔离,每个进程就像单独的虚拟机一样,Docker。
2、基础
kvm的硬件平台:Intel-VT或AMD-V
作为模块随linux内核发布,kvm.ko,和qemu紧密集合(kvm在内核空间提供虚拟化支持模拟cpu和内存,qemu有完整的一套虚拟化,使用kvm来加速,在用户空间使用),开源,市场占有率75%以上,
libvirt:红帽开发的用来管理虚拟化引擎(主要是KVM),包含函数库、libvirtd、virsh命令集
vnc查看宿主机界面
最原始的虚拟机也是用iso镜像安装的,后续就是拷贝镜像部署
kvm内置有vnc机制,因此本地不需要安装vnc服务即可连接
3、cpu和内存
cpu调优就是核绑定,内存调优基于KSM(生产环境慎用)
SMP、MPP、NUMA
numactl --hardware
numastat -c qemu-kvm(虚拟机使用内存的情况)
关闭自动平衡策略:echo 0 > /proc/sys/kernel/numa_balancing
unixbench性能测试:可以对kvm进行性能测试
cpu mode的几种模式:custom、host-model、host-passthrough(直接暴露宿主机cpu,影响迁移)
Nested:虚拟机上运行虚拟机,kvm on kvm,理论上无限,但是两层就会很慢了。需要打开kvm的嵌套特性。
内存还可以有很多参数可以设置。
4、网络
半虚拟化网卡:virtio驱动,linux内核默认集成,
全虚拟化网卡:e1000
vhost_net对virtio的优化,
运行一台虚拟机是由用户空间的qemu和内核的kvm共同完成的,qemu负责模拟各种设备给虚拟机,kvm负责完成CPU和内存的虚拟化,
网卡的RSS特性,mpstat
hostpassthrough:物理机直接暴露cpu给虚拟机,pcipassthrough:虚拟机直接使用物理机网卡(虚拟机需要安装对应的网卡驱动)
单机虚拟化场景:sr-ivo,将一个pci-e设备共享给虚拟机使用,多用在网络设备上(显卡也可以),是硬件解决方案,从架构上说是一个物理网卡开多个VFs,
千兆网卡最多支持8个VF, 支持比较好的有Intel I350,万兆有82599
VT-d 的性能非常好,但是它的物理设备只能分配给一个客户机使用。为了实现多个虚机共享一个物理设备,并且达到直接分配的目的,PCI-SIG 组织发布了 SR-IOV (Single Root I/O Virtualization and sharing) 规范,它定义了一个标准化的机制用以原生地支持实现多个客户机共享一个设备。
不过,目前 SR-IOV (单根 I/O 虚拟化)最广泛地应用还是网卡上。
多网卡绑定与建桥 bond
5、虚拟磁盘性能
缓存模式
raw、qcow2、裸盘、lvm
裸设备写入效率会高一些
6、宿主机选型
cpu、内存、磁盘、RAID(生产环境一般用RAID10)、网卡
7、性能优化
grub添加了启动参数后,通过cat /proc/cmdline命令进行验证
cat /sys/devices/system/cpu/isolated 查看隔离的cpu数
taskset -c pid
网卡pci号:ethtool -i eth1 | grep bus-info
不管宿主机虚拟机,都可以用ethtool -i xx看到网卡对应的pci地址,从而可以确定是哪个网卡没有起来
virsh nodedev-list --cap pci |grep pci_addr可以查看完整的pci地址
virsh nodedev-dumpxml + pci name 看到设备的全部信息,包括位于哪个NUMA节点
virsh domiflist VM1 宿主机查看虚拟机信息
虚拟机直接使用宿主机网卡,需开iommu(vfio提供用户态操作iommu,实现device passthrough),这种叫虚拟机网卡独占,不是virtio,也不是vhost_net和sriov,
磁盘使用virtio,有5中缓存模式,低于QEMU-KVM1.2的版本kvm默认的cache方式是writethrouh,综合数据的安全性和性能,建议选择none模式,注意CentOS下默认是none。
内存:EPT、大页内存、NUMA自动平衡策略会调整内存使用,跨节点;
cpu绑定与热添加
/proc/cpuino:
processor 逻辑cpu:用户看到的cpu个数,包含了超线程之后的cpu个数
physical id物理cpu:cat /proc/cpuinfo|grep "physical id"|sort|uniq 得到物理CPU个数
core id:一个物理cpu的核数(不含超线程),cat /proc/cpuinfo|grep "core id"|sort|uniq|wc -l
siblings:每个物理cpu中的逻辑cpu个数,包含了超线程的 cat /proc/cpuinfo|grep "siblings"|uniq
processor = physical id * core id * 超线程倍数 = physical id * siblings
CPU优化
隔离
绑定
不跨节点
CPU绑定实际上是Libvirt通过CGROUP来实现的,通过CGROUP直接去绑定KVM虚拟机进程也可以。CGROUP不仅可以做CPU绑定,还可以限制虚拟机磁盘、网络资源控制。
virsh vcpuinfo xxx可以看出cpu的跨节点与否,一个y表示此cpu只运行绑定的核上
内存优化
内存足够
不跨节点
禁止自带的平衡策略
linux系统默认是自动numu平衡策略,如果要关闭Linux系统的自动平衡,使用如下命令
# echo 0 > /proc/sys/kernel/numa_balancing
如果要开启,使用如下命令
echo 1 > /proc/sys/kernel/numa_balancing
默认情况下,系统使用的是自动平衡的NUMA策略。
使用numastat查看节点的内存统计
memory使用strict模式也可以。这个是可以起来的,和刚子哥之前说的不同,估计是操作有问题。
systemctl status ksm.service 内存压缩默认是开启的,生产环境要慎用。
内存气球:balloon。优先是内部可以超用,缺点是影响性能。就是宿主机和虚拟机之间互相挪用内存。
磁盘优化
direct io
缓存
同步
网卡优化
iommu
不跨节点(莉姐反馈 网卡是否跨节点影响不大)
首先,可以通过 lspci |grep Ethernet 可以知道网卡的pci地址;
然后,virsh nodedev-list --cap pci |grep pci_addr可以查看完整的pci地址
virsh nodedev-dumpxml pci_addr 看到设备的全部信息,包括处于哪个NUMA节点
最后,就可以将对应的网卡绑定在对应的NUMA节点。
时钟优化
虚拟机tsc时钟源
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
grub里加:tsc=reliable
宿主机:稳定时钟,最高频率运行
宿主机以最高性能运行需要设置频率调控器类型,以下是几种频率调控器差别,
cpufreq_performance
性能调控器会强制 CPU 使用最高时钟频率。这个频率是静态设置的,不会改变。因此,这个特定的调节器“不提供节电效益”。它只适用于几个小时的高负载,而且即使在那种情况下也只可用于 CPU 几乎不(或者从不)闲置的时候。
cpufreq_powersave
相反,节电调控器会强制 CPU 使用最低时钟频率。这个频率将被静态设置,且不会更改。因此,这个特定调节器提供最大节能效益,但这是以“最低 CPU 性能”为代价的。
这里“节电”一词有时是不正确的,因为(原则上)满负载但低速运行的 CPU 消耗的电量比没有负载但高速运行的 CPU 要多。因此,尽管我们可能建议在需要低性能时设定 CPU 使用节电调控器,但是在这期间意外的高负载可能会导致系统实际消耗了更多的电量。
简单地说,节电调控器对 CPU 更象是"限速器"而不是"节能器"。它在过热时会出问题的系统和环境中最有用。
cpufreq_ondemand
按需调控器是一个动态调控器,它允许 CPU 在系统负载高时达到最大时钟频率,还允许系统处于闲置时使用最低时钟频率。虽然这允许系统根据系统负载调整电源消耗,但也确实要承受“频率切换间造成的延迟”。因此,如果系统在闲置和高负载间切换过于频繁,那么延迟可抵消任何按需调控器带来的性能/节能优势。
对大多数系统来说,按需调控器可在散热、电源消耗、性能以及管理性间提供最佳折中方案。若系统只在每天的某个具体时间繁忙,按需调控器将根据负载自动在最大和最小频率间切换而无须进一步操作。
cpufreq_userspace
用户空间调控器允许用户空间程序,或者任何以 root 身份运行的进程,来设置频率。所有的调控器当中,用户空间调控器是最能够自定义的。根据它的配置,它能够为您的系统提供最佳的性能和能耗的折中方案。
cpufreq_conservative
与按需调控器类似,传统调控器也会根据用量调整时钟频率(类似按需调控器)。但是按需调控器更极端(从最大到最小,再返回),传统调控器则在更接近的频率间进行切换。
UTS宿主机选择使用 cpufreq_performance 频率调控模式。
cpupower frequency-info --governors //查看可用的频率调控器
cpupower frequency-set --governor cpufreq_performance //设置所有cpu的频率调控器
cpupower -c 1-3,5 frequency-set --governor cpufreq_userspace //设置特定cpu的频率调控器
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor //查看cpu当前的频率调控器
cat /proc/cpuinfo //实时查看cpu频率
cpupower frequency-info
cpupower frequency-info|grep "available frequency steps"|cut -d' ' -f7
cpupower frequency-set -f clock_freq
8、OpenStack
平台虚拟化引擎,上面可以装KVM、esx、Xen、XenServer、Lxc、HyperV
把OpenStack理解成一个资源池宿主机,它聚合资源,同时他也通过Libvirt来使用虚拟化技术创建虚拟机。比virt-manager强大。