nova源码分析--创建虚拟机(5)

本文详细解析了Nova在创建虚拟机时的调度过程,从`schedule_and_build_instances`开始,逐步剖析了如何选择物理节点,涉及scheduler_utils、ComputeTaskManager、FilterScheduler等关键组件。调度过程包括过滤器的选择、权重计算以及资源声明,展示了如何根据配置文件调整过滤器和度量标准来优化调度策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

self.compute_task_api.schedule_and_build_instances函数的定义在nova/conductor/api.py中的类ComputeTaskAPI中,代码如下:

    def schedule_and_build_instances(self, context, build_requests,
                                     request_spec, image,
                                     admin_password, injected_files,
                                     requested_networks, block_device_mapping,
                                     tags=None):
        self.conductor_compute_rpcapi.schedule_and_build_instances(
            context, build_requests, request_spec, image,
            admin_password, injected_files, requested_networks,
            block_device_mapping, tags)

直接调用self.conductor_compute_rpcapi.schedule_and_build_instances函数,该函数在文件nova/conductor/rpcapi.py中的ComputeTaskAPI类中定义,代码如下:

    def schedule_and_build_instances(self, context, build_requests,
                                     request_specs,
                                     image, admin_password, injected_files,
                                     requested_networks,
                                     block_device_mapping,
                                     tags=None):
        version = '1.17'
        kw = {'build_requests': build_requests,
              'request_specs': request_specs,
              'image': jsonutils.to_primitive(image),
              'admin_password': admin_password,
              'injected_files': injected_files,
              'requested_networks': requested_networks,
              'block_device_mapping': block_device_mapping,
              'tags': tags}

        if not self.client.can_send_version(version):
            version = '1.16'
            del kw['tags']

        cctxt = self.client.prepare(version=version)
        cctxt.cast(context, 'schedule_and_build_instances', **kw)

     准备参数kw,通过rpc调用服务端的schedule_and_build_instances函数。服务端对应的函数在文件nova/conductor/manager.py中的类ComputeTaskManager中,代码如下:

    def schedule_and_build_instances(self, context, build_requests,
                                     request_specs, image,
                                     admin_password, injected_files,
                                     requested_networks, block_device_mapping,
                                     tags=None):
        # Add all the UUIDs for the instances
        instance_uuids = [spec.instance_uuid for spec in request_specs]
        try:
            hosts = self._schedule_instances(context, request_specs[0],
                                             instance_uuids)
        except Exception as exc:
            LOG.exception('Failed to schedule instances')
            self._bury_in_cell0(context, request_specs[0], exc,
                                build_requests=build_requests,
                                block_device_mapping=block_device_mapping)
            return

      self._schedule_instances函数的功能为为将要创建的虚拟机挑选运行的物理节点,代码定义如下:

    def _schedule_instances(self, context, request_spec,
                            instance_uuids=None):
        scheduler_utils.setup_instance_group(context, request_spec)
        hosts = self.scheduler_client.select_destinations(context,
            request_spec, instance_uuids)
        return hosts

scheduler_utils.setup_instance_group函数的定义在文件./nova/scheduler/utils.py中,获取group相关的信息,并设置到request_spec.instance_group中的变量。self.scheduler_client.select_destinations通过一系列的包装调用,最后将调用./nova/scheduler/rpcapi.py文件中的类SchedulerAPI中的select_destinations函数,定义如下:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值