今天跟踪了下openstack 资源的一个统计情况,记录下
1.节点资源统计在compute_notes表中
2.利用update_available_resource函数读取系统 /proc/meminfo中的总共资源以及可用的资源,算出已经使用的资源(这些值跟实例是没多大关系的,完全是系统值)
3.关键的属性 free_ram_mb free_disk_gb 的值是会随实例的创建和删除进行加减的。
update_available_resource调用db.compute_node_update
调用_adjust_compute_node_values_for_utilization
def _adjust_compute_node_values_for_utilization(context, values, session): service_ref = service_get(context, values['service_id'], session=session) host = service_ref['host'] ram_mb = values['memory_mb'] disk_gb = values['local_gb'] values.update(_get_host_utilization(context, host, ram_mb, disk_gb)) 根据实例表进行统计 def _get_host_utilization(context, host, ram_mb, disk_gb): """Compute the current utilization of a given host.""" instances = instance_get_all_by_host(context, host) vms = len(instances) free_ram_mb = ram_mb - FLAGS.reserved_host_memory_mb free_disk_gb = disk_gb - (FLAGS.reserved_host_disk_mb * 1024) work = 0 for instance in instances: free_ram_mb -= instance.memory_mb free_disk_gb -= instance.root_gb free_disk_gb -= instance.ephemeral_gb if instance.vm_state in [vm_states.BUILDING, vm_states.REBUILDING, vm_states.MIGRATING, vm_states.RESIZING]: work += 1 return dict(free_ram_mb=free_ram_mb, free_disk_gb=free_disk_gb, current_workload=work, running_vms=vms)
通过Capacity_notifier 中的nodify实现,每次实例操作的时候都会去更新。
例如删除实例:
if ended and event == 'delete': vms = -1 payload = message.get('payload', {}) free_ram_mb = payload.get('memory_mb', 0) free_disk_gb = payload.get('disk_gb', 0) LOG.debug("EventType=%(event_type)s -> host %(host)s: " "ram %(free_ram_mb)d, disk %(free_disk_gb)d, " "work %(work)d, vms%(vms)d" % locals()) db.api.compute_node_utilization_update(context.get_admin_context(), host, free_ram_mb_delta=free_ram_mb, free_disk_gb_delta=free_disk_gb, work_delta=work, vm_delta=vms)