From 00a840b135bbcbe6948dc17e3a7e179297c6afd5 Mon Sep 17 00:00:00 2001 From: Carlos Date: Mon, 16 Oct 2023 13:45:48 -0400 Subject: [PATCH] Include Image Pulling Time (#23) --- apps/helloworld-py/deployment.yaml | 2 +- eval/plots/startup/startup.pdf | Bin 12686 -> 28474 bytes eval/plots/startup/startup.png | Bin 17389 -> 39471 bytes eval/results/startup/coco-fw-sig-enc_cold.csv | 36 ++++--- eval/results/startup/coco-fw-sig-enc_warm.csv | 36 ++++--- eval/results/startup/coco-fw-sig_cold.csv | 36 ++++--- eval/results/startup/coco-fw-sig_warm.csv | 36 ++++--- eval/results/startup/coco-fw_cold.csv | 36 ++++--- eval/results/startup/coco-fw_warm.csv | 36 ++++--- eval/results/startup/coco_cold.csv | 36 ++++--- eval/results/startup/coco_warm.csv | 36 ++++--- eval/results/startup/docker_cold.csv | 36 ++++--- eval/results/startup/docker_warm.csv | 36 ++++--- tasks/eval/startup.py | 102 +++++++++++++++--- tasks/util/containerd.py | 29 +++++ 15 files changed, 330 insertions(+), 163 deletions(-) create mode 100644 tasks/util/containerd.py diff --git a/apps/helloworld-py/deployment.yaml b/apps/helloworld-py/deployment.yaml index 8fec5c3..d1abebb 100644 --- a/apps/helloworld-py/deployment.yaml +++ b/apps/helloworld-py/deployment.yaml @@ -15,7 +15,7 @@ spec: apps.coco-serverless/name: helloworld-py io.katacontainers.config.pre_attestation.enabled: "false" spec: - runtimeClassName: kata-qemu + runtimeClassName: kata-qemu-sev containers: - name: helloworld-py image: ghcr.io/csegarragonz/coco-helloworld-py:unencrypted diff --git a/eval/plots/startup/startup.pdf b/eval/plots/startup/startup.pdf index 78b433d8de39b84df385d5d3e2b4b261debb6ccd..f00c65eed6e20eb626d9a2ef19c93fc30895894b 100644 GIT binary patch delta 18288 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

78foZZRcYAFechXBr? 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 literal 17389 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 KHvRPFyZ-~q0Q6}9 diff --git a/eval/results/startup/coco-fw-sig-enc_cold.csv b/eval/results/startup/coco-fw-sig-enc_cold.csv index 2674c6c..3f75046 100644 --- a/eval/results/startup/coco-fw-sig-enc_cold.csv +++ b/eval/results/startup/coco-fw-sig-enc_cold.csv @@ -1,16 +1,22 @@ Run,Event,TimeStampMs -0,Start,1697221341.961345 -0,Initialized,1697221342.0 -0,PodScheduled,1697221342.0 -0,Ready,1697221358.0 -0,ContainersReady,1697221358.0 -1,Initialized,1697221365.0 -1,PodScheduled,1697221365.0 -1,Start,1697221365.0416353 -1,Ready,1697221382.0 -1,ContainersReady,1697221382.0 -2,Initialized,1697221388.0 -2,PodScheduled,1697221388.0 -2,Start,1697221388.1206732 -2,Ready,1697221405.0 -2,ContainersReady,1697221405.0 +0,Start,1697471005.8187528 +0,Initialized,1697471006.0 +0,PodScheduled,1697471006.0 +0,StartImagePull,1697471012.417832 +0,EndImagePull,1697471019.097273 +0,Ready,1697471022.0 +0,ContainersReady,1697471022.0 +1,Start,1697471028.9048746 +1,Initialized,1697471029.0 +1,PodScheduled,1697471029.0 +1,StartImagePull,1697471035.480519 +1,EndImagePull,1697471042.345242 +1,Ready,1697471045.0 +1,ContainersReady,1697471045.0 +2,Start,1697471051.9837024 +2,Initialized,1697471052.0 +2,PodScheduled,1697471052.0 +2,StartImagePull,1697471058.526666 +2,EndImagePull,1697471065.106732 +2,Ready,1697471069.0 +2,ContainersReady,1697471069.0 diff --git a/eval/results/startup/coco-fw-sig-enc_warm.csv b/eval/results/startup/coco-fw-sig-enc_warm.csv index 2f1ce6e..4591506 100644 --- a/eval/results/startup/coco-fw-sig-enc_warm.csv +++ b/eval/results/startup/coco-fw-sig-enc_warm.csv @@ -1,16 +1,22 @@ Run,Event,TimeStampMs -0,Start,1697221255.6528904 -0,Initialized,1697221256.0 -0,PodScheduled,1697221256.0 -0,Ready,1697221272.0 -0,ContainersReady,1697221272.0 -1,Start,1697221278.7323177 -1,Initialized,1697221279.0 -1,PodScheduled,1697221279.0 -1,Ready,1697221295.0 -1,ContainersReady,1697221295.0 -2,Start,1697221301.8187425 -2,Initialized,1697221302.0 -2,PodScheduled,1697221302.0 -2,Ready,1697221336.0 -2,ContainersReady,1697221336.0 +0,Start,1697470936.555282 +0,Initialized,1697470937.0 +0,PodScheduled,1697470937.0 +0,StartImagePull,1697470943.266319 +0,EndImagePull,1697470950.055939 +0,Ready,1697470953.0 +0,ContainersReady,1697470953.0 +1,Start,1697470959.6539378 +1,Initialized,1697470960.0 +1,PodScheduled,1697470960.0 +1,StartImagePull,1697470966.313114 +1,EndImagePull,1697470972.984553 +1,Ready,1697470976.0 +1,ContainersReady,1697470976.0 +2,Start,1697470982.73579 +2,Initialized,1697470983.0 +2,PodScheduled,1697470983.0 +2,StartImagePull,1697470989.371295 +2,EndImagePull,1697470996.04208 +2,Ready,1697470999.0 +2,ContainersReady,1697470999.0 diff --git a/eval/results/startup/coco-fw-sig_cold.csv b/eval/results/startup/coco-fw-sig_cold.csv index 94e6adf..6429751 100644 --- a/eval/results/startup/coco-fw-sig_cold.csv +++ b/eval/results/startup/coco-fw-sig_cold.csv @@ -1,16 +1,22 @@ Run,Event,TimeStampMs -0,Initialized,1697221114.0 -0,PodScheduled,1697221114.0 -0,Start,1697221114.1425405 -0,Ready,1697221131.0 -0,ContainersReady,1697221131.0 -1,Initialized,1697221137.0 -1,PodScheduled,1697221137.0 -1,Start,1697221137.219481 -1,Ready,1697221154.0 -1,ContainersReady,1697221154.0 -2,Initialized,1697221160.0 -2,PodScheduled,1697221160.0 -2,Start,1697221160.308928 -2,Ready,1697221177.0 -2,ContainersReady,1697221177.0 +0,Initialized,1697470810.0 +0,PodScheduled,1697470810.0 +0,Start,1697470810.1108723 +0,StartImagePull,1697470816.715057 +0,EndImagePull,1697470823.870758 +0,Ready,1697470828.0 +0,ContainersReady,1697470828.0 +1,Initialized,1697470834.0 +1,PodScheduled,1697470834.0 +1,Start,1697470834.1904464 +1,StartImagePull,1697470840.79858 +1,EndImagePull,1697470847.525106 +1,Ready,1697470851.0 +1,ContainersReady,1697470851.0 +2,Initialized,1697470857.0 +2,PodScheduled,1697470857.0 +2,Start,1697470857.2810328 +2,StartImagePull,1697470863.906405 +2,EndImagePull,1697470870.359324 +2,Ready,1697470874.0 +2,ContainersReady,1697470874.0 diff --git a/eval/results/startup/coco-fw-sig_warm.csv b/eval/results/startup/coco-fw-sig_warm.csv index 12786f0..70ff854 100644 --- a/eval/results/startup/coco-fw-sig_warm.csv +++ b/eval/results/startup/coco-fw-sig_warm.csv @@ -1,16 +1,22 @@ Run,Event,TimeStampMs -0,Start,1697221046.878591 -0,Initialized,1697221047.0 -0,PodScheduled,1697221047.0 -0,Ready,1697221063.0 -0,ContainersReady,1697221063.0 -1,Start,1697221069.967245 -1,Initialized,1697221070.0 -1,PodScheduled,1697221070.0 -1,Ready,1697221085.0 -1,ContainersReady,1697221085.0 -2,Initialized,1697221091.0 -2,PodScheduled,1697221091.0 -2,Start,1697221091.0533175 -2,Ready,1697221108.0 -2,ContainersReady,1697221108.0 +0,Start,1697470739.8409154 +0,Initialized,1697470740.0 +0,PodScheduled,1697470740.0 +0,StartImagePull,1697470746.378967 +0,EndImagePull,1697470753.072175 +0,Ready,1697470756.0 +0,ContainersReady,1697470756.0 +1,Start,1697470762.9284194 +1,Initialized,1697470763.0 +1,PodScheduled,1697470763.0 +1,StartImagePull,1697470769.530279 +1,EndImagePull,1697470775.931434 +1,Ready,1697470779.0 +1,ContainersReady,1697470779.0 +2,Initialized,1697470786.0 +2,PodScheduled,1697470786.0 +2,Start,1697470786.0162864 +2,StartImagePull,1697470792.610916 +2,EndImagePull,1697470799.336783 +2,Ready,1697470804.0 +2,ContainersReady,1697470804.0 diff --git a/eval/results/startup/coco-fw_cold.csv b/eval/results/startup/coco-fw_cold.csv index dd8ffb1..54688e3 100644 --- a/eval/results/startup/coco-fw_cold.csv +++ b/eval/results/startup/coco-fw_cold.csv @@ -1,16 +1,22 @@ Run,Event,TimeStampMs -0,Start,1697220961.5506494 -0,Initialized,1697220962.0 -0,PodScheduled,1697220962.0 -0,Ready,1697220975.0 -0,ContainersReady,1697220975.0 -1,Start,1697220981.6300936 -1,Initialized,1697220982.0 -1,PodScheduled,1697220982.0 -1,Ready,1697220996.0 -1,ContainersReady,1697220996.0 -2,Start,1697221002.709317 -2,Initialized,1697221003.0 -2,PodScheduled,1697221003.0 -2,Ready,1697221017.0 -2,ContainersReady,1697221017.0 +0,Start,1697470371.6252952 +0,Initialized,1697470372.0 +0,PodScheduled,1697470372.0 +0,StartImagePull,1697470378.218857 +0,EndImagePull,1697470383.633569 +0,Ready,1697470386.0 +0,ContainersReady,1697470386.0 +1,Start,1697470392.7114177 +1,Initialized,1697470393.0 +1,PodScheduled,1697470393.0 +1,StartImagePull,1697470399.253206 +1,EndImagePull,1697470404.577172 +1,Ready,1697470407.0 +1,ContainersReady,1697470407.0 +2,Start,1697470413.7974222 +2,Initialized,1697470414.0 +2,PodScheduled,1697470414.0 +2,StartImagePull,1697470420.490807 +2,EndImagePull,1697470425.785166 +2,Ready,1697470428.0 +2,ContainersReady,1697470428.0 diff --git a/eval/results/startup/coco-fw_warm.csv b/eval/results/startup/coco-fw_warm.csv index 645a4e8..b929ed2 100644 --- a/eval/results/startup/coco-fw_warm.csv +++ b/eval/results/startup/coco-fw_warm.csv @@ -1,16 +1,22 @@ Run,Event,TimeStampMs -0,Initialized,1697220855.0 -0,PodScheduled,1697220855.0 -0,Start,1697220855.17601 -0,Ready,1697220869.0 -0,ContainersReady,1697220869.0 -1,Initialized,1697220875.0 -1,PodScheduled,1697220875.0 -1,Start,1697220875.2426844 -1,Ready,1697220935.0 -1,ContainersReady,1697220935.0 -2,Initialized,1697220940.0 -2,PodScheduled,1697220940.0 -2,Start,1697220940.4730253 -2,Ready,1697220955.0 -2,ContainersReady,1697220955.0 +0,Initialized,1697470310.0 +0,PodScheduled,1697470310.0 +0,Start,1697470310.3903742 +0,StartImagePull,1697470316.993853 +0,EndImagePull,1697470322.42001 +0,Ready,1697470325.0 +0,ContainersReady,1697470325.0 +1,Start,1697470331.4710257 +1,Initialized,1697470332.0 +1,PodScheduled,1697470332.0 +1,StartImagePull,1697470338.146335 +1,EndImagePull,1697470343.454944 +1,Ready,1697470346.0 +1,ContainersReady,1697470346.0 +2,Start,1697470351.548689 +2,Initialized,1697470352.0 +2,PodScheduled,1697470352.0 +2,StartImagePull,1697470358.193838 +2,EndImagePull,1697470363.794951 +2,Ready,1697470366.0 +2,ContainersReady,1697470366.0 diff --git a/eval/results/startup/coco_cold.csv b/eval/results/startup/coco_cold.csv index 3413ab3..d203d54 100644 --- a/eval/results/startup/coco_cold.csv +++ b/eval/results/startup/coco_cold.csv @@ -1,16 +1,22 @@ Run,Event,TimeStampMs -0,Start,1697220756.8188488 -0,Initialized,1697220757.0 -0,PodScheduled,1697220757.0 -0,Ready,1697220770.0 -0,ContainersReady,1697220770.0 -1,Start,1697220776.8993905 -1,Initialized,1697220777.0 -1,PodScheduled,1697220777.0 -1,Ready,1697220791.0 -1,ContainersReady,1697220791.0 -2,Start,1697220796.9742057 -2,Initialized,1697220797.0 -2,PodScheduled,1697220797.0 -2,Ready,1697220811.0 -2,ContainersReady,1697220811.0 +0,Initialized,1697472420.0 +0,PodScheduled,1697472420.0 +0,Start,1697472420.4138386 +0,StartImagePull,1697472426.742439 +0,EndImagePull,1697472432.313472 +0,Ready,1697472435.0 +0,ContainersReady,1697472435.0 +1,Start,1697472441.492506 +1,Initialized,1697472442.0 +1,PodScheduled,1697472442.0 +1,StartImagePull,1697472447.854151 +1,EndImagePull,1697472453.553883 +1,Ready,1697472456.0 +1,ContainersReady,1697472456.0 +2,Start,1697472462.5733995 +2,Initialized,1697472463.0 +2,PodScheduled,1697472463.0 +2,StartImagePull,1697472469.0991 +2,EndImagePull,1697472474.478074 +2,Ready,1697472477.0 +2,ContainersReady,1697472477.0 diff --git a/eval/results/startup/coco_warm.csv b/eval/results/startup/coco_warm.csv index d0fe9cd..225f470 100644 --- a/eval/results/startup/coco_warm.csv +++ b/eval/results/startup/coco_warm.csv @@ -1,16 +1,22 @@ Run,Event,TimeStampMs -0,Start,1697220694.552954 -0,Initialized,1697220695.0 -0,PodScheduled,1697220695.0 -0,Ready,1697220708.0 -0,ContainersReady,1697220708.0 -1,Start,1697220714.630086 -1,Initialized,1697220715.0 -1,PodScheduled,1697220715.0 -1,Ready,1697220729.0 -1,ContainersReady,1697220729.0 -2,Start,1697220735.7185054 -2,Initialized,1697220736.0 -2,PodScheduled,1697220736.0 -2,Ready,1697220750.0 -2,ContainersReady,1697220750.0 +0,Initialized,1697472358.0 +0,PodScheduled,1697472358.0 +0,Start,1697472358.171579 +0,StartImagePull,1697472364.526325 +0,EndImagePull,1697472370.138844 +0,Ready,1697472373.0 +0,ContainersReady,1697472373.0 +1,Initialized,1697472378.0 +1,PodScheduled,1697472378.0 +1,Start,1697472378.2509236 +1,StartImagePull,1697472384.621931 +1,EndImagePull,1697472390.294493 +1,Ready,1697472393.0 +1,ContainersReady,1697472393.0 +2,Start,1697472399.336547 +2,Initialized,1697472400.0 +2,PodScheduled,1697472400.0 +2,StartImagePull,1697472405.92968 +2,EndImagePull,1697472411.515635 +2,Ready,1697472414.0 +2,ContainersReady,1697472414.0 diff --git a/eval/results/startup/docker_cold.csv b/eval/results/startup/docker_cold.csv index dd0d133..904910e 100644 --- a/eval/results/startup/docker_cold.csv +++ b/eval/results/startup/docker_cold.csv @@ -1,16 +1,22 @@ Run,Event,TimeStampMs -0,Initialized,1697220557.0 -0,PodScheduled,1697220557.0 -0,Start,1697220557.0543413 -0,Ready,1697220559.0 -0,ContainersReady,1697220559.0 -1,Initialized,1697220593.0 -1,PodScheduled,1697220593.0 -1,Start,1697220593.3947294 -1,Ready,1697220599.0 -1,ContainersReady,1697220599.0 -2,Start,1697220633.5336018 -2,Initialized,1697220634.0 -2,PodScheduled,1697220634.0 -2,Ready,1697220640.0 -2,ContainersReady,1697220640.0 +0,Start,1697476334.9183407 +0,Initialized,1697476335.0 +0,PodScheduled,1697476335.0 +0,StartImagePull,1697476335.985474 +0,EndImagePull,1697476338.508711 +0,Ready,1697476341.0 +0,ContainersReady,1697476341.0 +1,Initialized,1697476376.0 +1,PodScheduled,1697476376.0 +1,Start,1697476376.060256 +1,StartImagePull,1697476377.095043 +1,EndImagePull,1697476379.547167 +1,Ready,1697476382.0 +1,ContainersReady,1697476382.0 +2,Initialized,1697476417.0 +2,PodScheduled,1697476417.0 +2,Start,1697476417.1830556 +2,StartImagePull,1697476418.365998 +2,EndImagePull,1697476420.864521 +2,Ready,1697476423.0 +2,ContainersReady,1697476423.0 diff --git a/eval/results/startup/docker_warm.csv b/eval/results/startup/docker_warm.csv index ffa83fd..b91e441 100644 --- a/eval/results/startup/docker_warm.csv +++ b/eval/results/startup/docker_warm.csv @@ -1,16 +1,22 @@ Run,Event,TimeStampMs -0,Start,1697220448.6815393 -0,Initialized,1697220449.0 -0,PodScheduled,1697220449.0 -0,Ready,1697220450.0 -0,ContainersReady,1697220450.0 -1,Start,1697220484.8129041 -1,Initialized,1697220485.0 -1,PodScheduled,1697220485.0 -1,Ready,1697220486.0 -1,ContainersReady,1697220486.0 -2,Start,1697220520.9298782 -2,Initialized,1697220521.0 -2,PodScheduled,1697220521.0 -2,Ready,1697220522.0 -2,ContainersReady,1697220522.0 +0,StartImagePull,1697476186.999791 +0,EndImagePull,1697476189.388161 +0,Initialized,1697476226.0 +0,PodScheduled,1697476226.0 +0,Start,1697476226.3291554 +0,Ready,1697476228.0 +0,ContainersReady,1697476228.0 +1,StartImagePull,1697476186.999791 +1,EndImagePull,1697476189.388161 +1,Start,1697476262.4502141 +1,Initialized,1697476263.0 +1,PodScheduled,1697476263.0 +1,Ready,1697476264.0 +1,ContainersReady,1697476264.0 +2,StartImagePull,1697476186.999791 +2,EndImagePull,1697476189.388161 +2,Start,1697476298.58044 +2,Initialized,1697476299.0 +2,PodScheduled,1697476299.0 +2,Ready,1697476300.0 +2,ContainersReady,1697476300.0 diff --git a/tasks/eval/startup.py b/tasks/eval/startup.py index 2928af2..92357d5 100644 --- a/tasks/eval/startup.py +++ b/tasks/eval/startup.py @@ -2,6 +2,7 @@ from glob import glob from invoke import task from json import loads as json_loads +from matplotlib.patches import Patch from matplotlib.pyplot import subplots from os import makedirs from os.path import basename, exists, join @@ -16,6 +17,7 @@ PLOTS_DIR, ) from tasks.util.coco import guest_attestation, signature_verification +from tasks.util.containerd import get_time_pulling_image from tasks.util.k8s import template_k8s_file from tasks.util.kbs import clear_kbs_db, provision_launch_digest from tasks.util.kubeadm import get_pod_names_in_ns, run_kubectl_command @@ -128,6 +130,19 @@ def do_run(result_file, num_run, service_file, warmup=False): sleep(2) if not warmup: + # Work-out the time spent pulling container images + start_ts_service, end_ts_service = get_time_pulling_image("coco-helloworld-py") + start_ts_sidecar, end_ts_sidecar = get_time_pulling_image( + "coco-knative-sidecar" + ) + # We combine both image pulling times by taking the extreme-most + # timestamps. This is not necessarily correct (?) + start_ts = min(start_ts_service, start_ts_sidecar) + end_ts = max(end_ts_service, end_ts_sidecar) + events_ts.append(("StartImagePull", start_ts)) + events_ts.append(("EndImagePull", end_ts)) + + # Sort the events by timestamp and write them to a file events_ts = sorted(events_ts, key=lambda x: x[1]) for event in events_ts: write_csv_line(result_file, num_run, event[0], event[1]) @@ -196,6 +211,11 @@ def run(ctx, baseline=None): print("Executing baseline {} warmup run...".format(bline)) do_run(result_file, -1, service_file, warmup=True) + if flavour == "cold": + # `cold` happens after `warm`, so we want to clean-up after + # all the `warm` runs + cleanup_after_run(bline, used_images) + for nr in range(num_runs): print( "Executing baseline {} ({}) run {}/{}...".format( @@ -246,6 +266,8 @@ def plot(ctx): else: bar_width = (1 - space_between_baselines) / (num_flavours + 1) + pattern_for_flavour = {"warm": "//", "cold": "."} + color_for_event = {"pre-pull": "green", "image-pull": "blue", "post-pull": "orange"} for ind, flavour in enumerate(BASELINE_FLAVOURS): if num_flavours % 2 == 0: x_offset = bar_width * (ind + 1 / 2 - num_flavours / 2) @@ -253,23 +275,79 @@ def plot(ctx): x_offset = bar_width * (ind - num_flavours / 2) this_xs = [x + x_offset for x in xs] - print("bar width:", bar_width) - print("x offset:", x_offset) - print("xs:", this_xs) - ys = [] - for b in xlabels: - ys.append( - results_dict[b][flavour]["Ready"]["mean"] - - results_dict[b][flavour]["Start"]["mean"] - ) - ax.bar(this_xs, ys, label=flavour, width=bar_width) + ordered_events = { + "pre-pull": ("Start", "StartImagePull"), + "image-pull": ("StartImagePull", "EndImagePull"), + "post-pull": ("EndImagePull", "Ready"), + } + stacked_ys = [] + for ev in ordered_events: + start_ev = ordered_events[ev][0] + end_ev = ordered_events[ev][1] + ys = [] + for b in xlabels: + # Given the way we parse the containerd logs, the Start/End + # ImagePull events for baselines that cache docker images + # (in their 'warm' flavour) are going to refer to ImagePull + # events in the past, and botch any timestamp differences. + # Thus, we need to make a special-case for them here + if b == "docker" and flavour == "warm": + # For docker warm starts, we attribute all time spent in + # a post-pull stage + if ev == "post-pull": + event_duration = ( + results_dict[b][flavour]["Ready"]["mean"] + - results_dict[b][flavour]["Start"]["mean"] + ) + else: + event_duration = 0 + else: + event_duration = ( + results_dict[b][flavour][end_ev]["mean"] + - results_dict[b][flavour][start_ev]["mean"] + ) + + assert event_duration >= 0 + ys.append(event_duration) + + stacked_ys.append(ys) + + for num, ys in enumerate(stacked_ys): + label = list(ordered_events.keys())[num] + if num == 0: + ax.bar( + this_xs, + ys, + width=bar_width, + color=color_for_event[label], + edgecolor="black", + hatch=pattern_for_flavour[flavour], + ) + acc_ys = ys + else: + ax.bar( + this_xs, + ys, + bottom=acc_ys, # stacked_ys[num - 1], + width=bar_width, + color=color_for_event[label], + edgecolor="black", + hatch=pattern_for_flavour[flavour], + ) + for i in range(len(acc_ys)): + acc_ys[i] += ys[i] # Misc ax.set_xticks(xs, xlabels) ax.set_xlabel("Baseline") ax.set_ylabel("Time [s]") - ax.set_title("End-to-end latency to start a pod") - ax.legend() + ax.set_title("End-to-end latency to start a pod\n(cold start='/' - warm start='.')") + + # Manually craft the legend + legend_handles = [] + for ev in color_for_event: + legend_handles.append(Patch(color=color_for_event[ev], label=ev)) + ax.legend(handles=legend_handles) for plot_format in ["pdf", "png"]: plot_file = join(plots_dir, "startup.{}".format(plot_format)) diff --git a/tasks/util/containerd.py b/tasks/util/containerd.py new file mode 100644 index 0000000..a45219e --- /dev/null +++ b/tasks/util/containerd.py @@ -0,0 +1,29 @@ +from json import loads as json_loads +from subprocess import run + + +def get_time_pulling_image(image_name): + """ + Retrieve the start and end timestamp (in epoch floating seconds) for the + PullImage event from containerd + """ + journalctl_cmd = 'sudo journalctl -xeu containerd --since "10 min ago" -o json' + out = ( + run(journalctl_cmd, shell=True, capture_output=True) + .stdout.decode("utf-8") + .strip() + .split("\n") + ) + pull_image_json = [] + for o in out: + o_json = json_loads(o) + image_name = "coco-helloworld-py" + if "PullImage" in o_json["MESSAGE"] and image_name in o_json["MESSAGE"]: + pull_image_json.append(o_json) + + assert len(pull_image_json) >= 2 + + start_ts = int(pull_image_json[-2]["__REALTIME_TIMESTAMP"]) / 1e6 + end_ts = int(pull_image_json[-1]["__REALTIME_TIMESTAMP"]) / 1e6 + + return start_ts, end_ts