云计算中宿主的资源也是有限的,多个虚拟机共用资源,倘若都疯狂霸占资源,后果也会很不和谐。 因此推出了配额(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执行的周期时长,量纲为微妙,参数范围[1000, 1000000]。
注意:cpu_quota/cpu_period即为通常意义上的cpu使用率。比如quota设置为10000,period设置为20000则使用率上限为50%. cpu_period个人理解为操作系统的时间片,具体设置规则,需进一步确认。
实验
- 创建一个flavor
- 指定metadata对应字段的值(可以直接在horizon中指定,也可以用novaclient的flavor-key方法指定),如图
- 创建虚拟机
- 使用上述flavor创建虚拟机。
- 确认配置生效
- 进入cgroup对应目录
- 在虚拟机目录下,查看shares,quota,及其period,可见shares设置为给定值,其他两项为默认值。
- 查看各个vcpu设置
- 从上述目录可以看见三个虚拟机cpu,查看其中两个为例 可见share会减半,猜测应该是默认根据层级递减,而没有三分,原因是这只是权重。 对应的quota和period在各个vcpu上。
- 进入cgroup对应目录
磁盘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流量 这里的测算方法不知道是不是合理