libvirt-虚拟机qos控制

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>

# 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=0

root     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=0

root     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  22370

2.查看各个线程的绑定情况

# taskset -p 22314

pid 22314's current affinity mask: f

# taskset -p 22324 

pid 22324's current affinity mask: 2

# taskset -p 22370

pid 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   0

22314 22324  0.2   1

22314 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动态调整上述参数

另外还可以通过cgroup来实现对虚拟机的内存限制:

1.如何通过cgroup做所有虚拟机总内存限制

# cat /sys/fs/cgroup/memory/machine/memory.limit_in_bytes

9223372036854771712

这里machine是libvrit的默认根cgroup组名。修改/sys/fs/cgroup/memory/machine/memory.limit_in_bytes的数值就可以限制所有libvirt创建的虚拟机的使用总内存。

2.如何通过cgroup做部分虚拟机的总内存限制

创建一个名为openstack的自定义cgroup :

#!/bin/bash

cd /sys/fs/cgroup

for i in blkio cpu,cpuacct cpuset devices freezer memory net_cls perf_event

  do

    mkdir $i/machine/openstack.partition

  done

for 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>

修改/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。

三. 磁盘

磁盘_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>


关注本公众号,了解更多关于云计算虚拟化的知识。

原文发布于微信公众号 - 虚拟化云计算(openstack_openstack)

原文发表时间:2018-01-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开源优测

jenkins系统管理(一)-管理用户、管理插件

系统管理主要用于jenkins后台管理配置,包含系统设置、全局安全配置、全局工具配置、管理插件、管理节点、管理用户等功能。 本文将介绍的是系统管理中两个主要功能...

3474
来自专栏性能与架构

小程序示例 - 不同页面间的消息传递

场景 假设有两个页面:用户列表页、信息编辑页 在列表中点击后某条信息后,进入编辑页面 ? 修改了用户信息后,返回到列表页,列表中需要显示修改后的信息 例如把 “...

3887
来自专栏北京马哥教育

原创投稿 | Zabbix的编译安装并发送通知邮件

1.写在前面 本文主要介绍的是zabbix的编译安装过程,包含它的基础环境LNMP,虽然zabbix官方一般推荐的环境是LAMP。以及实现简单的监控任务,在发...

3878
来自专栏云计算教程系列

如何在Ubuntu 16.04上使用Flask和Python 3编写Slash命令

Slack是团队的沟通平台。Slack有许多附加组件,可以让团队扩展Slack,并将其与其他程序集成。slash命令是在消息输入框中执行操作的快捷方式。例如,键...

1094
来自专栏进击的君君的前端之路

如何发布npm包

1222
来自专栏jiajia_deng

正确处理安装程序提示 “这个程序可能安装不正确” 问题

1182
来自专栏Python攻城狮

GitHub 系列之「向GitHub 提交代码」1.SSH2.生成SSH key3.GitHub 上添加 SSH key4.Push & Pull5.提交代码

你拥有了一个 GitHub 账号之后,就可以自由的 clone 或者下载其他项目,也可以创建自己的项目,但是你没法提交代码。仔细想想也知道,肯定不可能随意就能提...

732
来自专栏草根专栏

Git基本命令 -- 创建Git项目

在这里下载git: https://git-scm.com/ 安装的时候, 如果是windows系统的话, 可以勾选unix的命令行工具, 这样在windows...

2907
来自专栏王磊的博客

ubuntu搭建nodejs生产环境——快速部署手册

1885
来自专栏从流域到海域

Vue.js项目目录结构

folder/flie 说明 bulid 最终生成代码存放位置。 config 配置目录,存放配置文件。index.js中存放了环境和端口等配置...

3275

扫码关注云+社区

领取腾讯云代金券