Added a new VM selection algorithm: minimum_migration_time_max_cpu
This commit is contained in:
parent
3b48d3e451
commit
4bfec46215
@ -84,6 +84,28 @@ def minimum_migration_time_factory(time_step, migration_time, params):
|
|||||||
([minimum_migration_time(vms_ram)], {})
|
([minimum_migration_time(vms_ram)], {})
|
||||||
|
|
||||||
|
|
||||||
|
@contract
|
||||||
|
def minimum_migration_time_max_cpu_factory(time_step, migration_time, params):
|
||||||
|
""" Creates the minimum migration time / max CPU usage VM selection algorithm.
|
||||||
|
|
||||||
|
:param time_step: The length of the simulation time step in seconds.
|
||||||
|
:type time_step: int,>=0
|
||||||
|
|
||||||
|
:param migration_time: The VM migration time in time seconds.
|
||||||
|
:type migration_time: float,>=0
|
||||||
|
|
||||||
|
:param params: A dictionary containing the algorithm's parameters.
|
||||||
|
:type params: dict(str: *)
|
||||||
|
|
||||||
|
:return: A function implementing the minimum migration time / max CPU VM selection.
|
||||||
|
:rtype: function
|
||||||
|
"""
|
||||||
|
return lambda vms_cpu, vms_ram, state=None: \
|
||||||
|
([minimum_migration_time_max_cpu(params['last_n'],
|
||||||
|
vms_cpu,
|
||||||
|
vms_ram)], {})
|
||||||
|
|
||||||
|
|
||||||
@contract
|
@contract
|
||||||
def minimum_migration_time(vms_ram):
|
def minimum_migration_time(vms_ram):
|
||||||
""" Selects the VM with the minimum RAM usage.
|
""" Selects the VM with the minimum RAM usage.
|
||||||
@ -126,3 +148,33 @@ def random(vms_cpu):
|
|||||||
:rtype: str
|
:rtype: str
|
||||||
"""
|
"""
|
||||||
return choice(vms_cpu.keys())
|
return choice(vms_cpu.keys())
|
||||||
|
|
||||||
|
|
||||||
|
@contract
|
||||||
|
def minimum_migration_time_max_cpu(last_n, vms_cpu, vms_ram):
|
||||||
|
""" Selects the VM with the minimum RAM and maximum CPU usage.
|
||||||
|
|
||||||
|
:param last_n: The number of last CPU utilization values to average.
|
||||||
|
:type last_n: int,>0
|
||||||
|
|
||||||
|
:param vms_cpu: A map of VM UUID and their CPU utilization histories.
|
||||||
|
:type vms_cpu: dict(str: list)
|
||||||
|
|
||||||
|
:param vms_ram: A map of VM UUID and their RAM usage data.
|
||||||
|
:type vms_ram: dict(str: number)
|
||||||
|
|
||||||
|
:return: A VM to migrate from the host.
|
||||||
|
:rtype: str
|
||||||
|
"""
|
||||||
|
min_ram = min(vms_ram.values())
|
||||||
|
max_cpu = 0
|
||||||
|
selected_vm = None
|
||||||
|
for vm, cpu in vms_cpu.items():
|
||||||
|
if vms_ram[vm] > min_ram:
|
||||||
|
continue
|
||||||
|
vals = cpu[-last_n:]
|
||||||
|
avg = sum(vals) / len(vals)
|
||||||
|
if max_cpu < avg:
|
||||||
|
max_cpu = avg
|
||||||
|
selected_vm = vm
|
||||||
|
return selected_vm
|
||||||
|
@ -69,6 +69,53 @@ class Selection(TestCase):
|
|||||||
expect(selection).choice(x.keys()).and_return(vm).once()
|
expect(selection).choice(x.keys()).and_return(vm).once()
|
||||||
assert alg(x, dict()) == ([vm], {})
|
assert alg(x, dict()) == ([vm], {})
|
||||||
|
|
||||||
|
@qc(10)
|
||||||
|
def minimum_migration_time_max_cpu_factory(
|
||||||
|
x=dict_(
|
||||||
|
keys=str_(of='abc123-', min_length=36, max_length=36),
|
||||||
|
values=tuple_(list_(of=int_(min=0, max=3000),
|
||||||
|
min_length=1, max_length=10),
|
||||||
|
int_(min=0, max=3000)),
|
||||||
|
min_length=1, max_length=5
|
||||||
|
),
|
||||||
|
last_n=int_(min=1, max=10)
|
||||||
|
):
|
||||||
|
alg = selection.minimum_migration_time_max_cpu_factory(
|
||||||
|
300, 20., {'last_n': last_n})
|
||||||
|
vms_cpu = dict((k, v[0]) for k, v in x.items())
|
||||||
|
vms_ram = dict((k, v[1]) for k, v in x.items())
|
||||||
|
min_ram = min(vms_ram.values())
|
||||||
|
min_ram_vms_cpu = dict((k, sum(v[-last_n:]) / len(v[-last_n:]))
|
||||||
|
for k, v in vms_cpu.items()
|
||||||
|
if vms_ram[k] == min_ram and len(v[-last_n:]) > 0)
|
||||||
|
values = min_ram_vms_cpu.values()
|
||||||
|
vm_index = values.index(max(values))
|
||||||
|
vm = min_ram_vms_cpu.keys()[vm_index]
|
||||||
|
assert alg(vms_cpu, vms_ram) == ([vm], {})
|
||||||
|
|
||||||
|
@qc(10)
|
||||||
|
def minimum_migration_time_max_cpu_factory_equal_ram(
|
||||||
|
vms_cpu=dict_(
|
||||||
|
keys=str_(of='abc123-', min_length=36, max_length=36),
|
||||||
|
values=list_(of=int_(min=0, max=3000),
|
||||||
|
min_length=1, max_length=10),
|
||||||
|
min_length=1, max_length=5
|
||||||
|
),
|
||||||
|
ram=int_(min=1000, max=3000),
|
||||||
|
last_n=int_(min=1, max=10)
|
||||||
|
):
|
||||||
|
alg = selection.minimum_migration_time_max_cpu_factory(
|
||||||
|
300, 20., {'last_n': last_n})
|
||||||
|
vms_ram = dict((k, ram) for k, _ in vms_cpu.items())
|
||||||
|
min_ram = min(vms_ram.values())
|
||||||
|
min_ram_vms_cpu = dict((k, sum(v[-last_n:]) / len(v[-last_n:]))
|
||||||
|
for k, v in vms_cpu.items()
|
||||||
|
if vms_ram[k] == min_ram and len(v[-last_n:]) > 0)
|
||||||
|
values = min_ram_vms_cpu.values()
|
||||||
|
vm_index = values.index(max(values))
|
||||||
|
vm = min_ram_vms_cpu.keys()[vm_index]
|
||||||
|
assert alg(vms_cpu, vms_ram) == ([vm], {})
|
||||||
|
|
||||||
@qc(10)
|
@qc(10)
|
||||||
def minimum_migration_time(
|
def minimum_migration_time(
|
||||||
x=dict_(
|
x=dict_(
|
||||||
@ -111,3 +158,48 @@ class Selection(TestCase):
|
|||||||
vm = x.keys()[random.randrange(len(x))]
|
vm = x.keys()[random.randrange(len(x))]
|
||||||
expect(selection).choice(x.keys()).and_return(vm).once()
|
expect(selection).choice(x.keys()).and_return(vm).once()
|
||||||
assert selection.random(x) == vm
|
assert selection.random(x) == vm
|
||||||
|
|
||||||
|
@qc
|
||||||
|
def minimum_migration_time_max_cpu(
|
||||||
|
x=dict_(
|
||||||
|
keys=str_(of='abc123-', min_length=36, max_length=36),
|
||||||
|
values=tuple_(list_(of=int_(min=0, max=3000),
|
||||||
|
min_length=1, max_length=10),
|
||||||
|
int_(min=0, max=3000)),
|
||||||
|
min_length=1, max_length=5
|
||||||
|
),
|
||||||
|
last_n=int_(min=1, max=10)
|
||||||
|
):
|
||||||
|
vms_cpu = dict((k, v[0]) for k, v in x.items())
|
||||||
|
vms_ram = dict((k, v[1]) for k, v in x.items())
|
||||||
|
min_ram = min(vms_ram.values())
|
||||||
|
min_ram_vms_cpu = dict((k, sum(v[-last_n:]) / len(v[-last_n:]))
|
||||||
|
for k, v in vms_cpu.items()
|
||||||
|
if vms_ram[k] == min_ram and len(v[-last_n:]) > 0)
|
||||||
|
values = min_ram_vms_cpu.values()
|
||||||
|
vm_index = values.index(max(values))
|
||||||
|
vm = min_ram_vms_cpu.keys()[vm_index]
|
||||||
|
assert selection.minimum_migration_time_max_cpu(
|
||||||
|
last_n, vms_cpu, vms_ram) == vm
|
||||||
|
|
||||||
|
@qc(1)
|
||||||
|
def minimum_migration_time_max_cpu_equal_ram(
|
||||||
|
vms_cpu=dict_(
|
||||||
|
keys=str_(of='abc123-', min_length=36, max_length=36),
|
||||||
|
values=list_(of=int_(min=0, max=3000),
|
||||||
|
min_length=1, max_length=10),
|
||||||
|
min_length=1, max_length=5
|
||||||
|
),
|
||||||
|
ram=int_(min=1000, max=3000),
|
||||||
|
last_n=int_(min=1, max=10)
|
||||||
|
):
|
||||||
|
vms_ram = dict((k, ram) for k, _ in vms_cpu.items())
|
||||||
|
min_ram = min(vms_ram.values())
|
||||||
|
min_ram_vms_cpu = dict((k, sum(v[-last_n:]) / len(v[-last_n:]))
|
||||||
|
for k, v in vms_cpu.items()
|
||||||
|
if vms_ram[k] == min_ram and len(v[-last_n:]) > 0)
|
||||||
|
values = min_ram_vms_cpu.values()
|
||||||
|
vm_index = values.index(max(values))
|
||||||
|
vm = min_ram_vms_cpu.keys()[vm_index]
|
||||||
|
assert selection.minimum_migration_time_max_cpu(
|
||||||
|
last_n, vms_cpu, vms_ram) == vm
|
||||||
|
Loading…
x
Reference in New Issue
Block a user