记录一次OpenStack由于资源缓存引起虚拟机创建失败的分析过程

本文记录了一次在OpenStack环境中遇到的虚拟机创建失败的问题,问题根源在于资源缓存导致磁盘大小校验不通过。通过分析日志和源码,发现在nova/compute/manager.py中的资源limit校验失败,而实际磁盘大小远超限制。经过对调度、过滤器和资源追踪等模块的排查,发现问题是由于OpenStack的资源缓存导致。解决方案是重启相关服务,包括openstack-nova-api、openstack-nova-scheduler和openstack-nova-conductor。

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

目前在OpenStack使用中遇见虚拟机创建失败的问题
问题表现为:

  1. 虚拟机调度正常
  2. 资源充足
  3. 资源配额充足,设置没有限制
  4. 主机资源调度返回的资源大小正常与实际匹配
  5. 磁盘大小校验不通过,最后limit限制为本地磁盘大小
问题现象:

创建一台虚拟机
状态ERROR, 报错:nova/compute/manager.py 1902
原因是资源limit, 校验不通过:
{u'memory_mb': 130669.0, u'disk_gb': 199.0}

但真实disk size 远远大于199GB

问题分析过程

查看日志

 INFO nova.compute.manager [req-ac70ea37-c0df-4909-8322-... - - -] {u'memory_mb': 130669.0, u'disk_gb': 199.0}
 INFO nova.compute.claims [req-ac70ea37-c0df-4909-8322-2...- - -] [instance: BE099D73-3273-489C-B468-1772C17A2A74] Attempting claim: memory 2048 MB, disk 60 GB, vcpus 1 CPU
 INFO nova.compute.claims [req-ac70ea37-c0df-4909-8322-2...- - -] [instance: BE099D73-3273-489C-B468-1772C17A2A74] Total memory: 130669 MB, used: 23552.00 MB
 INFO nova.compute.claims [req-ac70ea37-c0df-4909-8322-2...- - -] [instance: BE099D73-3273-489C-B468-1772C17A2A74] memory limit: 130669.00 MB, free: 107117.00 MB
 INFO nova.compute.claims [req-ac70ea37-c0df-4909-8322-2...- - -] [instance: BE099D73-3273-489C-B468-1772C17A2A74] Total disk: 111710 GB, used: 181.00 GB
 INFO nova.compute.claims [req-ac70ea37-c0df-4909-8322-2...- - -] [instance: BE099D73-3273-489C-B468-1772C17A2A74] disk limit: 199.00 GB, free: 18.00 GB
 INFO nova.compute.claims [req-ac70ea37-c0df-4909-8322-2...- - -] [instance: BE099D73-3273-489C-B468-1772C17A2A74] Total vcpu: 31 VCPU, used: 4.00 VCPU
 INFO nova.compute.claims [req-ac70ea37-c0df-4909-8322-2...- - -] [instance: BE099D73-3273-489C-B468-1772C17A2A74] vcpu limit not specified, defaulting to unlimited
 INFO nova.compute.manager [req-ac70ea37-c0df-4909-8322-... - - -] [instance: BE099D73-3273-489C-B468-1772C17A2A74] Took 0.06 seconds to deallocate network for instance.
 INFO nova.compute.resource_tracker [req-e1d70ac4-a379-4.... - -] Total usable vcpus: 31, total allocated vcpus: 4
 INFO nova.compute.resource_tracker [req-e1d70ac4-a379-4.... - -] Final resource view: name=test phys_ram=130669MB used_ram=23552MB phys_disk=111710GB used_disk=181GB total_vcpus=31 used_vcpus=4 pci_stats=[]
 WARNING nova.scheduler.client.report [req-e1d70ac4-a379.... - - -] Unable to refresh my resource provider record
 INFO nova.compute.resource_tracker [req-e1d70ac4-a379-4.... - -] Compute_service record updated for test:test

查看源码: nova/compute/manager.py

    def _build_and_run_instance(self, context, instance, image, injected_files,
            admin_password, requested_networks, security_groups,
            block_device_mapping, node, limits, filter_properties):

        image_name = image.get('name')
        self._notify_about_instance_usage(context, instance, 'create.start',
                extra_usage_info={'image_name': image_name})

        self._check_device_tagging(requested_networks, block_device_mapping)

        try:
            rt = self._get_resource_tracker(node)
            with rt.instance_claim(context, instance, limits):
                # NOTE(russellb) It's important that this validation be done
                # *after* the resource tracker instance claim, as that is where
                # the host is set on the instance.
                self._validate_instance_group_policy(context, instance,
                        filter_properties)
                image_meta = objects.ImageMeta.from_dict(image)
                with self._build_resources(context, instance,
                        requested_networks, security_groups, image_meta,
                        block_device_mapping) as resources:
                    instance.vm_state = vm_states.BUILDING
          
<think>好的,用户现在遇到了OpenStack创建虚拟机速度慢的问题。我需要仔细分析可能的原因,并给出相应的解决方案。首先,我要回忆一下OpenStack创建虚拟机的基本流程,这样才能更好地理解哪里可能出现瓶颈。 用户之前询问过关于RabbitMQ的错误,现在转向OpenStack,可能他们在使用OpenStack时遇到了性能问题。创建虚拟机慢可能涉及多个组件,比如Nova、Glance、Cinder、Neutron等,每个环节的延迟都可能影响整体时间。 首先,常见的原因可能包括镜像下载慢、网络配置延迟、资源不足、计算节点性能问题、数据库或消息队列的瓶颈,以及配置错误等。比如,如果Glance存储后端是远程的,比如使用HTTP或者NFS,下载镜像的时间可能会很长,特别是大镜像。此外,如果使用Cinder卷作为根磁盘,卷创建和附加的时间也会增加启动时间。 网络方面,Neutron配置复杂的安全组、防火墙规则,或者DHCP分配IP的时间过长,也可能导致延迟。计算节点本身的资源不足,比如CPU过载、内存不足、磁盘I/O瓶颈,或者虚拟机启动时的资源调度问题,都会影响创建速度。此外,数据库查询慢,或者RabbitMQ消息队列堆积,导致任务处理延迟,也可能是一个因素。 另外,配置错误比如同步操作被错误地设置为同步,或者日志级别过高导致磁盘I/O压力大,也可能拖慢速度。还有可能是虚拟机镜像本身的问题,比如cloud-init配置了复杂的启动脚本,或者镜像没有预先生成缓存。 我需要一步步引导用户检查这些可能的环节。比如,检查Nova的日志,查看在创建过程中哪个阶段耗时最长。查看Glance的镜像下载时间,确认存储后端是否高效。检查计算节点的资源使用情况,是否有足够的CPU、内存和磁盘性能。同时,确认Neutron的网络配置是否合理,安全组规则是否过多。还要检查数据库和消息队列的性能,是否有慢查询或者消息堆积。 对于镜像下载的问题,可以建议使用本地镜像缓存或者更快的存储后端。对于网络配置,可以简化安全组规则,或者预分配端口。资源调度方面,可以调整过滤器和权重设置,优化资源分配。如果是Cinder卷的问题,可以考虑使用本地存储或者更快的存储解决方案。此外,优化数据库索引,调整消息队列的配置,也能提升整体性能。 最后,建议用户逐步排查,从日志入手,确定具体的瓶颈所在,然后针对性地进行优化。如果有具体的日志信息或环境配置,可以进一步分析。</think>--- ### 问题分析 OpenStack 创建虚拟机(实例)速度慢可能由多个环节的瓶颈引起,涉及计算节点(Nova)、镜像服务(Glance)、网络(Neutron)、存储(Cinder)等组件的协作效率。以下是常见原因及优化方法: --- ### 常见原因与解决方案 #### 1. **镜像下载耗时(Glance 瓶颈)** - **现象**:虚拟机启动卡在 `Downloading image` 阶段。 - **原因**: - Glance 镜像存储后端性能差(如远程 HTTP/NFS)。 - 镜像文件过大(如未压缩的 RAW 格式镜像)。 - **解决方案**: - **启用镜像缓存**:在计算节点本地缓存常用镜像(修改 `nova.conf`): ```ini [glance] # 启用本地缓存 disk_cachemode = writeback # 指定缓存路径 image_cache_manager_interval = 300 image_cache_subdirectory_name = _base ``` - **压缩镜像**:将镜像转换为 `qcow2` 格式并压缩: ```bash qemu-O qcow2 -c source.img compressed.qcow2 ``` - **使用高效存储后端**:将 Glance 后端切换至 Ceph/Swift 或本地 SSD。 --- #### 2. **网络配置延迟(Neutron 瓶颈)** - **现象**:虚拟机启动卡在 `Networking` 或 `Allocating IP` 阶段。 - **原因**: - 安全组规则复杂,导致虚拟机端口初始化耗时。 - DHCP 服务响应慢(如大规模租户网络)。 - **解决方案**: - **简化安全组规则**:合并重复规则,减少规则数量。 - **预创建端口(Port Pre-Creation)**:提前创建 Neutron 端口并指定给实例: ```bash openstack port create --network <network_id> --security-group <sg_id> my-port openstack server create --port my-port ... ``` - **优化 Neutron 配置**: - 启用 `dnsmasq` 缓存(修改 `neutron-dhcp-agent.ini`): ```ini dnsmasq_local_resolv = True dnsmasq_dns_servers = 8.8.8.8,8.8.4.4 ``` -- #### 3. **资源调度与计算节点性能(Nova 瓶颈)** - **现象**:虚拟机长时间处于 `Scheduling` 状态或启动后初始化缓慢。 - **原因**: - 计算节点 CPU/内存资源不足或负载过高。 - 磁盘 I/O 瓶颈(如共享存储性能不足)。 - **解决方案**: - **优化调度策略**:调整 Nova 调度器权重(`nova.conf`): ```ini [filter_scheduler] enabled_filters = RetryFilter, AvailabilityZoneFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter weight_classes = nova.scheduler.weights.all_weighers ``` - **隔离资源**:为关键实例分配专属计算节点。 - **升级硬件**:使用 SSD 替换机械硬盘,提升磁盘 I/O。 --- #### 4. **卷创建与挂载延迟(Cinder 瓶颈)** - **现象**:使用 Cinder 卷作为根磁盘时启动缓慢。 - **原因**: - Cinder 后端存储(如 iSCSI/LVM)性能不足。 - 卷创建时未启用快缓存(如 Writeback 模式)。 - **解决方案**: - **使用本地存储**:对于非持久化需求,使用 Nova 本地磁盘(`nova.conf`): ```ini [DEFAULT] # 指定本地磁盘类型 default_ephemeral_format = ext4 ``` - **启用 Cinder 缓存**:在 Cinder 节点配置缓存策略: ```ini [backend] volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver volume_backend_name = lvm-ssd # 启用写缓存 write_cache = enabled ``` -- #### 5. **日志与调试** 通过日志定位具体瓶颈环节: - **查看 Nova 日志**(默认路径 `/var/log/nova/nova-*.log`): ```bash grep "Instance created" /var/log/nova/nova-compute.log # 跟踪虚拟机创建时间线 ``` - **检查 Neutron 日志**(`/var/log/neutron/*.log`): ```bash grep "Port binding" /var/log/neutron/server.log # 查看端口绑定耗时 ``` --- ### 快速优化示例 1. **禁用不必要的服务**: - 关闭控制台的无密码访问(`noVNC/SPICE`)以缩短初始化时间: ```ini [vnc] enabled = False ``` 2. **预缓存镜像**: ```bash openstack image list # 获取镜像 ID nova-manage image cache --image <image_id> --update # 主动缓存到计算节点 ``` 3. **调整虚拟机启动参数**: ```bash openstack server create --flavor <flavor> \ --image <image> \ --config-drive True \ # 避免 metadata 服务延迟 --key-name <key> \ --nic net-id=<net_id> \ my-instance ``` --- ### 总结 OpenStack 虚拟机创建速度慢通常由 **镜像下载**、**网络配置** 或 **计算节点资源** 导致。建议优先优化镜像存储、简化网络策略,并通过日志分析具体瓶颈。生产环境中,建议使用 Ceph 作为统一存储后端,并结合硬件加速(如 SR-IOV/DPDK)提升网络性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值