【OpenStack】OpenStack中的循环任务--以Nova为例

声明:
本博客欢迎转发,但请保留原作者信息!
新浪微博:@孔令贤HW;
博客地址:http://blog.csdn.net/lynn_kong
内容系本人学习、研究和总结,如有雷同,实属荣幸!


版本:Grizzly

说到循环任务,可能很多人首先想到的是python中的threading或者multiprocessing模块,使用起来相当的便利,但OpenStack有些例外。OpenStack中使用了大量的所谓的“绿色线程”(或者叫协程,与线程区别),而eventlet库基本包含了普通线程的所有操作,同时避免了线程切换带来的开销,在性能方面优于线程。关于eventlet,我并不是很懂,可以阅读其官方文档:http://eventlet.net/doc/index.html

为了实现定时循环任务,OpenStack自身又封装了eventlet实现了两种循环任务:
1. 定时间隔,即任务的两次执行会间隔特定的时间;
2. 动态间隔,即任务的第二次执行由第一次执行的返回值确定,这里要求任务要返回一个时间间隔。

以Nova为例,每个相关的Nova进程都会根据配置项来配置相关的循环任务。配置项主要有:

periodic_enable:表示是否允许执行循环任务(True/False)。
periodic_fuzzy_delay:一个时间值(单位是秒),每个进程启动时,会从这个时间值内随机选择一个时间作为循环任务的初始延迟。
periodic_interval_max:循环任务的最大执行间隔。动态间隔类型的任务使用,任务两次执行的间隔由该值和任务返回时间值的最小值确定。

1. 循环任务periodic_tasks

关于periodic_tasks,在我早期的一篇博客中有讲到(http://blog.csdn.net/lynn_kong/article/details/8244364),这里主要关注任务执行的间隔。periodic_task是动态间隔类型,一个periodic_tasks的执行,包含了许多子任务,每一个子任务又有各自不同的设置:

external_process_ok:(True/False)表示可以在单独进程中执行的任务。如果配置项run_external_periodic_tasks为False,则该属性为True的任务不在循环任务中执行(会由独立的进程执行)。
enabled:子任务是否可以执行。
spacing:子任务执行的大概的时间间隔,这个值并不是特别的精确。如果小于0,则不执行。没有设置时间间隔的子任务会在periodic_tasks的每次执行时运行。
run_immediately:(True/False)是否立即执行。

两次periodic_task的执行间隔,是idle time和periodic_interval_max的最小值决定。这里的periodic_interval_max是配置项,而idle time就跟每一个子任务的执行有关。具体来说:
1. idle time有一个初始值60s;
2. 如果所有的子任务都没有设置spacing的值,则两次periodic_task的执行间隔就是60s(从第一次执行完毕到第二次执行开始的时间间隔)
3. 如果一个子任务设置了spacing的值,但还没到执行时间,则将idle time设置为距离该子任务下次执行的等待时间;
4. 如果一个子任务成功执行,且它的spacing小于目前的idle time,则将idle time设置为spacing的值;
子任务循环结束后,periodic_task返回idle time,就是periodic_task要睡眠的时间。

上面是以periodic_task的视角来说明两次periodic_task的执行间隔如何确定。下面以某一个子任务的视角,来说明periodic_task执行时,子任务的处理策略:
1. 如果子任务没有配置spacing,执行(子任务两次执行的最小间隔是60s);
2. 如果子任务配置了spacing,但还没到执行时间(距离上次执行的时间间隔小于spacing的值),将idle time设置为等待时间(如果等待时间小于当前的idle time的值);

3. 如果子任务配置了spacing,并且到了执行时间,执行。将idle time设置为spacing的值(如果spacing的值小于idletime);


2. 子任务

Nova中目前有14个子任务,分别为:
1) _check_instance_build_time
配置instance_build_timeout时执行。将BUILDING持续时间超过instance_build_timeout的虚拟机状态置为ERROR。这里不区分虚拟机是否在本节点。

2) _heal_instance_info_cache
找到本机的一个虚拟机,从Quantum获取并更新虚拟机网络信息,(instance_info_caches表)

3) _poll_rebooting_instances(libvert没有实现)
调用driver的poll_rebooting_instances方法

4) _poll_rescued_instances
配置rescue_timeout大于0时执行。对本节点中状态为rescued且持续时间大于rescue_timeout的虚拟机,执行unrescue操作

5) _poll_unconfirmed_resizes
配置resize_confirm_window 大于0时执行。resize虚拟机后(虚拟机在本机是resized状态),过了resize_confirm_window配置的时间,从migrations表中找出记录,执行confirm_resize操作

6) _instance_usage_audit
虚拟机审计。如果配置项instance_usage_audit为True,且task_log表中不存在最近一个周期(instance_usage_audit_period,默认是month)的审计记录时,执行。从数据库中获取在一个周期内存在(包括在周期内删除和新创建)的虚拟机信息,并调用notifier.notify(),同时增加task_log表的审计记录

7) _poll_bandwidth_usage(libvert没有实现)
每隔bandwidth_poll_interval运行一次,运行时调用driver的get_all_bw_counters方法,更新bw_usage_cache表

8) _poll_volume_usage(G版新增)
如果配置项volume_usage_poll_interval不等于0执行。同样使用TaskLog表的信息,如果当前时刻与上一周期开始的时间间隔大于volume_usage_poll_interval执行。首先获取本机上所有虚拟机挂载的卷,作为driver的get_all_volume_usage方法的入参(目前只有libvert实现该方法),获取卷的使用信息,更新volume_usage_cache表。

9) _report_driver_status(提供给nova-scheduler使用)
每隔host_state_interval运行一次,运行时调用driver的get_host_stats方法,更新manager对象的last_capabilities属性,这个属性会定时上报给nova-scheduler作为调度依据。内容包括:vcpu,disk,memory,hypervisor等信息。

10) _sync_power_states,虚拟机状态刷新,spacing=600
获取db中本机上的虚拟机,(会调用driver的get_num_instances方法获取虚拟机个数),根据db中的虚拟机做循环:
a) 忽略有task_state(正在处理)的虚拟机
b) 调用driver的get_info方法获取节点虚拟机信息,若找不到,power_state=NOSTATE
c) 若db中的power_state与driver返回的power_state不一致,以driver为准,更新db
d) 若db中的vm_state=BUILDING|RESCUED|RESIZED|SUSPENDED|PAUSED|ERROR,忽略
e) 若db中的vm_state==ACTIVE,而power_state是[SHUTDOWN, CRASHED, SUSPENDED],调用nova-api的stop接口停止虚拟机;如果power_state是[PAUSED|NOSTATE],忽略
f) 若db中的vm_state==STOPPED,而power_state不是[NOSTATE, SHUTDOWN, CRASHED],调用nova-api的stop接口停止虚拟机

11) _reclaim_queued_deletes
删除过期的soft_delete的虚拟机(前提:reclaim_instance_interval大于0)。

12) update_available_resource,主机资源刷新
保证主机记录的资源使用(ResourceTracker)与底层的hypervisor的使用情况一致。

13) _cleanup_running_deleted_instances,spacing=running_deleted_instance_poll_interval,默认是1800
找到本机中在DB中是deleted状态,但在虚拟化层仍然存在的虚拟机(调用driver的list_instances方法),若删除时间大于running_deleted_instance_timeout,按照running_deleted_instance_action配置的方式处理(noop, log, reap)

14) _run_image_cache_manager_pass,spacing=image_cache_manager_interval,默认是2400
要求driver的capabilities["has_imagecache"]为True,且配置image_cache_manager_interval时执行。管理本地镜像文件缓存。就是把长时间不使用的镜像文件缓存删除掉。这里需要注意的是,使用共享存储时的时间配置。因为一个compute node不需要的镜像缓存,可能会被其他compute node使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值