厘清“状态”和“资源”,先定查询目标,再配命令
查询nova虚拟机状态和资源信息,最直接且通用的方法是通过OpenStack命令行工具执行nova list查看状态概览,随后用nova show加虚拟机ID获取精确的CPU、内存、磁盘资源数据,但实际业务中,高效从来不是单条命令能做到的,你需要先分清“查状态”和“查资源”是两种不同的操作路径,再配合Admin权限下的过滤指令和批量脚本,才能称得上真正的高效。
查询前必须分清的两种信息类型:状态 vs 资源
很多初学者习惯把虚拟机信息混为一谈,实际排查问题时容易走弯路,nova生态里,信息粒度完全不同,混用导致查询效率大幅下降。
| 信息类型 | 代表字段 | 用途 | 典型查询命令 |
|---|---|---|---|
| 运行状态 | status、vm_state、task_state | 判断虚拟机是Active、Error还是Shutoff | nova list、nova show |
| 资源分配 | vcpus、ram、disk、flavor | 评估规格是否超卖、能否扩容 | nova flavor-list、nova flavor-show |
状态信息主要用于故障排查,比如一台虚拟机访问不了,你需要先看status是否为ACTIVE,再看vm_state有没有变成error,顺带检查task_state是否卡在resize或pausing只要task_state不为空,说明OpenStack编排层还在干活,此时就算status显示ACTIVE,业务也可能异常。
资源信息用于容量规划和性能分析,比如业务方反馈虚拟机很卡,你要确认分配的vCPU是否足够,内存是否吃紧,磁盘吞吐是否有瓶颈,这类查询需要穿透flavor或者直接看nova show返回的flavor详情。
行业共识认为,将两类查询分开、按需精准取数,比一次性拉全量再人肉过滤,效率高出数倍,尤其是管理几百台虚拟机的场景。
查看nova虚拟机状态:从列表到详情的完整命令链
最基础的状态查看命令nova list
在OpenStack环境里,执行以下命令能列出当前租户(项目)下的所有虚拟机:
nova list
输出结果会展示四列:ID、Name、Status、Networks,其中Status列直接告诉你虚拟机处于ACTIVE、SHUTOFF、SUSPENDED还是ERROR状态。
这条命令非常直观,但生产环境里往往不止几十台机器,密密麻麻的列表看得眼花缭乱,这时候你需要在命令后追加过滤条件,精准锁定目标。
# 按名称模糊匹配 nova list --name "web-server" # 按状态精确过滤(排障时极其常用) nova list --status ERROR # 按主机过滤,查看物理节点上运行的所有虚拟机 nova list --host compute-01
深入排查:怎么看一台虚拟机的完整状态堆栈
如果你发现某台虚拟机状态异常,光看列表肯定不够,需要用nova show拉出这台机器的全量状态。
nova show <server_id>
里重点看几个状态相关的字段:status(生命周期状态)、OS-EXT-STS:vm_state(底层虚拟化状态)、OS-EXT-STS:task_state(中间任务状态)、OS-EXT-STS:power_state(电源状态,1代表运行中,4代表关机)。
举个例子,如果status是ACTIVE,但OS-EXT-STS:power_state是4,说明OpenStack认为机器是活的,但底层hypervisor里机器已关机,这种情况通常需要去计算节点上查看系统日志,确认是不是宿主机异常重启导致虚拟机没跟着起来。
使用openstack CLI统一查询新环境下的标准做法
近年来,随着OpenStack逐步废弃旧版nova命令,多数国内云平台和私有云环境开始推荐使用统一的openstack命令,国内某运营商私有云项目里,运维团队统一执行:
openstack server list --all-projects openstack server show <server_id>
相比之下,openstack server list支持--status参数过滤,还能加--long参数直接输出虚拟机所在主机、flavor名称等更多元数据,比nova原生命令的信息密度更高,如果你所在的环境已经完成了client版本升级,优先使用openstack命令是更符合行业演进方向的选择。旧版nova命令在较新版本中已被移除,继续使用会报Unknown command错误。
怎么查看nova虚拟机CPU内存配置?完整资源信息查询指南
用nova show解析单台虚拟机资源配额
回到刚才nova show这个命令,它的返回结果里除了状态字段,还包含一个专门的flavor区域:
nova show <server_id>
输出中你会看到类似这样的内容:
| flavor:original_name | m1.small |
| flavor:ram | 2048 |
| flavor:vcpus | 1 |
| flavor:disk | 40 |
这组字段直接决定了虚拟机的计算底座vcpus是分配的虚拟核心数,ram是内存大小(单位MB),disk是磁盘容量(单位GB)。
但在实际咨询场景里,怎么查看nova虚拟机CPU内存配置常常会遇到一个坑:如果虚拟机做了resize操作(热升级规格),nova show返回的flavor信息是新规格的数据,但hypervisor层面虚拟机的实际配置可能还在迁移或锁定中,这时候要用nova resize-confirm确认变更完成,再回头看资源数据。
穿透flavor列表,掌握全flavor规格表
如果你想提前规划下一批虚拟机的资源分配,或者在排障时确认“这台虚拟机跑在哪个规格上”,用以下命令拉取当前环境的所有flavor模板:
nova flavor-list
返回结果里会展示每个flavor的ID、Name、Memory_MB、VCPUs、Disk_GB字段,你会发现不同项目可能共享同一套flavor,所以查询资源时切勿只看名称,务必核对内存、vCPU和磁盘三项数据,别想当然。
两个项目的flavor列表里都存在m1.small,但实际规格定义不同(一个内存2048MB,另一个是4096MB),这种情况是云平台运维在创建flavor时没有全局统一导致的。核对资源信息时,以flavor-show返回配置为准,而不是凭名称猜测。
nova flavor-show <flavor_id>
批量查询nova虚拟机资源信息的最佳实践:脚本与自动化
为何单条命令在批量场景下不够用?
行政和研发团队往往只需要看一两台机器,但运维人员面临的通常是“帮我查一下全部300台虚拟机的剩余内存”或者“所有ERROR状态的机器分别占用多少资源”,此时逐台敲命令无异于用手工方式做循环,耗时且容易漏数据。
所谓高效,本质上是用一处查询、批量输出替代多次API调用。
基于openstack CLI的shell脚本
以下脚本用openstack命令循环拉取全部虚拟机ID,再逐台获取资源信息,输出为CSV格式:
#!/bin/bash
echo "server_id,name,vcpus,ram,disk"
for id in $(openstack server list --all-projects -f value -c ID); do
name=$(openstack server show $id -f value -c name)
flavor_id=$(openstack server show $id -f value -c flavor | awk -F'(' '{print $2}' | tr -d ')')
vcpus=$(openstack flavor show $flavor_id -f value -c vcpus)
ram=$(openstack flavor show $flavor_id -f value -c ram)
disk=$(openstack flavor show $flavor_id -f value -c disk)
echo "$id,$name,$vcpus,$ram,$disk"
done
该脚本会在执行后生成一份全量资源清单,配合grep或Excel筛选,定位超配规格机器就很快。
直接利用数据库层面做极速查询(性能敏感场景)
如果你的环境规模较大比如管理节点上部署了上千台虚拟机那么依赖nova-api逐台拉取数据会显著增加API层的压力,业内专家指出,在大规模环境中,直接从nova数据库查询是兼顾时效和资源消耗的选项。
mysql -u nova -p nova -e "SELECT instance_uuid, display_name, vcpus, memory_mb, root_gb FROM instances WHERE deleted='0';"
但做这一步前要明确:直接触碰数据库属于高风险操作,建议在维护窗口执行,且只用于只读查询,严禁写操作。
结合物理层面的资源确认:虚拟机状态与宿主机资源的关系
为什么虚拟机显示ACTIVE但业务仍然卡顿?
这个场景在混合云和IDC托管环境中相当常见,虚拟机的资源查询显示vCPU有4核、内存8GB,但业务就是跑不动,最后发现是宿主机物理资源超分配严重。
排查步骤建议如下:
- 执行
nova show <server_id>记录虚拟机所在宿主机名称; - SSH登录到计算节点,执行
virsh list查看该物理机上实际运行的虚拟机数量; - 用
free -h和lscpu查看宿主机内存与CPU物理核数; - 用
nova host-describe <compute_node>查看该宿主机上所有虚拟机的资源汇总。
这组检查做完,你就能判断是不是宿主机资源争抢拖累了单台虚拟机的表现,而不是盲目在虚拟机上做配置扩容。
查看资源利用率历史数据的方法
nova本身不保存监控历史,它只管资源分配,不管资源消耗,所以如果你想评估“这台虚拟机过去一周的CPU平均使用率”,nova命令做不到,需要配合ceilometer或Prometheus。
多数企业云平台已经在nova之上自建了监控系统,比如通过openstack metric list(Gnocchi)或者直接对接普罗米修斯监控面板查询。
常见状况与避坑指南:为什么命令查出来的数据看着不对?
| 问题现象 | 可能原因 | 处理方式 |
|---|---|---|
nova list有虚拟机,但openstack server list看不到同一批机器 |
两种命令分属不同API版本,client配置指向不同region或项目 | 检查环境变量OS_PROJECT_NAME和OS_REGION_NAME是否一致 |
nova show显示flavor的vCPU为8,但实际机器只有2核 |
虚拟机经历过resize,底层尚未执行resize-confirm | 执行nova resize-confirm <server_id> |
nova list --status SHUTOFF查不到机器 |
云平台对关机状态用SHUTOFF存储,但部分版本显示为STOPPED |
改用nova list -f value -c ID --status SHUTOFF配合grep排查 |
| 查询1000台虚拟机时命令卡死 | nova-api并发压力过高,多数情况下是分页限制 | 使用--limit参数分段拉取,或直接查询数据库 |
核心结论与一套经得起验证的查询流程
高效查询nova虚拟机状态与资源信息,前提是分清楚状态和资源两个维度,核心方法是先用nova list/openstack server list过滤目标范围,再用nova show/openstack server show定位细节,最后用批量脚本或数据库查询解决规模化问题。
建议你直接复制这套流程到日常运维中:
- 查状态:先
openstack server list --all-projects,加--status过滤; - 查资源:再
openstack server show <ID>,读flavor区块; - 查宿主机:登计算节点用
virsh list和nova host-describe; - 查历史:接Prometheus或Gnocchi,不看nova数据;
常见问题解答
怎么查看nova虚拟机CPU内存信息而不登录OpenStack控制台?
使用命令行集成环境执行openstack server show <server_id> -f json,返回结果中直接包含flavor字段,里面列出vcpus、ram和disk信息,如果你用的是OpenStack Horizon界面,查看流程是:项目 → 计算 → 实例 → 点击实例名称 → 概览标签页,屏幕右侧会显示“规格”区域的数据,不需要登录底层系统。
nova命令行查询虚拟机状态时报“No suitable network”错误怎么办?
这个错误通常不是查询命令本身的问题,而是当前环境变量的网络配置缺失或冲突,建议先用openstack network list确认网络是否存在,再检查环境变量OS_NETWORK_API_VERSION是否设置正确,如果执行查询时仍报错,用unset OS_NETWORK_API_VERSION清除环境变量重试。
批量查询nova虚拟机资源时能否直接导出表格?
可以通过循环脚本将数据输出为CSV文件,操作路径是:shell脚本内叠加openstack server list和openstack flavor show,外层用echo拼接各字段,脚本执行完毕后,将输出重定向到result.csv,即可用Excel或WPS表格打开,如果你的环境已有调控服务ceilometer,也可直接使用openstack metric list接口批量拉取资源监控数据,但该接口只返回使用率指标,不返回配额信息。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/628223.html





