为什么要监视性能?
第一、了解服务器的工作负荷以及对服务器资源的影响
第二、了解性能的改变和性能趋势以便及采取措施
第三、诊断系统问题并确认优化措施
建立性能基线
性能基线是在一段时间中在典型的工作负荷和用户连接数量的情况下收集的服务器性能数据。
在确定性能基线时,应当了解服务器所执行的任务,以及执行任务的时间和日期。
在部署阶段建立性能基线,然后和实际性能进行比较。
及早建立性能基线有助于快速发现和解决性能瓶颈问题。
服务器性能监视的最佳策略
1、建立性能日志(而不是简单的用top看)
2、尽量减少性能监视本身对服务器所造成的影响
3、分析监视结果,建立性能基线
创建警报
4、调整系统(scale up /scale out)
5、分析性能趋势,提前采取措施
Red Hat Enterprise Linux中的虚拟化性能特性
cpu/kernel
NUMA:非一致性内存访问
CFS:完全公平调度程序。
RCU:读取复制更新,更好地处理共享线程数据。
多达240个虚拟cpu
内存
大页面和其他内存密集型环境下的优化
网络
vhost-net:一种基于内核的VirtIO快速解决方案
SR-IOV:使联网性能级别接近本机
块I/O
AIO:支持线程和其他I/O操作重叠
MSI:PCI总线设备中断生成
磁盘I/O节流:虚拟机磁盘I/O的控制要求避免过度使用主机资源
virt-manager性能管理
kvm中客户机是作为一个进程在主机上运行的,vcpu是作为一个线程执行,由linux调度器控制。对于guest os来说,它会继承物理cpu中的一些特性(AUMA,透明页共享等)。主机的磁盘I/O和网络I/O常常会成为瓶颈,virt-manager可以管理。
1、尽可能地提供虚拟机详细地信息,以便通过启用适用与特定虚拟机类型地功能来提高性能。
2、删除不适用的设备
(声卡,光驱,打印机)3、CPU性能选项
不要给太多,单一就足够了
这里的话建议选择copy
如果是嵌套虚拟化请选择透传
手动输入host-passthrough
CPU拓扑和钉选可以不用动4、虚拟磁盘性能选项
缓存模式,这里在迁移的那里有
网络性能优化
常规建议:
使用多个网络以避免单一网络过载
调整MTU,通过提高最大传输单元值可以减少碎片
使用arp_filter阻止ARP Flux
运行echo 1>/proc/sys/net/ipv4/conf/all/arp_filter
或编辑/etc/sysctl/conf让重启后这设置得以持续
1、直接使用VirtIO的驱动
vhost_net将部分Virtio驱动从用户空间移至kernel,这将减少复制操作、降低延迟和cpu占用量。
2、设备分配和SR-IOV
直接把一块网卡分配给虚拟机可以提高速率,但是在迁移时会受限。单root的IO虚拟化可以解决这种情况,SR-IOV可以将物理网卡池化,或者分成很多个虚拟网卡,这些在虚拟机看来就是物理网卡。
3、桥接零复制传输
零复制是数据包从网络设备到用户空间传递的过程,为了减少数据拷贝的次数、系统调用,少让cpu参与。kvm虚拟化场景中用桥接比较多,
对于大尺寸的数据包较为有效
客户机网络和外部网络间的大数据包传输中,它对主机cpu负荷的减少可达到15%,对吞吐量没有影响。
它不对虚拟机到虚拟机、虚拟机到主机或小数据包负载造成影响。
RHEL/CentOS7虚拟机完全支持桥接零复制传输,但是被默认禁用(为了防止攻击)
启动零复制传输模式
创建新文件vhost-net.conf
# vi /etc/modprobe.d/vhost-net.conf
添加:
options vhost_net experimental_zcopytx=1
如果想禁用
# modprobe -r vhost_net
# modprobe vhost_net experimental_zcopytx=0
4、多队列virio-net
当网络压力比较大,虚拟机cpu数量是多个,可以启用这个功能。多队列virtio-net提供了随虚拟cpu增加而改变网络性能的方法。一次可以让一组以上的virtqueue进行传输。
在以下场景中,可以提供最佳性能:
流量数据包相对较大
客户机同时在各种连接中活跃,流量从客户机、客户机到主机或客户端运行到外部系统。
队列数量与虚拟cpu相同
修改虚拟机配置文件
加上driver这一行,然后把队列的数量N设成和虚拟cpu一样
<interface type='network'>
<source network='default' />
<model type='virtio' />
<driver name='vhost' queues='N' />
</interface>
存储性能优化
1、磁盘I/O节流
避免虚拟机过度使用共享资源,并防止影响其他虚拟机的性能
可通过virt-manager或virsh来进行配置
例如将虚拟机testvm中的vda节流至I/O读写每秒1000、吞吐量为每秒50MB
virsh blkdeviotune testvm vda --total-iops-sec 1000 --total-bytes-sec 52428800
2、缓存
cache mode下拉框里有很多选项,但实际生产中none就是最佳的选项
3、I/O模式
虚拟机的XML配置
<disk type='file device' device='disk'>
<driver name='qemu' type='raw' io='threads' />
4、块I/O调整
通过调整权重控制I/O
5、多队列virtio-scsi
如果虚拟机配备的不是virtio vda vdb这种盘,而是scsi,可以开启多队列。
在客户机XML配置中添加:
N为虚拟cpu数量
<controller type='scsi' index='0' model='virtio-csi' >
<driver queues='N' />
</controller>
内存性能优化
常规建议:
1、请勿为虚拟机分配超过所需的其他资源
(如果是桌面虚拟化,超量分配的比例根据业务调整)
2、在可能的情况下,如果NUMA节点中有足够的资源,将一台客户机分配到一个单一NUMA节点。
通过virsh调整内存配置
virsh memtune virtual_machine --parameter size
大页和透明大页
x86CPU通常会在4kB页中处理内存,但可以使用更大的2MB或1GB页,即大页。
大页内存可以支持KVM客户机部署,以改善性能。
在启动时分配4个1GB的大页面和1024个2MB的大页面:
echo 4 > /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node3/hugepages/hugepages-2048kB/nr_hugepages
将1GB和2MB的大页面挂载到主机
mkdir /dev/hugepages1G
mount -t hugetlbfs -o pagesize=1G none /dev/hugepages1G
mkdir /dev/hugepages2M
mount -t hugetlbfs -o pagesize=2M none /dev/hugepages2M
重启libvirtd,使1GB大页面可以在客户机上启用
systemctl restart libvirtd
CPU性能优化
默认启用的NUMA已经可以自动化平衡系统运行应用的性能。如果有特殊的需求可以钉选,让某种业务独占某个cpu。