Nova Compute定时任务(二)

这篇文章,我们来详细的分析一下Nova Compute服务的update_available_resource定时任务。

update_available_resource定时任务的主要功能是定时更新Nova Compute服务所管理的计算节点的资源信息,它对应的周期方法就是ComputeManager类的update_available_resource方法。来看一下update_available_resource方法。

class ComputeManager(manager.SchedulerDepedentManager):@manager.periodic_taskdef update_available_resource(self, context):new_resource_tracker_dict = {}#获取Nova Compute服务所有可用的节点 nodenames = set(self.driver.get_available_nodes())for nodename in nodenames:#获取计算节点的ResourceTracker对象 rt = self._get_resource_tracker(nodename)#更新计算节点的资源信息 rt.update_available_resource(context)#保存计算节点的资源信息 new_resource_tracker_dict[nodename] = rt#获取数据库中所有的计算节点compute_nodes_in_db = self._get_compute_nodes_in_db(context)for cn in compute_nodes_in_db:#从数据库中删除不可用的计算节点  if cn.get('hypervisor_hostname') not in nodenames:LOG.audit(_("Deleting orphan compute node %s") % cn['id'])self.conductor_api.compute_node_delete(context, cn)self._resource_tracker_dict = new_resource_tracker_dict可以看到update_available_resource方法主要实现了更新_resource_tracker_dict成员变量。_resource_tracker_dict成员变量保存了当前Nova Compute服务所管理的计算节点的硬件资源信息。我们来看代码中涉及到的两个主要方法。

1. driver.get_available_nodes方法

其中的driver成员变量是在nova.conf配置文件中配置的,这里使用的是LibvirtDriver类,所以该方法对应的是LibvirtDriver类的get_available_nodes方法。LibvirtDriver类的get_available_nodes方法返回的是当前Nova Compute服务所在的计算节点信息。

LibvirtDriver类继承自ComputeDriver类,get_available_nodes方法定义在ComputeDriver类中,其定义如下

class ComputeDriver(object):def get_available_nodes(self):#获取计算节点状态信息列表stats = self.get_host_stats(refresh=True)#将数据封装成列表类型if not isinstance(stats, list):stats = [stats]#返回计算节点的hypervisor_hostname列表return [s['hypervisor_hostname'] for s in stats]get_available方法主要调用了get_host_stats方法,get_host_stats方法定义在LibvirtDriver类中,其定义如下

class LibvirtDriver(driver.ComputeDriver):def get_host_stats(self, refresh=False):return self.host_state.get_host_stats(refresh=refresh)LibvirtDriver类的get_host_stats方法调用了host_state成员变量的get_host_stats方法。host_state变量是一个HostState对象,HostState类的get_host_stats方法定义如下

class HostState(object):def get_host_stats(self, refresh=False):if refresh:self.update_status()return self._statsHostState类的get_host_stats方法检查传入的refresh参数,如果为True,,则调用update_status方法来更新计算节点的资源状态信息;否则返回缓存的节点资源状态信息。这里,在ComputeDriver类的get_host_stats方法中传入的refresh参数为True,所以会调用HostState类的update_status方法。HostState类的update_status方法定义如下

class HostState(object):def update_status(self):data = {}data["vcpus"] = self.driver.get_vcpu_total() #虚拟机cpu总个数data["vcpus_used"] = self.driver.get_vcpu_used() #已使用的虚拟cpu个数data["cpu_info"] = jsonutils.loads(self.driver.get_cpu_info()) #cpu信息disk_info_dict = self.driver.get_local_gb_info() #获取磁盘使用情况data["disk_total"] = disk_info_dict['total'] #磁盘总大小data["disk_used"] = disk_info_dict['used'] #已使用的磁盘大小data["disk_available"] = disk_info_dict['free'] #剩余的磁盘大小data["host_memory_total"] = self.driver.get_memory_mb_total() #总内存大小data["host_memory_free"] = (data["host_memory_total"] -self.driver.get_memory_mb_used()) #剩余的内存大小data["hypervisor_type"] = self.driver.get_hypervisor_type() #hypervisor类型data["hypervisor_version"] = self.driver.get_hypervisor_version() #hypervisor版本data["hypervisor_hostname"] = self.driver.get_hypervisor_hostname() #hypervisor主机名data["supported_instances"] = self.driver.get_instance_capabilities() #支持的虚拟机特性self._stats = datareturn data可以看到HostState类的update_status方法通过driver变量的方法获取计算节点的各种硬件信息,这里driver变量为LibvirtDriver类。以获取虚拟机的总个数的get_vcpu_total方法为例,相当于执行了如下命令:

virsh nodeinfo2. rt.update_available_resource方法

其中的rt成员变量为ResourceTracker类,ResourceTracker类的update_available_resource方法定义如下

class ResourceTracker(object):@lockutils.synchronized(COMPUTE_RESOURCE_SEMAPHORE, 'nova-')    def update_available_resource(self, context):#获取计算节点上可用的硬件资源resources = self.driver.get_available_resource(self.nodename)…#检查数据格式self._verify_resources(resources)#获取计算节点上的所有虚拟机实例instances = self.conductor_api.instance_get_all_by_host_and_node(            context, self.host, self.nodename)#为节点上的虚拟机更新硬件资源信息self._update_usage_from_instances(resources, instances)#获取计算节点上正在迁移的虚拟机实例capi = self.conductor_apimigrations = capi.migration_get_in_progress_by_host_and_node(context,                self.host, self.nodename)#为正在迁移的虚拟机更新硬件资源信息self._update_usage_from_migrations(context, resources, migrations)#查找计算节点上的“孤儿”虚拟机orphans = self._find_orphaned_instances()#为“孤儿”虚拟机更新硬件资源信息self._update_usage_from_orphans(resources, orphans)self._report_final_resource_view(resources)#更新数据库中计算节点硬件资源信息self._sync_compute_node(context, resources)代码05行调用ComputeDriver类的get_available_resource方法获取计算节点硬件资源信息。ComputeDriver类的get_available_resource方法和HostState类的update_status方法类似。代码10~13行,根据计算节点启动的虚拟机数目和规格,更新计算节点上硬件资源的使用情况。这里的虚拟机都是Nova服务启动的,它们在数据库中都有相应的记录。代码15~19行,根据计算节点上正在迁移的虚拟机数目和规格,更新节点的硬件资源使用情况。代码21~23行根据“孤儿”虚拟机的数目和使用的资源,更新节点的硬件资源使用情况。所谓“孤儿”虚拟机,是指那些不是由Nova服务创建的虚拟机,这些虚拟机在Nova数据库没有记录。

人生就是一次充满未知的旅行,在乎的是沿途的风景,

Nova Compute定时任务(二)

相关文章:

你感兴趣的文章:

标签云: