Server在kvm上的性能提升,主要是分为两方面,一方面保证执行环境干净,不会被干扰;二是保证kvm虚拟中的模拟设备性能最优。下面主要是围绕这两个方面做一些优化。
保证程序运行环境的干净,这里主要是保证server运行环境干净:
1 kvm使用的cpu从宿主机系统调度中隔离。不然宿主机上的别的经常会占用分给kvm的cpu
配置方法:
grub.cfg中linux16打头的行添加isolcpus=4,5,6,7
4,5,6,7表示要隔离的cpu号,根据kvm使用的情况,隔离cpu
查看配置结果:
2 kvm和宿主cpu需要一一绑定,避免guest的cpu在物理cpu之间进行调度
配置方法:
修改kvm的xml配置文件
<vcpu placement=’static’ cpuset=’4-7′>4</vcpu>
<cputune>
<vcpupin vcpu=’0′ cpuset=’4’/>
<vcpupin vcpu=’1′ cpuset=’5’/>
<vcpupin vcpu=’2′ cpuset=’6’/>
<vcpupin vcpu=’3′ cpuset=’7’/>
<emulatorpin cpuset=’7’/>
</cputune>
<vcpupin vcpu=’0′ cpuset=’4’/> 表示将虚拟的0号cpu绑定到物理cpu4上
<emulatorpin cpuset=’7’/> 表示虚拟机运行的cpu
查看配置是否生效:
3 保证server的执行环境干净
这个server基础平台已经实现了,通过cgroup技术,实现了cpu资源的限制,非server的程序都控制在“mgt”线程所在的cpu上运行。如果没有mgt线程,将放在cpu 1上运行
cgroup文件是位置在:/sys/fs/cgroup/cpuset/Ns_Service_Cpus/
检查/sys/fs/cgroup/cpuset/Ns_Service_Cpus/tasks中进程id是否正确,保证非server的进程在这个task中
检查/sys/fs/cgroup/cpuset/Ns_Service_Cpus/cpuset.cpus的cpu是否正确,需要“mgt”线程运行的cpu或则1号cpu上
4 server的cpu使用分配
server最好运行在一个 socket的cpu上,因为不同的socket是的cpu和内交叉访问,对性能影响很大。
5 kvm使用cpu,采用cpu设置透传模式
修改虚拟机的xml文件,添加如下选项
<cpu mode=’host-passthrough’/>
6 网卡透传
(1)开机启动项
grub打开intel_iommu
在grub.cfg的intel_iommu=on
(2)加载驱动
modprobe vfio
modprobe vfio-pci
(3)设置指定pci 网卡驱动,可以用dpdk_nic_bind.py来绑定,比如pci 为0000:0b:00.0
则绑定命令为:
dpdk_nic_bind.py -b vfio-pci 0000:0b:00.0
7 vcpu和内存最好限定在同一个NUMA 节点
在NUMA架构中,cpu最好能访问 local memory 而非remote memory。
下面是访问内存距离差异
在虚拟机中,分给server的cpu最好是node0节点,内存最好也是。
如果cpu是node0,保证内存使用node0,需要在kvm配置文件中添加如下元素
<numatune>
<memory mode=”preferred” nodeset=”0″/>
</numatune>
表示优先使node0的内存
8 如果宿主机上开启了超线程,server线程dp_process、dp_in、dp_out最好能够单独占用物理核,
这个可以在kvm的xml文件中,绑定cpu时注意
9 设置IO cache
kvm的cache性能:writeback > none > writethrough ,安全上:writeback < none < writethrough
在kvm中xml文件中配置:
<disk type=’file’ device=’disk’>
<driver name=’qemu’ type=’qcow2′ cache=’none’/>
</disk>
none是在各种环境中性能比较平均,安全和稳定
这个是我在优化server在kvm上的性能的一些方法,写出来与大家分享一下。可能有些深入度不够,写的不全,希望大家指正,共同探讨。
参考资料:
https://blog.csdn.net/dylloveyou/article/details/71515880
https://libvirt.org/formatdomain.html#elementsNICSHostdev