OpenStack使用Placement做资源管理时虚拟机无法调度的一次排错记录

Error: No valid host was found. 使用openstack创建虚拟机经常会遇到以下的这个错误 Error: No valid host was found. There are not enough hosts available. 从字面意思就可以看出是无法找到可用的host的资源来创建虚拟机。 再深一层的分析就是为什么会无法找到host主机呢? 原因有多种,有可能是计算节点down了,但这个原因相信大家都能轻易的分析出来... 阅读详情

1. 场景说明

计算节点能分配的最大虚拟机资源不能大于自身资源 – 出错时还挂在嘴边,但真正有所体会和认知,往往是在挨了毒打之后

组件版本备注
OpenStacktrain
Nova20.6.0-1
Placement2.0.1-1
python2-osc-placement1.7.0-1安装之后就可以使用OpenStack命令行操作placement api了,例如resource provider 等命令
计算节点CPU个数48
计算节点CPU超分比4

环境信息如上,需要申请一台64C128G的虚拟机,申请时秒报错

1.1. 日志

排错时日志开debug模式
如果是高可用模式,则先只保留一个可用的服务做测试,其余的都关闭

  • /var/log/nova/nova-conductor.log
e0210a948 0fe34a6944b4416195ff5176f681c34f - default default] Failed to schedule instances: NoValidHost_Remote: No valid host was found.
Traceback (most recent call last):

  File "/usr/lib/python2.7/site-packages/oslo_messaging/rpc/server.py", line 235, in inner
    return func(*args, **kwargs)

  File "/usr/lib/python2.7/site-packages/nova/scheduler/manager.py", line 199, in select_destinations
    raise exception.NoValidHost(reason="")

NoValidHost: No valid host was found.
  • /var/log/nova/nova-scheduler.log
20596:2021-07-30 14:46:16.665 175316 INFO nova.scheduler.manager [None req-cb66e713-19a8-45d2-b107-dd31569f4653 b5957a478f0d4c328ef10cee0210a948 0fe34a6944b4416195ff5176f681c34f - default default] Got no allocation candidates from the Placement API. This could be due to insufficient resources or a temporary occurrence as compute nodes start up.
  • /var/log/placement/placement.log
2021-07-30 16:31:39.909 4638 INFO placement.requestlog [req-5081ba30-e270-446b-afc6-ce5fa550088c 563e3a05b24e4360b884ef0ca35a71ef b3d671ef1603499ab9744dad3a66c26d - default default] 172.16.88.187 "GET /resource_providers/49905d0d-8b33-434a-8bc5-6a73898b9922/allocations" status: 200 len: 259 microversion: 1.0\x1b[00m
2021-07-30 16:31:41.237 4637 DEBUG placement.requestlog [req-54b926ab-64fb-404b-b274-6aa22acadce3 - - - - -] Starting request: 172.16.88.187 "GET /allocation_candidates?resources=VCPU%3A64" __call__ /usr/lib/python2.7/site-packages/placement/requestlog.py:61\x1b[00m
2021-07-30 16:31:41.293 4637 DEBUG placement.objects.research_context [req-54b926ab-64fb-404b-b274-6aa22acadce3 b5957a478f0d4c328ef10cee0210a948 0fe34a6944b4416195ff5176f681c34f - default default] getting providers with 64 VCPU __init__ /usr/lib/python2.7/site-packages/placement/objects/research_context.py:126\x1b[00m
2021-07-30 16:31:41.296 4637 DEBUG placement.objects.research_context [req-54b926ab-64fb-404b-b274-6aa22acadce3 b5957a478f0d4c328ef10cee0210a948 0fe34a6944b4416195ff5176f681c34f - default default] found no providers with 64 VCPU __init__ /usr/lib/python2.7/site-packages/placement/objects/research_context.py:130\x1b[00m

通过日志可以看出大致的调用链:
nova-api -> nova-conductor -> nova-schduler -> placement
问题在于调用placement api /allocation_candidates 返回了200 但是scheduler还是没选到资源,就需要看看他返回了什么信息,辅之以debug信息found no providers看下为什么没有prividers

2. 排查过程

排查问题一般到无法通过日志分析出问题的时候才看代码,直接看不熟的代码耗时比较长

2.1. 资源够用吗

openstack hypervisor list
openstack hypervisor show xxxxx

以上两条命令可以看到计算节点的资源情况,最直观的在dashboard 管理员 虚拟机管理器查看即可,比较细致的可以看数据库

placement库

/* 12:08:23 PM dev-openstack01 placement */ 
SELECT * FROM `inventories`;
/* output */
/* allocation ratio 列为超分比对应到resource_class_id 0 为cpu 1 为内存 2 为硬盘 */
2021-05-12 03:35:15	2021-05-21 00:48:33	4	2	0	48	0	1	48	1	4

总资源查询如上,已用资源查询如下

/* 12:11:32 PM dev-openstack01 placement */
SELECT * FROM `allocations` ORDER BY `consumer_id` LIMIT 0,1000;

consumer_id对应的虚拟机uuid,一般情况每个uuid对应三个资源 cpu内存磁盘,如果有一个uuid对应6个或者更多则说明该虚拟机占着好几个茅坑不拉屎,释放资源即可 具体操作参照这篇博客

释放资源操作

PLACEMENT_ENDPOINT=$(openstack endpoint list|grep placement|awk '{print $((NF-1))}'|uniq)
TOKEN=$(openstack token issue -f value -c id)
curl ${PLACEMENT_ENDPOINT}/allocations/01b6377f-5b0c-4273-a24a-921f793b3004 -H "x-auth-token: $TOKEN" -X DELETE

实际资源超分之后完全足够,回到日志,继续看为什么没有能调度到节点

2.2. Placement Debug

手动调用下 allocation_candidates

  • 工具 postman
    • url路径 从placement日志中看到的?resources=VCPU%3A64 用url解码下 ?resources=VCPU:64
      完整路径为 http://172.16.88.191:8778/allocation_candidates?resources=VCPU:64
    • 需要注意额外加两个 header
      • X-OpenStack-AUTH 值为TOKEN
      • OpenStack-API-Version 值为 placement 1.10(默认version是1.0 无法使用allocation_candidates api填一个介于最大1.36最小1.0中间的即可)

或者可以用OpenStack命令行工具,使用命令行工具时需要安装 python2-osc-placement

openstack --debug --os-placement-api-version 1.10 allocation candidate list --resource VCPU=64

结果都是为空,这时候需要debug看下代码怎么算的,如果对代码非常熟就可以用pdb定点打断点了,如果不是很熟建议用ide远程调试Pycharm调试OpenStack,这样每一步都有详细的输出

2.3. API启动脚本

默认部署通过httpd启动 /etc/httpd/conf.d/00-placement-api.conf
debug可以直接按启动脚本的关键命令启动 placement-api 默认启动端口为8000,建议用endpoint的地址8778

启动命令为placement-api --port 8778

2.4. 具体处理过程

代码路径 /usr/lib/python2.7/site-packages/placement

  • 路由

handle.py

    '/allocation_candidates': {
        'GET': allocation_candidate.list_allocation_candidates,
    },
  • controller

    • handles/allocation_candidate.py

    list_allocation_candidates -> ac_obj.AllocationCandidates.get_by_requests -> _get_by_requests

  • 查数据库

    • objects/research_context.py
      res_ctx.RequestGroupSearchContext -> get_providers_with_resource
      直接看注释的mysql命令更好懂
        SELECT rp.id, rp.root_provider_id
      FROM resource_providers AS rp
      JOIN inventories AS inv
       ON rp.id = inv.resource_provider_id
       AND inv.resource_class_id=0
      LEFT JOIN (
       SELECT
         alloc.resource_provider_id,SUM(alloc.used) AS used
       FROM allocations AS alloc
       WHERE alloc.resource_class_id=0
       GROUP BY alloc.resource_provider_id
      ) AS usages
       ON inv.resource_provider_id = usages.resource_provider_id
      WHERE
       used + 64<= ((total - reserved) * inv.allocation_ratio)
       AND inv.min_unit <= 64
       AND inv.max_unit >= 64
       AND (64 % inv.step_size)=0
    

通过语句关键问题在inv.max_unit>=64 max_unit在数据表inventories中对应resource_class_id=0就是cpu,可以看到最大cpu为48,最大cpu个数即为物理机核数-预留核数
到这里placemnt部分debug完成了,剩下的问题是 为什么最大值没有乘以超分倍数

3. 思考

3.1. 为什么单个资源分配上限没有乘以超分倍数

举个不太恰当的例子,一座桥上能跑很多很多小型汽车、双层汽车、大卡车等等宽度小于桥面的车,当宽度大于桥面时就过不去了,车不能折叠

回到计算机,操作系统分时使用CPU,每个核心在一个时钟周期类只执行一条CPU指令

  • 当有48核心时同时能够执行48条指令,如果48八个物理核心虚拟出来了多个小于48和的虚拟核心,每个虚拟核心对应一个物理核心,当不同虚拟机同时执行指令时,需要排队等待获取CPU执行
  • 当虚拟机大于48核心时,48个虚拟核心有分配到物理CPU,剩下的CPU如何分配CPU,有没有这么做的必要?没有必要,CPU核数就那么多,实际上虚拟机进程使用CPU和物理机使用CPU是一样的方式,但内存磁盘不同

3.2. 拓展问题

内存超分和磁盘超分是怎么实现的
内存、磁盘都是IO设备,通过地址映射使用的,一般情况下每个进程分配的空间不会用到上限,所以挤一挤总能上

  • 内存超分
    内存生产环境不建议超分,不仅不能超分而且需要预留,内存不足时会触发物理机的oomkiiler开始杀进程,可能杀掉虚拟机进程,也可能杀掉物理机操作系统关键进程导致物理机操作系统宕机

  • 磁盘超分
    有一些存储支持稀疏配置,也就是用多少占多少空间,而不是分配多少占多少空间,这样只要没占的都可以分配出去,造成的问题就是前期分的很爽,没做好控制,后期使用率都上去存储面临爆盘风险,陷入被动扩容。

4. 参考文档

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 11 算法篇 在百万级虚拟机、百万级租户的超大规模云环境中,核心算法挑战包括:挑战维度具体问题算法需求技术复杂度规模性​百万级对象并发管理分布式算法、分区算法极高(NP-hard问题)多租户​租户间隔离与资源共享公平性算法、隔离算法高(多目标优化)动态性​资源需求实时变化自适应算法、在线算法高(实时决策)异构性​硬件/负载/需求差异分类算法、匹配算法中高(多维度优化)经济性​资源利用率与成本平衡优化算法、博弈论算法高(多目标博弈)以下是按领域分类的详细算法列表:算法名称数学建模表达核心思想时间复杂度适用场景推理步骤首次适 阅读详情

相关推荐

openstack中出现NoValidHost_Remote: No valid host was found. There are not enough hosts available.相关问题

主要错误: 2021-06-03 03:33:51.608 44397 ERROR nova.compute.resource_tracker [req-b433d55f-1223-4d04-8a38-b2aad7d1abee - - - - -] Skipping removal of allocations for deleted instances: Failed to retrieve allocations for resource provider 09325504-01ea-4719-b6bb

代码讲故事 1903

先电OpenStack创建云主机报错500

现象: 从报错中可定位到问题出在nova的conductor组件中 日志: 查看/var/log/nova/nova-conductor.log 从日志中可以观察到是因为找不到cpu特性 解决方法: 进入/usr/share/libvirt/cpu_map.xml,搜索日志中报错的对应特性相关所有字段删除,重启libvirtd服务,再次尝试创建云主机,直至该类报错完全消失 建议将修改完成的文件保存好以便同类cpu部署 ...

Gonveft_Sakura的博客 2575

基于STM32的工业设备状态监测系统

工业设备的预测性维护需求日益增长,本文设计了一款基于STM32的智能监测终端,可实时采集设备振动、温度、电流等关键参数,通过边缘计算分析设备健康状态,实现故障预警与能效优化。系统支持4G/LoRa远程通信,适用于工厂、发电站等工业场景。本系统实现了工业设备关键参数的实时监测,故障识别准确率达到92%。:STM32F429(带FPU,支持浮点运算)多参数联合判据(振动+温度+电流突变检测)ACS712电流检测模块(0-30A)FFT频谱分析(识别轴承故障特征频率)故障代码生成(支持16种预设故障类型)

stm32d1219的博客 1321

openstack-nova-虚拟机创建流程以及源码分析(一)

即根据/etc/nova/nova.conf配置文件cells字段下面的enable参数来设置nova-api的类型,由于我们的环境采用默认配置,stein版本默认cell v2就是打开的,即enable=true,所以get_cell_type函数将返回api 值,因此nova-api为nova.compute.cells_api.ComputeCellsAPI,即self.compute_api为nova.compute.cells_api.ComputeCellsAPI对象。

一名运维开发工程师的日常记录 1750

[EDA系列]二、Altium Designer异形封装实战:从CAD导入到PCB布局

本文详细介绍了在Altium Designer中实现异形封装的实战流程。通过五步核心操作,将CAD软件中的复杂二维轮廓精准导入并转换为可直接用于PCB布局的智能封装,解决了不规则形状铺铜的难题,特别适用于射频天线、传感器外壳等对机械尺寸有严苛要求的设计场景。

weixin_29194817的博客 142

增程式永磁电机发电系统电压环二自由度控制器设计

本论文主要研究增程式永磁电机发电系统的电压环二自由度控制器设计。该系统采用二自由度控制策略,通过精确调节电压环和电流环,显著提高系统的动态响应性能和稳态稳定性。基于SVPWM(空间矢量脉宽调制)技术,本研究设计的电压环控制器能够在负载突变和外部扰动的情况下,快速恢复并保持电压稳定,从而满足增程式永磁电机发电系统对电压精度和稳定性的高要求。仿真分析表明,所设计的控制器在不同工况下展现出良好的电压稳定性、较短的响应时间和较低的稳态误差,能够有效抑制电压波动并提高系统的鲁棒性。实验结果表明,控制器在维持高效能和高

weixin_44553616的博客 896

OpenStack 安装与使用过程中排错总结

Nova 创建虚机状态错误 问题描述 [root@packstack-controller21 ~(keystone_admin)]# openstack server list +--------------------------------------+------+--------+----------+--------+---------+ | ID | Name | Status | Networks | Image | Fl

纯牛奶x的博客 9787

SHAP图全解析:从理论到实践,教你如何读懂和优化模型特征

本文全面解析SHAP图,从博弈论基础到实战应用,指导读者如何解读和利用SHAP值优化机器学习模型。通过详解特征重要性条形图、小提琴图、依赖图及决策图等关键可视化工具,帮助数据科学家精准诊断模型、识别特征交互,并将洞见转化为特征工程与模型调试的实际行动,有效提升模型可解释性与性能。

svm4gardener的博客 187

OpenStack Placement服务:云资源统一调度的核心中枢

在云计算基础设施中,资源调度的本质是解决‘资源在哪、还剩多少、是否匹配’这一根本问题。OpenStack Placement 通过抽象 Resource Provider、标准化 Inventory 与 Traits、实现 Consumer-Allocation 事务模型,构建了跨计算、存储、网络的统一资源账本。它将传统基于静态过滤器的‘经验式调度’升级为基于实时数据的‘确定性调度’,支撑 GPU、SR-IOV、多后端存储等异构资源的精细化编排。其核心能力——资源提供者建模与特征标签(Traits)匹配——

weixin_33795093的博客 360

【LDLTS解析】从重叠峰到精准参数:拉普拉斯深能级瞬态光谱如何重塑半导体缺陷分析

本文深入解析了拉普拉斯深能级瞬态光谱(LDLTS)技术如何革新半导体缺陷分析。针对传统DLTS难以分辨重叠峰的痛点,LDLTS通过拉普拉斯逆变换对高精度电容瞬态曲线进行数学解卷积,成功分离发射率相近的缺陷信号,实现从模糊宽峰到精准独立峰的转变。该技术不仅大幅提升了缺陷激活能和捕获截面等关键参数的提取精度,更推动分析范式从经验拟合转向第一性原理,为先进半导体工艺开发与良率提升提供了强大的精准诊断工具。

weixin_29224309的博客 272

告别Vivado自带编辑器!手把手教你用Sublime Text 4 + Icarus Verilog搭建FPGA开发环境(Windows 10/11)

本文详细介绍如何在Windows 10/11系统下,使用Sublime Text 4和Icarus Verilog搭建高效的FPGA开发环境,替代Vivado自带编辑器。通过配置语法检查、代码高亮和智能补全等功能,提升Verilog开发效率,实现专业级工作流。

weixin_30684743的博客 427

openstack创建实例,报错No valid host was found

思路仅供参考 在配置完openstack测试创建实例的时候,发现有报错:no valid host。可能导致这个报错的原因有很多,可能是节点本身存储不够。也可能是配置问题。 一般情况下,创建实例报错,可以查看的日志有:控制节点的conductor日志以及调度日志schedule。计算节点的compute日志,首先查看控制节点的conductor日志: tail -300f /var/log/nov...

一只认真的鱼 1万+

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

Apple Store 上架过包:iOS审核4.3被拒原因分析与解决修改方案

专业解决各种上架过包问题,专业团队专业处理 749

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

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

lemonwsx的专栏 992

倍福--手动加入第三方伺服的配置

客户在没有硬件情况下,希望手动配置硬件,添加第三方驱动器,本文介绍其操作流程 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 操作步骤 3 2.1. 添加电机XML文件 3 2.2. 创建EtherCAT 3 2.3. 添加新建项 3 2.4. 选择型号 4 2.5. 关联NC轴 5 软硬件版本 1.1. 倍福Beckhoff 1.1.1. 控制器硬件 TwinCAT控制制器,PC或者EPC,包括: 嵌入式控制器:CX5020-

weixin_41883890的博客 5324

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

openstack搭建报错-No valid host was found

解决openstack平台无法创建主机的问题

m0_67234476的博客 925

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Openstack 建虚拟机报错---No valid host was found.

Openstack 建虚拟机报错---No valid host was found.故障现象故障原因解决问题总结 故障现象 虚拟机创建孵化失败. 错误信息如下: 消息 No valid host was found. 编码 500 详情 Traceback (most recent call last): File "/usr/lib/python2.7/site-packages/nova/conductor/manager.py", line 1379, in schedule_and_build_i

Q先生 4506

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

控制台Prop being mutated: “placement“报错解决方案

vue 日期问题,picker

qq_49642079的博客 3601

OpenStack部署之Placement项目(7-4)

OpenStack部署之Placement项目(7-4)一、Placement概述二、OpenStack-Placement组件部署1、创建数据库实例和数据库用户2、创建Placement服务用户和API的endpoint3、安装placement服务4、修改00-placemenct-api.conf配置文件5、测试访问和端口号6、总结 一、Placement概述 二、OpenStack-Placement组件部署 CT VM:192.168.10.101 NAT:192.168.221.101 1、创

志当存高远 663

引入nova placement之后对调度的影响(by quqi99)

作者:张华 发表于:2020-09-17 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 nova cell v2 nova cell v2将nova db分成了3个(nova, nova_api, nova_cell0,虚机信息只存储在所在的cell中,公共数据存储在nova_api库中), nova_api中的3个表(nova_api.host_mappings, nova_api.instance_mappings, nova_api.cell_mappings

技术并艺术着 1万+

openstack创建实例报错,No valid host was found. There are not enough hosts available.

一套新起的OpenStack环境,在创建实例是发现报错。No valid host was found. There are not enough hosts available. 查看日之后发现 httpd有报错日志,日志指向horizon和nova。 [root@controller httpd]# cat error_log [Wed Dec 16 14:46:09.105540 2020] [:error] [pid 3409] INFO openstack_auth.views Loggi

timego的专栏 7592

Nova Placement API与Nova调度全解析

Nova Placement API与Nova调度全解析 是什么 由于历史遗留原因,Nova认为资源全部是由计算节点提供,所以在报告某些资源使用时,Nova仅仅通过查询数据库中不同计算节点的数据,简单的做累加计算得到使用量和可用资源情况,这一定不是严谨科学的做法,于是,在N版中,Nova引入了Placement API,这是一个单独的RESTful API和数据模型,用于管理和查询资源提供者的资源存量、使用情况、分配记录等等,以提供更好、更准确的资源跟踪、调度和分配的功能。 有什么 代码目录 由于Nova

Note 2261

Openstack 一直在调度中解决

查看日志/var/log/nova/nova-scheduler.log,/var/log/nova/nova-compute.log,均无报错 查看/var/log/nova/nova-conductor.log报错为 2017-02-06 09:27:04.976 2206 ERROR oslo_messaging.rpc.server OperationalError: (pymysql.e...

weixin_30521161的博客 4254

全网最详细的openstack安装教程

全网最详细的openstack安装教程 文件目录 全网最详细的openstack安装教程 文件目录 openstack 官方文档介绍 环境准备: 环境部署 1)安装centos8并修改ip地址(三台都做) 2)同步时间NTP服务(三台都做) 3)安装openstack的库(三台都做) 4)安装sql数据库(control节点) ...

m0_54476097的博客 4万+

openstack-placement服务安装

在Stein版本之前,placement代码存在于计算节点Nova的REST API的代码中。

gsl371的专栏 1554
上一篇: Openstack虚拟机MTU问题
下一篇: Kubernetes集成Ceph
gfengwong
博客等级 码龄12年 103粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值