Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/firecracker
Path: blob/main/tests/integration_tests/performance/test_process_startup_time.py
1958 views
1
# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
# SPDX-License-Identifier: Apache-2.0
3
"""Test that the process startup time up to socket bind is within spec."""
4
5
import json
6
import os
7
import time
8
import platform
9
10
import host_tools.logging as log_tools
11
from host_tools.cargo_build import run_seccompiler_bin
12
13
MAX_STARTUP_TIME_CPU_US = {'x86_64': 5500, 'aarch64': 2900}
14
""" The maximum acceptable startup time in CPU us. """
15
# TODO: Keep a `current` startup time in S3 and validate we don't regress
16
17
18
def test_startup_time_new_pid_ns(test_microvm_with_api):
19
"""Check startup time when jailer is spawned in a new PID namespace."""
20
microvm = test_microvm_with_api
21
microvm.bin_cloner_path = None
22
microvm.jailer.new_pid_ns = True
23
_test_startup_time(microvm)
24
25
26
def test_startup_time_daemonize(test_microvm_with_api):
27
"""Check startup time when jailer spawns Firecracker in a new PID ns."""
28
microvm = test_microvm_with_api
29
_test_startup_time(microvm)
30
31
32
def test_startup_time_custom_seccomp(test_microvm_with_api):
33
"""Check the startup time for jailer and Firecracker up to socket bind, ...
34
35
when using custom seccomp filters via the `--seccomp-filter` param.
36
"""
37
microvm = test_microvm_with_api
38
39
_custom_filter_setup(microvm)
40
41
_test_startup_time(microvm)
42
43
44
def _test_startup_time(microvm):
45
microvm.spawn()
46
47
microvm.basic_config(vcpu_count=2, mem_size_mib=1024)
48
49
# Configure metrics.
50
metrics_fifo_path = os.path.join(microvm.path, 'metrics_fifo')
51
metrics_fifo = log_tools.Fifo(metrics_fifo_path)
52
53
response = microvm.metrics.put(
54
metrics_path=microvm.create_jailed_resource(metrics_fifo.path)
55
)
56
assert microvm.api_session.is_status_no_content(response.status_code)
57
58
microvm.start()
59
time.sleep(0.4)
60
61
# The metrics fifo should be at index 1.
62
# Since metrics are flushed at InstanceStart, the first line will suffice.
63
lines = metrics_fifo.sequential_reader(1)
64
metrics = json.loads(lines[0])
65
startup_time_us = metrics['api_server']['process_startup_time_us']
66
cpu_startup_time_us = metrics['api_server']['process_startup_time_cpu_us']
67
68
print('Process startup time is: {} us ({} CPU us)'
69
.format(startup_time_us, cpu_startup_time_us))
70
71
assert cpu_startup_time_us > 0
72
assert cpu_startup_time_us <= MAX_STARTUP_TIME_CPU_US[platform.machine()]
73
74
75
def _custom_filter_setup(test_microvm):
76
bpf_path = os.path.join(test_microvm.path, 'bpf.out')
77
78
run_seccompiler_bin(bpf_path)
79
80
test_microvm.create_jailed_resource(bpf_path)
81
test_microvm.jailer.extra_args.update({"seccomp-filter": 'bpf.out'})
82
83