..
声明:
本博客欢迎转发,但请保留原作者信息!
博客地址:http://blog.csdn.net/halcyonbaby
新浪微博:@寻觅神迹
内容系本人学习、研究和总结,如有雷同,实属荣幸!
openstack特性之虚拟机实时性
虚拟机实时性特性是openstack M版本引入的。
虚拟机实时性特性,旨在改善提供低延迟的CPU调度能力。
实时性虚拟机主要用于跑需要对CPU执行延迟要求苛刻的负载。典型的如NFV场景的应用,也可以用于金融市场高频交易等场合。
原理
目前主要有以下手段改善实时性:
- CPU pinning
防止虚拟机之间互相“steal time”,从而影响CPU调度延迟。 - 主机资源
解决kernel task占用CPU,导致的CPU调度延迟。 - QEMU Emulator thread pin
解决QEMU Emulator线程占用CPU,导致的CPU调度延迟。
这个仍然会导致虚拟机部分vCPU不是实时的,Linux可以支持,但是某些实时性OS不支持。(解决方法参见文后“参考3”) - Guest VCPU调度策略
给guest vCPUs配置合适的调度策略,解决调度导致的CPU延迟。 - 使用大页
确保Guest内存不会被swap到host上。 - 防止QEMU内存swap
配置QEMU内存不被swap,避免内存swap导致的延迟。 - Qemu GA
虚拟机不能配置qemu ga,方式guest agent影响实时性。
使用注意
实时性是存在代价的。为了在最坏情况下,满足对CPU延迟的苛刻要求,整个系统的吞吐能力都要做妥协。
因此,无条件使用实时性,并不合理。只有在业务负载真的需要时,才开启这个选项。
很多情况下,仅仅使用CPU pinning就可以满足业务的对实时性的 要求。
根据社区的测试效果:
- baremetal + dedicated cpu + non-realtime scheduler
worst case latency:150微秒,mean latency:2微秒 - KVM + dedicated cpu + realtime scheduler
worst case latency:14微秒, mean latency:<10微秒
使用方法
为了达到最优的效果,需要配合使用之前的numa亲和特性、dedicated cpu pinning特性、huge page特性。
由于开启实时是有代价的,一般来说,需要通过host aggregate将支持实时和不支持实时的computes host分开。
- flavor中增加“hw:cpu_realtime=yes|no”开启实时策略
- 前提是配置了”hw:cpu_policy”为”dedicated”。
- kvm主要做了配置:1. QEMU和guest RAM lock 2. 所有的vCPUs使用固定的实时调度策略。
- flavor中增加hw:cpu_realtime_mask=^0-1参数控制emulator使用的cpu
- 这个必须配置的。
- 将某些vCPUs分配给emulator使用,且使用非实时调度策略。其他的vCPU会使用实时调度策略。(默认虚拟机会使用所有vCPU给emulator用)。
- 更进一步的在主机上固定一些pCPU供emulator使用,在P版本才完成(没仔细看,不确定做了什么事)URL。
例子
# 如果不配置cpu绑定会出现以下错误。
[stack@localhost devstack]$ openstack server create --flavor realtime --image cirros-0.3.4-x86_64-uec realtime
Cannot set realtime policy in a non dedicated cpu pinning policy (HTTP 400) (Request-ID: req-95b9c93c-cbac-4f1b-bf37-4942afa53860)
# 如果不配置配置cpu mask会出现以下错误
[stack@localhost devstack]$ openstack server create --flavor realtime --image cirros-0.3.4-x86_64-uec realtime
Realtime policy needs vCPU(s) mask configured with at least 1 RT vCPU and 1 ordinary vCPU. See hw:cpu_realtime_mask or hw_cpu_realtime_mask (HTTP 400) (Request-ID: req-0f09c25a-9f56-4baf-9519-71d5b3abae29)
openstack flavor create --ram 1024 --vcpu 4 --disk 1 realtime4
openstack flavor set --property hw:cpu_realtime=yes realtime4
openstack flavor set --property hw:cpu_policy=dedicated realtime4
openstack flavor set --property hw:cpu_realtime_mask=^0-1 realtime4
openstack server create --flavor realtime4 --image cirros-0.3.4-x86_64-uec realtime4
[stack@localhost devstack]$ sudo virsh list
Id Name State
----------------------------------------------------
3 instance-00000003 running
[stack@localhost devstack]$ sudo virsh show 3
error: unknown command: 'show'
[stack@localhost devstack]$ sudo virsh dumpxml 3
<domain type='kvm' id='3'>
<name>instance-00000003</name>
<uuid>bcd4164b-f0da-4f70-8864-6514ff5c1c54</uuid>
<metadata>
<nova:instance xmlns:nova="http://openstack.org/xmlns/libvirt/nova/1.0">
<nova:package version="15.0.4"/>
<nova:name>realtime4</nova:name>
<nova:creationTime>2017-05-05 09:14:48</nova:creationTime>
<nova:flavor name="realtime4">
<nova:memory>1024</nova:memory>
<nova:disk>1</nova:disk>
<nova:swap>0</nova:swap>
<nova:ephemeral>0</nova:ephemeral>
<nova:vcpus>4</nova:vcpus>
</nova:flavor>
<nova:owner>
<nova:user uuid="2a925cf044ec4d8daace6d716c114e2b">admin</nova:user>
<