libvirt-qemu-虚拟机qos控制
2018-01-28 20:11
302 查看
[align=center](文章来自作者维护的社区微信公众号【虚拟化云计算】)[/align]
libvirt提供了一系列tune的方式,来实现对虚拟机的qos精细控制。下面介绍cpu、内存、磁盘io、网络带宽的qos控制方式。
一. cpu
二. 内存
另外还可以通过cgroup来实现对虚拟机的内存限制:1.如何通过cgroup做所有虚拟机总内存限制# cat /sys/fs/cgroup/memory/machine/memory.limit_in_bytes9223372036854771712这里machine是libvrit的默认根cgroup组名。修改/sys/fs/cgroup/memory/machine/memory.limit_in_bytes的数值就可以限制所有libvirt创建的虚拟机的使用总内存。
2.如何通过cgroup做部分虚拟机的总内存限制
修改/sys/fs/cgroup/memory/machine/openstack.partition/memory.limit_in_bytes的数值,就可以限制通过openstack.partition创建的虚拟机的使用总内存
3.如何通过cgroup做某个虚拟机的内存限制(同在虚拟机的xml文件中的memtune中配置hard_limit)echo 100000000 > /sys/fs/cgroup/memory/machine/openstack.partition/instance-00000005.libvirt-qemu/memory.limit_in_bytes就可以限制虚拟机instance-00000005的实际使用host的物理内存最大为100M。
三. 磁盘
四. 网卡
============================================================[align=center]关注微信公众号【虚拟化云计算】,阅读更多虚拟化云计算知识,纯技术干货更新不停。[/align]
libvirt提供了一系列tune的方式,来实现对虚拟机的qos精细控制。下面介绍cpu、内存、磁盘io、网络带宽的qos控制方式。
一. cpu
限制cpu带宽,主要时通过cputune中的quota参数来控制,设置了cpu的quota后就可以限制cpu访问物理CPU的时间片段。libvirt的虚拟机配置如下: |
<domain type='kvm' id='6'> .... <cputune> <vcpupin vcpu="0" cpuset="1-4,^2"/> <vcpupin vcpu="1" cpuset="0,1"/> <vcpupin vcpu="2" cpuset="2,3"/> <vcpupin vcpu="3" cpuset="0,4"/> <emulatorpin cpuset="1-3"/> <iothreadpin iothread="1" cpuset="5,6"/> <iothreadpin iothread="2" cpuset="7,8"/> <shares>2048</shares> <period>1000000</period> <quota>-1</quota> <emulator_period>1000000</emulator_period> <emulator_quota>-1</emulator_quota> <iothread_period>1000000</iothread_period> <iothread_quota>-1</iothread_quota> <vcpusched vcpus='0-4,^3' scheduler='fifo' priority='1'/> <iothreadsched iothreads='2' scheduler='batch'/> </cputune> ....</domain> 4000 |
# virsh schedinfo demo |
设置cpu亲和性。设置了cpu的亲和性可以使得虚拟机的cpu固定在某些物理cpu上,从而实现对cpu使用的控制和隔离。libvirt虚拟机的配置方式如下: |
<vcpu placement='static' cpuset='0-1'>2</vcpu><cputune> <vcpupin vcpu='0' cpuset='0'/> <vcpupin vcpu='1' cpuset='1'/></cputune> |
查看信息:# virsh vcpuinfo instance-0000000d(可查看到CPU Affinity信息) |
演示虚拟机cpu亲和性绑定 |
1.通过下面命令找到虚拟机进程所有的线程# ps -efL例如:root 22314 1 22314 0 3 18:21 ? 00:00:00 /usr/libexec/qemu-kvm -name win7 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off -cpu qemu64,hv_time,hv_relaxed,hv_vapic,hv_spinlocks=0root 22314 1 22324 0 3 18:21 ? 00:00:02 /usr/libexec/qemu-kvm -name win7 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off -cpu qemu64,hv_time,hv_relaxed,hv_vapic,hv_spinlocks=0root 22314 1 22370 0 3 18:21 ? 00:00:00 /usr/libexec/qemu-kvm -name win7 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off -cpu qemu64,hv_time,hv_relaxed,hv_vapic,hv_spinlocks=0这里虚拟机win7的线程为22314 22324 223702.查看各个线程的绑定情况# taskset -p 22314pid 22314's current affinity mask: f# taskset -p 22324 pid 22324's current affinity mask: 2# taskset -p 22370pid 22370's current affinity mask: f可以看出22314和22370是没做绑定。22324被绑定到了1号cpu上,说明如下:22314和22370绑定到了0123四个cpu上(f即1111,代表绑定到了0123四个cpu上);22324绑定到了1号cpu上(2即0010,代表绑定到了1号cpu上)。这里主机上一共有0123这4个cpu,所以绑定到0123四个cpu上也就是没有绑定,所以这里22314和22370是没做绑定的。 3.查看虚拟机运行时的cpu是否真的被绑住了:# watch -n 1 -d 'ps -eLo pid,tid,pcpu,psr| grep 22314'Every 1.0s: ps -eLo pid,tid,pcpu,psr| grep 22314 Wed Nov 9 18:58:17 2016 22314 22314 0.0 022314 22324 0.2 122314 22370 0.0 1 这里会看到22324一致在1上不动,22314和22370会随机的在各个cpu上跑。(左后一列代表在哪个cpu上。虚拟机很忙时效果会很明显)(说明:命令中最后为什么grep 22314,这个22314是刚才ps -eLf的第二列。) |
内存_qos。设置了内存的qos可以限制虚拟机在物理host山申请内存的大小。libvirt虚拟机的配置方式如下: |
<domain> ... <memtune> <hard_limit unit='G'>1</hard_limit> <soft_limit unit='M'>128</soft_limit> <swap_hard_limit unit='G'>2</swap_hard_limit> <min_guarantee unit='byte'>67108864</min_guarantee> </memtune> ...</domain> |
参数说明:hard_limit:限制虚拟机在host上使用的最大物理内存。min_guarantee:最小保证的内存 查看信息:# virsh memtune instance-00000005 说明:可以通过virsh memtune动态调整上述参数 |
2.如何通过cgroup做部分虚拟机的总内存限制
创建一个名为openstack的自定义cgroup : |
#!/bin/bash cd /sys/fs/cgroupfor i in blkio cpu,cpuacct cpuset devices freezer memory net_cls perf_event do mkdir $i/machine/openstack.partition donefor i in cpuset.cpus cpuset.mems do cat cpuset/machine/$i > cpuset/machine/openstack.partition/$i done |
在虚拟机的xml文件中使用: |
<domain type='kvm' id='6'> .... <resource> <partition>/machine/openstack.partition</partition> </resource> ....</domain> |
3.如何通过cgroup做某个虚拟机的内存限制(同在虚拟机的xml文件中的memtune中配置hard_limit)echo 100000000 > /sys/fs/cgroup/memory/machine/openstack.partition/instance-00000005.libvirt-qemu/memory.limit_in_bytes就可以限制虚拟机instance-00000005的实际使用host的物理内存最大为100M。
三. 磁盘
磁盘_qos。设置磁盘的qos可以实现对磁盘的读写速率的限制,单位可以时iops或者字节。libvirt虚拟机的配置方式如下: |
<domain type='kvm' id='6'> .... <devices> .... <disk type='network' device='disk'> <driver name='qemu' type='raw' cache='writeback' discard='unmap'/> <source protocol='rbd' name='images/1a956ba7-25fe-49f1-9513-7adb8928036c'> <host name='192.168.107.50' port='6789'/> <host name='192.168.107.51' port='6789'/> <host name='192.168.107.52' port='6789'/> <host name='192.168.107.53' port='6789'/> </source> <target dev='vda' bus='virtio'/> <iotune> <read_bytes_sec>20480</read_bytes_sec> <write_bytes_sec>10240</write_bytes_sec> </iotune> <boot order='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/> </disk> .... </devices> ....</domain> |
<disk type='network' device='disk'> <driver name='qemu' type='raw' cache='writeback' discard='unmap'/> <source protocol='rbd' name='images/1a956ba7-25fe-49f1-9513-7adb8928036c'> <host name='192.168.107.50' port='6789'/> <host name='192.168.107.51' port='6789'/> <host name='192.168.107.52' port='6789'/> <host name='192.168.107.53' port='6789'/> </source> <target dev='vda' bus='virtio'/> <iotune> <read_iops_sec>20480</read_iops_sec> <write_iops_sec>10240</write_iops_sec> </iotune> <boot order='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/> </disk> |
# virsh blkiotune demo |
网卡_qos。设置网卡的qos可以限制网卡的io速率。libvirt虚拟机的配置方式如下: |
<interface type='bridge'> <mac address='fa:16:3e:8f:6a:c9'/> <source bridge='brq5233ef6c-62'/> <bandwidth> <inbound average='2048'/> <outbound average='1024'/> </bandwidth> <target dev='tap9573c869-24'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> |
相关文章推荐
- libvirt-qemu-用cgroup对虚拟机进行资源分割
- libvirt-qemu-虚拟机设备热插拔实践
- 使用libvirt和qemu将pci pass through设备添加到虚拟机上
- libvirt-qemu-虚拟机设备热插拔
- Ubuntu 下安装kvm, qemu, libvirt,并新建虚拟机的过程
- libvirt-qemu-虚拟机cpu分配和cpu热插拔
- 9.2 libvirt中对Qemu的控制
- 使用libvirt和qemu将pci pass through设备添加到虚拟机上
- 【虚拟机】虚拟化技术以及KVM、QEMU与libvirt介绍
- 使用libvirt和qemu将pci pass through设备添加到虚拟机上
- 使用Vmware CLI 6.5控制虚拟机,并做快照
- CPU常识+Qemu虚拟机CPU配置
- 深入浅出 kvm qemu libvirt
- qemu,kvm,libvirt的使用
- libvirt kvm 虚拟机上网 – Bridge桥接
- Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(八)
- 如何在esxi 6上面套嵌运行虚拟机(kvm、xen、esxi6、vmware workstation、Qemu)
- QEMU-KVM创建虚拟机的入口
- qemu虚拟机
- 使用libvirt技术监控虚拟机资源利用情况