云计算国产化之路 vnc登录 文件系统直通(virtio-9p) 扩展qemu接口 gpg WARNING 珍藏博客 虚拟内存情况dommemstat分析 免密码自动登录脚本 Linux网桥 测试网段IP占用情况 Linux 进程状态 systemc强制依赖 调试openstack ut uefi p2v 重做ubuntu内核 virsh创建虚拟机简介 virtio IO路径 虚拟化层升级后磁盘无法卸载卷 vmtouch使用 Taint flags 主机和虚拟机文件共享处理的几种方法 kvm分析工具 kvm中对磁盘的io cache 虚拟化不同导致的guestos中软件安装差异(未解决) 设备直通(PCI Assignment)到底是咋整的 virtio到底是咋整的 内核启动参数 虚拟化实时性提升(零)之配置步骤 中断虚拟化(pic)到底是咋整的 中断虚拟化(apic)到底是咋整的 Raid卡配置丢失导致服务器无法启动 tainted kernels cpu stuck for 23s问题分析 虚拟化实时性提升(一)之hostOS切换为强实时系统 内存虚拟化到底是咋整的 qemu-kvm中vcpu虚拟化到底是咋整的 风河虚拟化技术点分析 使用qga的好处 qemu迁移代码分析 虚拟机串口配置及其导出到主机pts和console.log System-based I/O vs. Raw I/O 虚拟机使用Hugepage(大页) 硬件辅助分页(hardware assisted paging) 修改centos7默认启动项目 virtio的工作流程——kernel中virtio-pci初始化(2) virtio的工作流程——qemu中virtio-backend初始化(1) qmp ceilometer取不到memory.usage指标 Virtio-Balloon超详细分析 slabtop输出 虚拟机磁盘cache导致的host os kernel崩溃 虚拟机cpu和memory性能优化测评 PCI配置空间(PCI Configuration Space) centos下网卡设备直通(VT-dpci passthrough)遇到的问题及其解决思路 libguestfs详解 yum卸载软件包及其依赖 通过原始Centos ISO来定制自己的ISO centos下网卡设备直通(VT-d,pci passthrough) (占位符)window虚拟机中拔盘如何通知到libvirt和qemu后端的 cirrus漏洞分析CVE-2017-2615 XSA-208 qcow2随笔 控制寄存器概览 ceilometer对接postgresql 解压initrd和vmlinuz qemu guest agent验证 QEMU升级指南(待续) ubuntu中kdump的配置 qemu(2.3)接口梳理 热迁移导致的FC存储场景下的multipath卷残留问题分析 virsh命令(4)secret,snapshot,pool,volume部分 virsh命令(3)之interface,filter,network virsh命令(2)monitor,host,nodedev部分 virsh命令(1)之domain部分 QEMU内存管理之FlatView模型(QEMU2.0.0) ovirt基于sanock的高可用(主机粒度HA) Sanlock防脑裂场景功能测试用例 gnocchi配置及与ceilometer对接指南 make patch for libvirt in centos centos使用sanlock指导 高可用nfs资料 ubuntu14中使用sanlock指导 LVM操作指南 sanlock相关功能验证流程汇总 make patch for libvirt in ubuntu libvirt.so.0-version `LIBVIRT_PRIVATE_1.2.7' not found gdb debug libvirt 基于ubuntu社区源码包编译libvirt compile libvirt(centos) No PCI buses available nfs lead to Linux halt nfs install and config anti-virus for cloud platform nova fetch image from glance(something about _base) token auth process ovs入门指南 virt software anti-virus something about ceilometer disk sample context interview questions openstack vm injection openstack Restful and RPC murano 概览 创建虚拟机流程(compute节点)之网络创建 创建虚拟机流程之compute_api之虚拟机实例填充之配额检测 创建虚拟机流程之compute_api之基本参数生成 创建虚拟机流程之compute_api 创建虚拟机流程(主) 创建虚拟机之image 创建虚拟机流程之准备网桥 创建虚拟机流程之virt 创建虚拟机流程之compute节点 CI/CD研发流程之工程创建 CI/CD研发流程之代码合入 CI/CD研发流程之UT(单元测试) 向openstack社区合入代码记 openstack/ceilometer/gnocchi杂谈 影子页表原理 mem_add(exec.c) qemu编译安装调试 openstack/ceilometer/gnocchi之Grafana简介 openstack wiki etcd openstack计量ceilometer openstack计费cloudKitty enventlet backdoor USB 安装VMWARE ESX pycharm设置指南 无法执行modprobe -a kvm-intel解决办法 QEMU配置项 网络不通小记 libvirt之XML(虚拟机定义文件) openstack-horizon 证书认证 ceilometer与ceph对接 openstack定时任务剖析(TODO) 服务器重启后mongodb进程无法启动 ubuntu14下新增openstack服务到service的导引 ERROR 1045(28000)-数据库连不上 Python两个内置函数—locals和globals unknown exit, hardware reason 31

虚拟机限额qos

2015年08月03日

云计算中宿主的资源也是有限的,多个虚拟机共用资源,倘若都疯狂霸占资源,后果也会很不和谐。 因此推出了配额(QOS)的概念,从逻辑层project的配额,到虚拟机实例的配额两个角度进行限制。 本文主要分析虚拟机实例的配额,对每个虚拟机从CPU,磁盘IO,网络带宽等三个角度进行限制。 关于逻辑层project的配额,请看另外一篇博文

CPU

CPU的配额是使用CGroup控制的。(关于CGroup陈皓有篇文章分析的不错,请参考) 这里主要控制了三个项目,分别如下:

  • cpu_shares
    此参数指定了domain(kvm概念,通常代表一个虚拟机实例)的权重,无量纲,也就是说这是相
    对的,比如一个虚拟机设置为2048则会比设置为1024的虚拟机获得多一倍的cpu执行时间。
    此值不设置会采用操作系统的默认值。
  • cpu_quota
    • 此参数指定带宽的上限,量纲微妙,参数范围[1000, 18446744073709551] 及负值。 设置为负值代表不做限制,设置为0无意义。 此参数可以用来确保多个vcpu运行在相同的速度。
  • cpu_period
    • 此参数指定cpu执行的周期时长,量纲为微妙,参数范围[1000, 1000000]。
      一个周期内,每个vcpu运行的上限,设置为0无意义。

    $ openstack flavor set FLAVOR-NAME \ –property quota:cpu_quota=10000 \ –property quota:cpu_period=20000

注意:cpu_quota/cpu_period即为通常意义上的cpu使用率。比如quota设置为10000,period设置为20000则使用率上限为50%. cpu_period个人理解为操作系统的时间片,具体设置规则,需进一步确认。

实验

  1. 创建一个flavor
    1. 指定metadata对应字段的值(可以直接在horizon中指定,也可以用novaclient的flavor-key方法指定),如图
  2. 创建虚拟机
    1. 使用上述flavor创建虚拟机。
  3. 确认配置生效
    1. 进入cgroup对应目录
    2. 在虚拟机目录下,查看shares,quota,及其period,可见shares设置为给定值,其他两项为默认值。
    3. 查看各个vcpu设置
      1. 从上述目录可以看见三个虚拟机cpu,查看其中两个为例 可见share会减半,猜测应该是默认根据层级递减,而没有三分,原因是这只是权重。 对应的quota和period在各个vcpu上。

磁盘IO

磁盘的读写IO是通过QEMU控制的。相应控制参数如下:

  • disk_read_bytes_sec 每秒磁盘可以读取的最大数据量(以字节为单位)。
  • disk_read_iops_sec 每秒所允许的最大读 I/O 操作。
  • disk_write_bytes_sec 每秒磁盘可写的最大数据量(以字节为单位)。
  • disk_write_iops_sec 每秒所允许的最大写 I/O 操作。
  • disk_total_bytes_sec 每秒所允许的最大吞吐量总和的限制。
  • disk_total_iops_sec 每秒所允许的最大总 I/O 操作。

实验过程与上面类似,创建flavor限制上述指标 限制后如下:

未限制如下

网络带宽

流控,通过进(inbound)和出两个层面进行控制。 libvir层面使用的tc。需要操作系统支持Linux Advanced Routing & Traffic Control 参考文档见这里

入口和出口流量可以分别设置。带宽元素至多是一个入口和至多一个出口。如果你不使用这些子元素,就没有服务质量(QoS)应用于流量。所以,如果你打算仅配置网络的入口流量,只使用入口(反之也一样)。

  • vif_inbound_average 期望的平均流入网络流量。
  • vif_inbound_burst 在 vif_inbound_peak 速度上可以接收的最大网络流量。
  • vif_inbound_peak 可以接收流入网络数据的最大速率。
  • vif_outbound_average 期望的平均流出网络流量。
  • vif_outbound_burst 在 vif_outbound_peak 速度上可以发送的最大网络流量。
  • vif_outbound_peak 可以发送流出网络数据的最大速率。

在虚拟机上安装流量发生软件iperf或者其他测试工具,生成20Mbit/s流量 这里的测算方法不知道是不是合理