From 1357fc939db6fa92052e2874ffd7da0a7db8a76a Mon Sep 17 00:00:00 2001 From: Anton Beloglazov Date: Tue, 30 Oct 2012 11:25:41 +1100 Subject: [PATCH] Updated best_fit_decreasing to handle histories of VM CPU usage; added a last_n_vm_cpu parameter to specify how many last CPU usage values to average --- neat/globals/vm_placement/bin_packing.py | 17 +++- .../globals/vm_placement/test_bin_packing.py | 83 ++++++++++++------- 2 files changed, 68 insertions(+), 32 deletions(-) diff --git a/neat/globals/vm_placement/bin_packing.py b/neat/globals/vm_placement/bin_packing.py index a6b983c..71c1a24 100644 --- a/neat/globals/vm_placement/bin_packing.py +++ b/neat/globals/vm_placement/bin_packing.py @@ -43,6 +43,7 @@ def best_fit_decreasing_factory(time_step, migration_time, params): inactive_hosts_cpu, inactive_hosts_ram, \ vms_cpu, vms_ram, state=None: \ (best_fit_decreasing( + params['last_n_vm_cpu'], get_available_resources( params['cpu_threshold'], hosts_cpu_usage, @@ -79,11 +80,14 @@ def get_available_resources(threshold, usage, total): @contract -def best_fit_decreasing(hosts_cpu, hosts_ram, +def best_fit_decreasing(last_n_vm_cpu, hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, vms_cpu, vms_ram): """ The Best Fit Decreasing (BFD) heuristic for placing VMs on hosts. + :param last_n_vm_cpu: The last n VM CPU usage values to average. + :type last_n_vm_cpu: int + :param hosts_cpu: A map of host names and their available CPU in MHz. :type hosts_cpu: dict(str: int) @@ -97,7 +101,7 @@ def best_fit_decreasing(hosts_cpu, hosts_ram, :type inactive_hosts_ram: dict(str: int) :param vms_cpu: A map of VM UUID and their CPU utilization in MHz. - :type vms_cpu: dict(str: int) + :type vms_cpu: dict(str: list(int)) :param vms_ram: A map of VM UUID and their RAM usage in MB. :type vms_ram: dict(str: int) @@ -105,8 +109,13 @@ def best_fit_decreasing(hosts_cpu, hosts_ram, :return: A map of VM UUIDs to host names, or {} if cannot be solved. :rtype: dict(str: str) """ - vms = sorted(((v, vms_ram[k], k) - for k, v in vms_cpu.items()), reverse=True) + vms_tmp = [] + for vm, cpu in vms_cpu.items(): + last_n_cpu = cpu[-last_n_vm_cpu:] + vms_tmp.append((sum(last_n_cpu) / len(last_n_cpu), + vms_ram[vm], + vm)) + vms = sorted(vms_tmp, reverse=True) hosts = sorted(((v, hosts_ram[k], k) for k, v in hosts_cpu.items())) inactive_hosts = sorted(((v, inactive_hosts_ram[k], k) diff --git a/tests/globals/vm_placement/test_bin_packing.py b/tests/globals/vm_placement/test_bin_packing.py index 89feffb..9de94aa 100644 --- a/tests/globals/vm_placement/test_bin_packing.py +++ b/tests/globals/vm_placement/test_bin_packing.py @@ -26,7 +26,8 @@ class BinPacking(TestCase): def test_best_fit_decreasing_factory(self): alg = packing.best_fit_decreasing_factory(300, 20., {'cpu_threshold': 0.8, - 'ram_threshold': 0.9}) + 'ram_threshold': 0.9, + 'last_n_vm_cpu': 1}) hosts_cpu_usage = { 'host1': 200, @@ -53,9 +54,9 @@ class BinPacking(TestCase): 'host5': 1024, 'host6': 2048} vms_cpu = { - 'vm1': 1000, - 'vm2': 1000, - 'vm3': 1000} + 'vm1': [100, 1000], + 'vm2': [100, 1000], + 'vm3': [100, 1000]} vms_ram = { 'vm1': 2048, 'vm2': 4096, @@ -87,16 +88,16 @@ class BinPacking(TestCase): inactive_hosts_cpu = {} inactive_hosts_ram = {} vms_cpu = { - 'vm1': 2000, - 'vm2': 1000, - 'vm3': 3000} + 'vm1': [100, 2000], + 'vm2': [100, 1000], + 'vm3': [100, 3000]} vms_ram = { 'vm1': 512, 'vm2': 512, 'vm3': 512} assert packing.best_fit_decreasing( - hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, + 1, hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, vms_cpu, vms_ram) == { 'vm1': 'host3', 'vm2': 'host2', @@ -113,16 +114,16 @@ class BinPacking(TestCase): inactive_hosts_cpu = {} inactive_hosts_ram = {} vms_cpu = { - 'vm1': 1000, - 'vm2': 1000, - 'vm3': 1000} + 'vm1': [100, 1000], + 'vm2': [100, 1000], + 'vm3': [100, 1000]} vms_ram = { 'vm1': 1536, 'vm2': 512, 'vm3': 1536} assert packing.best_fit_decreasing( - hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, + 1, hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, vms_cpu, vms_ram) == { 'vm1': 'host1', 'vm2': 'host2', @@ -139,16 +140,16 @@ class BinPacking(TestCase): inactive_hosts_cpu = {} inactive_hosts_ram = {} vms_cpu = { - 'vm1': 1000, - 'vm2': 1000, - 'vm3': 1000} + 'vm1': [100, 1000], + 'vm2': [100, 1000], + 'vm3': [100, 1000]} vms_ram = { 'vm1': 1536, 'vm2': 1536, 'vm3': 1536} assert packing.best_fit_decreasing( - hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, + 1, hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, vms_cpu, vms_ram) == { 'vm1': 'host1', 'vm2': 'host1', @@ -165,16 +166,16 @@ class BinPacking(TestCase): inactive_hosts_cpu = {} inactive_hosts_ram = {} vms_cpu = { - 'vm1': 1000, - 'vm2': 1000, - 'vm3': 1000} + 'vm1': [100, 1000], + 'vm2': [100, 1000], + 'vm3': [100, 1000]} vms_ram = { 'vm1': 3072, 'vm2': 1536, 'vm3': 1536} assert packing.best_fit_decreasing( - hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, + 1, hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, vms_cpu, vms_ram) == {} hosts_cpu = { @@ -194,16 +195,16 @@ class BinPacking(TestCase): 'host5': 1024, 'host6': 2048} vms_cpu = { - 'vm1': 1000, - 'vm2': 1000, - 'vm3': 1000} + 'vm1': [100, 1000], + 'vm2': [100, 1000], + 'vm3': [100, 1000]} vms_ram = { 'vm1': 2048, 'vm2': 4096, 'vm3': 2048} assert packing.best_fit_decreasing( - hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, + 1, hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, vms_cpu, vms_ram) == { 'vm1': 'host6', 'vm2': 'host1', @@ -226,14 +227,40 @@ class BinPacking(TestCase): 'host5': 1024, 'host6': 2048} vms_cpu = { - 'vm1': 1000, - 'vm2': 1000, - 'vm3': 1000} + 'vm1': [100, 1000], + 'vm2': [100, 1000], + 'vm3': [100, 1000]} vms_ram = { 'vm1': 2048, 'vm2': 5120, 'vm3': 2048} assert packing.best_fit_decreasing( - hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, + 1, hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, vms_cpu, vms_ram) == {} + + hosts_cpu = { + 'host1': 3000, + 'host2': 1000, + 'host3': 2000} + hosts_ram = { + 'host1': 4096, + 'host2': 1024, + 'host3': 2048} + inactive_hosts_cpu = {} + inactive_hosts_ram = {} + vms_cpu = { + 'vm1': [1000, 1000], + 'vm2': [0, 2000], + 'vm3': [500, 1500]} + vms_ram = { + 'vm1': 1536, + 'vm2': 1536, + 'vm3': 1536} + + assert packing.best_fit_decreasing( + 2, hosts_cpu, hosts_ram, inactive_hosts_cpu, inactive_hosts_ram, + vms_cpu, vms_ram) == { + 'vm1': 'host1', + 'vm2': 'host1', + 'vm3': 'host3'}