聲明:
本博客歡迎轉發,但請保留原作者信息!內容系本人學習、研究和總結,如有雷同,實屬榮幸!
原文地址: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
核心的代碼在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重新計算這些資源使用情況。
vcpus_used = 0
memory_mb_used = CONF.reserved_host_memory_mb
local_gb_used = CONF.reserved_host_disk_mb / 1024
free_ram_mb = memory_mb - memory_mb_used
free_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:331
2013-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:332
2013-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): 10482
2013-07-29 17:03:25.557 AUDIT nova.compute.resource_tracker [-] Free disk (GB): 17
2013-07-29 17:03:25.557 AUDIT nova.compute.resource_tracker [-] Free VCPUS: 2
格式1中的數據就是直接從libvirt中的資源情況,格式2中的數據是openstack中的資源情況。