in perfkitbenchmarker/linux_benchmarks/cluster_boot_benchmark.py [0:0]
def GetTimeToBoot(vms):
"""Creates Samples for the boot time of a list of VMs.
The time to create async return is the time difference from before the VM is
created to when the asynchronous create call returns.
The time to running is the time difference from before the VM is created to
when the VM is in the 'running' state as determined by the response to a
'describe' command.
The boot time is the time difference from before the VM is created to when
the VM is responsive to SSH commands.
Args:
vms: List of BaseVirtualMachine subclasses.
Returns:
List of Samples containing each of the provisioning metrics listed above,
along with an overall cluster boot time.
"""
if not vms:
return []
# Time that metrics are measured against.
min_create_start_time = min(vm.create_start_time for vm in vms)
# Vars used to store max values for whole-cluster boot metrics.
max_create_delay_sec = 0
max_boot_time_sec = 0
max_port_listening_time_sec = 0
max_rdp_port_listening_time_sec = 0
samples = []
os_types = set()
for i, vm in enumerate(vms):
assert vm.create_start_time
assert vm.bootable_time
assert vm.bootable_time >= vm.create_start_time
os_types.add(vm.OS_TYPE)
create_delay_sec = vm.create_start_time - min_create_start_time
max_create_delay_sec = max(max_create_delay_sec, create_delay_sec)
metadata = {
'machine_instance': i,
'num_vms': len(vms),
'os_type': vm.OS_TYPE,
'create_delay_sec': '%0.1f' % create_delay_sec,
}
# TIME TO CREATE ASYNC RETURN
if vm.create_return_time:
time_to_create_sec = vm.create_return_time - min_create_start_time
samples.append(
sample.Sample(
'Time to Create Async Return',
time_to_create_sec,
'seconds',
metadata,
)
)
# TIME TO RUNNING
if vm.is_running_time:
time_to_running_sec = vm.is_running_time - vm.create_start_time
samples.append(
sample.Sample(
'Time to Running', time_to_running_sec, 'seconds', metadata
)
)
# TIME TO SSH
boot_time_sec = vm.bootable_time - min_create_start_time
if isinstance(vm, linux_virtual_machine.BaseLinuxMixin):
# TODO(pclay): Remove when Windows refactor below is complete.
if vm.ssh_external_time:
samples.append(
sample.Sample(
'Time to SSH - External',
vm.ssh_external_time - min_create_start_time,
'seconds',
metadata,
)
)
if vm.ssh_internal_time:
samples.append(
sample.Sample(
'Time to SSH - Internal',
vm.ssh_internal_time - min_create_start_time,
'seconds',
metadata,
)
)
# TIME TO PORT LISTENING
max_boot_time_sec = max(max_boot_time_sec, boot_time_sec)
samples.append(
sample.Sample('Boot Time', boot_time_sec, 'seconds', metadata)
)
if _BOOT_TEST_PORT_LISTENING.value:
assert vm.port_listening_time
assert vm.port_listening_time >= vm.create_start_time
port_listening_time_sec = vm.port_listening_time - min_create_start_time
max_port_listening_time_sec = max(
max_port_listening_time_sec, port_listening_time_sec
)
samples.append(
sample.Sample(
'Port Listening Time',
port_listening_time_sec,
'seconds',
metadata,
)
)
# TIME TO RDP LISTENING
# TODO(pclay): refactor so Windows specifics aren't in linux_benchmarks
if FLAGS.cluster_boot_test_rdp_port_listening:
assert vm.rdp_port_listening_time
assert vm.rdp_port_listening_time >= vm.create_start_time
rdp_port_listening_time_sec = (
vm.rdp_port_listening_time - min_create_start_time
)
max_rdp_port_listening_time_sec = max(
max_rdp_port_listening_time_sec, rdp_port_listening_time_sec
)
samples.append(
sample.Sample(
'RDP Port Listening Time',
rdp_port_listening_time_sec,
'seconds',
metadata,
)
)
# Host Create Latency
if FLAGS.dedicated_hosts:
assert vm.host
assert vm.host.create_start_time
assert vm.host.create_start_time < vm.create_start_time
host_create_latency_sec = (
vm.create_start_time - vm.host.create_start_time
)
samples.append(
sample.Sample(
'Host Create Latency',
host_create_latency_sec,
'seconds',
metadata,
)
)
# Add a total cluster boot sample as the maximum boot time.
metadata = {
'num_vms': len(vms),
'os_type': ','.join(sorted(os_types)),
'max_create_delay_sec': '%0.1f' % max_create_delay_sec,
}
samples.append(
sample.Sample('Cluster Boot Time', max_boot_time_sec, 'seconds', metadata)
)
if _BOOT_TEST_PORT_LISTENING.value:
samples.append(
sample.Sample(
'Cluster Port Listening Time',
max_port_listening_time_sec,
'seconds',
metadata,
)
)
if FLAGS.cluster_boot_test_rdp_port_listening:
samples.append(
sample.Sample(
'Cluster RDP Port Listening Time',
max_rdp_port_listening_time_sec,
'seconds',
metadata,
)
)
if max_create_delay_sec > 1:
logging.warning(
'The maximum delay between starting VM creations is %0.1fs.',
max_create_delay_sec,
)
return samples