Openstack 的调度策略主要是由Filter 和 chance实现的。
一、Filter调度器(过滤调度器):据指定的过滤条件以及权重选择最佳的计算节点,实现基于主机过滤(filtering)和权重计算(weight)的调度算法。
Nova.conf 中的 scheduler_available_filters 选项用于配置scheduler可用的过滤器,默认是所有nova自带的filter都可以用于过滤操作
scheduler_available_filters = nova.scheduler.filters.all_filters
另外还有一个选项 scheduler_default_filters,用于指定 nova-scheduler真正使用的filter,默认值如下
scheduler_default_filters = RetryFilter, AvailabilityZoneFilter, RamFilter, DiskFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter
Filter scheduler 将按照列表中的顺序依次过滤。
- RetryFilter 作用是刷掉之前已经调度过的节点。
- CoreFilter 核心过滤器,根据可用cpu核心来调度虚拟机创建,将不能满足实例类型VCPU需求的计算节点过滤掉,vcpu允许超量。通过配置文件【cpu_allocation_ratio=<None>】来调节。默认值是16
- DiskFilter 硬盘调度器,根据磁盘空间来调度虚拟机实例,将不能满足磁盘需求的计算节点过滤掉。此爬满允许超量。通过配置文件【disk_allocation_ratio=<None>】来调节。# 默认值是1.0
- RamFilter 内存过滤器,根据可用内存调度虚拟机创建,将不能满足实例类型内存需求的计算节点过滤掉,为提高系统资源利用率,在计算节点的可用内存时允许超过实际内存大小,通过nova.conf配置文件中【ram_allocation_ratio=<None> 】来控制。 # 默认值是1.5 其含义是:如果计算节点的内存有 10GB,OpenStack 则会认为它有 15GB(10*1.5)的内存。
- AvailabilityZoneFilter 为提高容灾性和提供隔离服务,可以将计算节点划分到不同的Availability Zone中。
- ComputeFilter 计算过滤器,保证只有 nova-compute 服务正常工作的计算节点才能够被 nova-scheduler调度。是必选的过滤器。
- ComputeCapabilitiesFilter 算能力过滤器,根据计算节点的特性来筛选。
- ImagePropertiesFilter 镜像过滤器,根据所选image的属性来筛选匹配的计算节点。跟flavor类image也有metadata用于指定其属性。
- ServerGroupAntiAffinityFilter 可以尽量将 Instance(实例) 分散部署到不同的计算节点上。
- ServerGroupAffinityFilter 会尽量将 instance 部署到同一个计算节点上。
权重计算:在配置文件nova.scheduler.weights.all_weighers 中,默认的基于scheduler_weight_classes 类
【weight_classes=nova.scheduler.weights.all_weighers】
- RAMWeigher: 通过可用的RAM大小决定计算节点。
- DiskWeigher: 通过可用的磁盘大小进行权值分配,最大的优先级最高。
- MetricsWeigher:通过主机的不同参数度量决定主机的权值。在配置文件中指定相关参数:metrics_weight_setting = name1=1.0,name2=-1.0
- IoOpsWeigher: 通过主机的负载进行权重计算,默认选择负载最小的主机。
- ServerGroupSoftAffinityWeigher:通过同一个主机组中运行的实例数进行权重计算。
默认实现是根据计算节点空闲的内存量计算权重值:空闲内存越多,权重越大,实例将被部署到当前空闲内存最多的计算节点上
二、Chance调度器(随机调度器):从所有正常运行nova-compute服务的节点中随机选择来创建实例
三、Simple调度器
修改相关配置文件,修改调度器规则采用缓存调度器,缓存主机信息,提升调度时间