forked from firecracker-microvm/firecracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_process_startup_time.py
More file actions
94 lines (73 loc) · 3.24 KB
/
Copy pathtest_process_startup_time.py
File metadata and controls
94 lines (73 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
"""Test that the process startup time up to socket bind is within spec."""
import os
import time
import pytest
from framework.artifacts import GUEST_KERNEL_DEFAULT, pin_guest_kernel
from host_tools.cargo_build import run_seccompiler_bin
ITERATIONS = 100
pytestmark = pin_guest_kernel(GUEST_KERNEL_DEFAULT)
@pytest.mark.nonci
def test_startup_time_new_pid_ns(microvm_factory, guest_kernel, rootfs, metrics):
"""
Check startup time when jailer is spawned in a new PID namespace.
"""
for _ in range(ITERATIONS):
microvm = microvm_factory.build(guest_kernel, rootfs)
microvm.jailer.new_pid_ns = True
_test_startup_time(microvm, metrics, "new_pid_ns")
microvm.kill()
@pytest.mark.nonci
def test_startup_time_daemonize(microvm_factory, guest_kernel, rootfs, metrics):
"""
Check startup time when jailer detaches Firecracker from the controlling terminal.
"""
for _ in range(ITERATIONS):
microvm = microvm_factory.build(guest_kernel, rootfs)
_test_startup_time(microvm, metrics, "daemonize")
microvm.kill()
@pytest.mark.nonci
def test_startup_time_custom_seccomp(microvm_factory, guest_kernel, rootfs, metrics):
"""
Check the startup time when using custom seccomp filters.
"""
for _ in range(ITERATIONS):
microvm = microvm_factory.build(guest_kernel, rootfs)
_custom_filter_setup(microvm)
_test_startup_time(microvm, metrics, "custom_seccomp")
microvm.kill()
def _test_startup_time(microvm, metrics, test_suffix: str):
test_start_time = time.time()
microvm.spawn()
microvm.basic_config(vcpu_count=2, mem_size_mib=1024)
metrics.set_dimensions(
{**microvm.dimensions, "performance_test": f"test_startup_time_{test_suffix}"}
)
microvm.start()
datapoints = microvm.get_all_metrics()
# The metrics should be at index 0.
# Since metrics are flushed at InstanceStart, the first line will suffice.
test_end_time = time.time()
fc_metrics = datapoints[0]
startup_time_us = fc_metrics["api_server"]["process_startup_time_us"]
cpu_startup_time_us = fc_metrics["api_server"]["process_startup_time_cpu_us"]
print(
"Process startup time is: {} us ({} CPU us)".format(
startup_time_us, cpu_startup_time_us
)
)
assert cpu_startup_time_us > 0
# Check that startup time is not a huge value (overflow)
# This is to catch issues like the ones introduced in PR
# https://github.com/firecracker-microvm/firecracker/pull/4305
test_time_delta_us = (test_end_time - test_start_time) * 1000 * 1000
assert startup_time_us < test_time_delta_us
assert cpu_startup_time_us < test_time_delta_us
metrics.put_metric("startup_cpu_time", cpu_startup_time_us, unit="Microseconds")
metrics.put_metric("startup_time", startup_time_us, unit="Microseconds")
def _custom_filter_setup(test_microvm):
bpf_path = os.path.join(test_microvm.path, "bpf.out")
run_seccompiler_bin(bpf_path, binary_dir=test_microvm.fc_binary_path.parent)
test_microvm.create_jailed_resource(bpf_path)
test_microvm.jailer.extra_args.update({"seccomp-filter": "bpf.out"})