[openstack]资源统计实现

来源:互联网 发布:电影票订购软件 编辑:程序博客网 时间:2024/05/21 15:48

声明:

本博客欢迎转发,但请保留原作者信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!

原文地址:http://blog.csdn.net/gtt116/article/details/9618403



本文将介绍openstack(grizzly)版本中nova是如何统计宿主机可用资源的,以便debug和运维openstack。

在openstack中,对虚拟机的管理有两层:openstack自身和Hypervisor(libvirt)。由于不同的层次可能导致数据不统一,比如vm在libvirt中,但是不在openstack中,或者相反。这时的资源统计要如何处理?openstack的做法是两者都统计,但是真正列入考虑范围(写入数据库)的是openstack自身统计出的结果。接下来将详细介绍openstack是如何进行资源统计的。


openstack关注宿主机的如下资源:

  • vcpus
  • vcpus_used
  • memory_mb
  • memory_mb_used
  • local_gb
  • local_gb_used
  • cpu_info
  • disk_available_least
  • free_ram_mb
  • free_disk_gb


这些数据在periodic task中会定时更新到数据库中,默认是60s一次。接下来详细说明这些的数据是如何获取的


核心的代码在nova/virt/libvirt/driver.py:LibvirtDriver.get_available_resource()中,有兴趣的同学可以自己看代码,
这里只列出各个资源是如何统计的。
  • vcpus: 通过libvirt的nodeinfo直接获取
  • vcpus_used: 通过libvirt列出所有的vm,然后遍历叠加所有vm的vcpus
  • memory_mb: 通过libvirt nodeinfo直接获取
  • memory_mb_used: 计算/proc/meminfo中的信息,计算出可用的(MemFree + Buffers + cached),然后用上面的memory_mb - 可用,剩下的就是used
  • local_gb: 通过python的os.statvfg接口查看instance目录的大小
  • local_gb_used: 和local_gb一样
  • cpu_info: 从libvirt中获取
  • disk_available_least: 它和local_gb的区别是local_gb是镜像的实际大小,此项是计算了虚拟大小之后的剩余量。所以一定小于(local_gb - local_gb_used)。
  • free_ram_mb: memory_mb - memory_mb_used
  • free_disk_gb: local_gb - local_gb_used


但是,但是! 在nova不是简单的把这些数据放到数据库中,而是另外计算了一遍vcpus, memory和local_gb。

在第一次获取上面的基本数据之后,nova会从数据库中拿到所有理论上在此宿主机上的instance,然后基于instance重新计算这些资源使用情况。


1. 首先,重设vcpu, memory, local_gb的使用情况。
vcpus_used = 0memory_mb_used = CONF.reserved_host_memory_mblocal_gb_used = CONF.reserved_host_disk_mb / 1024free_ram_mb = memory_mb - memory_mb_usedfree_disk_gb = local_gb - local_gb_used

2. 然后,找出所有没有删除的instance,
根据每一个instance的详细信息计算vcpus_used,local_gb_used, memory_mb_used,之后再算出free_ram_mb, free_disk_gb


所以在日志中,可以发现有两中汇报资源的格式:
格式1.
2013-07-29 17:03:25.486 DEBUG nova.compute.resource_tracker [-] Hypervisor: free ram (MB): 10253 from (pid=17247) _report_hypervisor_resource_view /opt/stack/nova/nova/compute/resource_tracker.py:3312013-07-29 17:03:25.487 DEBUG nova.compute.resource_tracker [-] Hypervisor: free disk (GB): 13 from (pid=17247) _report_hypervisor_resource_view /opt/stack/nova/nova/compute/resource_tracker.py:3322013-07-29 17:03:25.487 DEBUG nova.compute.resource_tracker [-] Hypervisor: free VCPUs: 4 from (pid=17247) _report_hypervisor_resource_view /opt/stack/nova/nova/compute/resource_tracker.py:337

格式2.
2013-07-29 17:03:25.556 AUDIT nova.compute.resource_tracker [-] Free ram (MB): 104822013-07-29 17:03:25.557 AUDIT nova.compute.resource_tracker [-] Free disk (GB): 172013-07-29 17:03:25.557 AUDIT nova.compute.resource_tracker [-] Free VCPUS: 2

格式1中的数据就是直接从libvirt中的资源情况,格式2中的数据是openstack中的资源情况。