<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>Symposium on Software Performance, November</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>Overhead Comparison of OpenTelemetry, inspectIT and Kieker</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>David Georg Reichelt</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Stefan Kühne</string-name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Wilhelm Hasselbring</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Software Engineering Group, Christian-Albrechts-Universität zu Kiel</institution>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>University Computing Centre, Research and Development, Universität Leipzig</institution>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2021</year>
      </pub-date>
      <volume>0</volume>
      <fpage>9</fpage>
      <lpage>10</lpage>
      <abstract>
        <p>Having low performance overhead when monitoring the performance is crucial for exact measurements. Especially when trying to identify performance changes at code level, the performance overhead needs to be as low as possible. Due to changes in monitoring frameworks, performance benchmarks need regular updates. Due to changes in virtual machines, operating systems and hardware environments, performance benchmarking results also need regular updates. Therefore, we describe an extension of the benchmark MooBench which includes the emerging monitoring framework OpenTelemetry in MooBench, and the results of its execution on a Rasperry Pi 4 in this paper. We find that Kieker is creating slightly less overhead than inspectIT and OpenTelemetry when processing traces.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;performance measurement</kwd>
        <kwd>performance monitoring</kwd>
        <kwd>performance benchmarking</kwd>
        <kwd>software performance engineering</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        To assure that performance requirements are met, the performance of parts of a system needs
to be measured under real conditions. This measurement in live operation is called monitoring
[1, p. 45]. Monitoring data can be used to identify performance issues, to extract performance
models or for online capacity management. To measure the performance, monitoring tools
add monitoring probes, i.e. pieces of code capable of measuring the resource usage, into the
monitored system and serialize the monitoring records. The instrumentation, the measurement
itself and the serialization cause monitoring overhead. Especially for the identification of
performance changes at code level [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], the monitoring overhead needs to be as low as possible.
      </p>
      <p>
        Benchmarking compares diferent methods, techniques and tools and is used widely to
compare the performance of diferent implementation [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Therefore, the MooBench benchmark
has been introduced to compare the performance overhead of diferent monitoring frameworks
[
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. Originally, MooBench was able to measure the performance of the performance monitoring
frameworks Kieker [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], inspectIT1 and SPASSmeter [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ].
      </p>
      <p>Recently, the monitoring framework OpenTelemetry2 emerged. It provides monitoring
support for a variety of languages and frameworks, and can therefore be used in diferent
contexts. This paper presents an extension of MooBench that enables measuring the overhead
of OpenTelemetry and Kieker and results of the execution of the extended MooBench.</p>
      <p>In the remainder of this paper, we first describe the benchmark MooBench and our extension
of MooBench for measurement of OpenTelemetry in Section 2. Afterwards, we describe the
measurement results of our extended MooBench version in Section 3. In Section 4, we discuss
related work. Finally, we summarize this paper and give an outlook to future work in Section 5.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Supporting OpenTelemetry in MooBench</title>
      <p>This section first gives an overview of the benchmark MooBench and describes our extension
of MooBench afterwards.</p>
      <sec id="sec-2-1">
        <title>2.1. MooBench</title>
        <p>
          MooBench is a benchmark for measuring the overhead of monitoring frameworks [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ].
Performance measurement in the JVM is influenced by non-deterministic efects such as
Just-In-TimeCompilation (JIT), Garbage Collections and memory fragmentation. Therefore, performance
measurements need to be repeated inside of one started JVM, called VM in the remainder. Since
warmup may end up in diferent steady states, multiple VMs need to be started and their results
need to be analyzed by statistic tests such as T-Test [
          <xref ref-type="bibr" rid="ref7">7</xref>
          ].
        </p>
        <p>MooBench provides a basic Java application that repeats busy waiting in the leaf node of a
tree of nodes with only one child with a given recursion depth. For every monitoring framework,
a Bash script automates the VM starts of the benchmark for the correspondent framework
configuration. For the frameworks, the configurations contain (at least) the baseline (no
instrumentation) and regular monitoring with serialization of the results. They may also contain
deactivated monitoring (but enabled instrumentation) and diferent monitoring configurations
(e.g. writing the results as generic text or as binary in Kieker). The measurement result of each
VM run is saved as CSV into a result directory with a name denoting the VM configuration.</p>
      </sec>
      <sec id="sec-2-2">
        <title>2.2. Extension of MooBench</title>
        <p>To make OpenTelemetry runnable with MooBench, we implemented the instrumentation with
OpenTelemetry. Additionally, the existing benchmarks for inspectIT were updated.</p>
        <p>For instrumenting OpenTelemetry, we added a script. This script was built to support
corresponding calls for each Kieker Call, i.e. (1) the baseline (no instrumentation), (2) monitoring
with disabled sampling with otel.traces.sampler=always_off, i.e. no measurement will be done,
but the instrumentation is still present, like Kieker with deactivated probe, (3) logging all method
executions to standard output, like Kieker writing to hard disc, (4) logging all method executions
(spans) to Zipkin and (5) logging metrics of executions to Prometheus, like Kieker writing to
TCP. The measurement of Prometheus is disabled on 32-bit systems, since Prometheus only
runs on 64-bit systems. Since results are saved in the MooBench CSV format, existing R scripts
can be used for data analysis. Our forked version of MooBench is available on GitHub.3</p>
        <sec id="sec-2-2-1">
          <title>3https://github.com/DaGeRe/moobench-fork/</title>
        </sec>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>3. Measurement Results</title>
      <p>
        To facilitate reproducibility of our results, we decided to run our benchmarks on a Raspberry
Pi like Knoche and Eichelberger [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. We used the latest Raspberry Pi 4 running Raspberry OS
(formerly known as Raspbian) 5.10.17-v7l+ in the 32 bit version and OpenJDK 11.0.11. Since
Rasperry OS runs on 32-bit by default, the Jaeger serialization could not be used. To compare
the Raspberry Pi results to a regular Desktop system, we also measured the same benchmarks
on an i7-4770 CPU @ 3.40GHz with 16 GB RAM, running Ubuntu 20.04 and OpenJDK 11.0.11.
We executed the benchmark with call tree depth 10 (like Knoche and Eichelberger [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]) and with
growing call tree depth.
      </p>
      <sec id="sec-3-1">
        <title>3.1. Call Tree Depth 10</title>
        <p>Our results of the execution of 2 000 000 calls with recursion depth 10 and 10 VM starts are
depicted in Table 1 and Table 2. On Raspberry Pi and i7-4770, all relations stay equal, e.g.
deactivated OpenTelemetry is slower than deactivated Kieker both on Raspberry Pi and i7-4770.
Nevertheless, we see that the ratio of execution times changes, e.g. baseline execution is
approximately 25 times faster on i7-4770 than on Raspberry Pi but execution with deactivated
OpenTelemetry instrumentation is only approximately 5 times faster. Due to the limited
instruction set of ARM processors, benchmark results on Raspberry Pi are probably not corresponding
to benchmark results on desktop or server systems. Therefore, Raspberry Pi might not be a
suitable hardware for benchmarking in every use case.</p>
        <p>For the
configurations, we see the
following results:
Baseline: The
Raspberry Pi 4 with
current software
environment shows (as
expected) slight
improvements over
the measurement
values from Knoche</p>
        <sec id="sec-3-1-1">
          <title>Variant</title>
        </sec>
        <sec id="sec-3-1-2">
          <title>Baseline</title>
          <p>Kieker
Deactivated Probe</p>
        </sec>
        <sec id="sec-3-1-3">
          <title>DumpWriter</title>
        </sec>
        <sec id="sec-3-1-4">
          <title>Logging (Text)</title>
        </sec>
        <sec id="sec-3-1-5">
          <title>Logging (Binary)</title>
          <p>TCP</p>
          <p>Raspberry Pi
95 % CI
[1.5;1.5]
[4.1;4.1]
[51.9;52.0]
[743.3;799.4]
[59.8;87.8]
[45.6;45.7]

0.1
7.5
14.6</p>
        </sec>
      </sec>
      <sec id="sec-3-2">
        <title>3.2. Growing Call Tree Depth</title>
        <p>depth. Even if call tree depth are discrete values, we chose to draw lines for better visibility.
inspectIT
Variant Deactivated</p>
        <p>StdOut</p>
        <p>Zipkin</p>
        <p>Prometheus Deactivated</p>
        <p>Zipkin</p>
        <p>
          Prometheus
[
          <xref ref-type="bibr" rid="ref9">9</xref>
          ]. To measure the performance, benchmarking harnesses like the Java Microbenchmarking
Harness jmh4 provide an execution environment for workload specification and measurement.
According to a study of Stefan et al. [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ], only 3,4 % of all open source projects continously
benchmark their software performance. Widespread frameworks like Hadoop [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ] or Java itself5
contain benchmarks for continuous performance evaluation. Besides application monitoring
overhead, other benchmarks cover other system classes as stream processing engines [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ] or ML
systems [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ]. In contrast to these works, we examined the performance overhead of application
performance monitoring.
        </p>
        <p>
          Ahmed et al. [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ] compare diferent APM tools by executing a load test on diferent systems
and researching whether a performance regression could be identified. Afterwards, they check
whether performance issues could be detected by thresholds in the commercial APM tools New
Relic, AppDynamics and Dynatrace, and the open source tool Pinpoint6. They did not research
Probe
10.5
8.2
        </p>
        <p>Dump
Writer
methods. Therefore,
instrumenting the whole application will
always create big overhead. (2) The
relations from call tree depth 10
persist: Sending the trace to Zipkin
from OpenTelemetry or inspectIT
creates more overhead then
sending the trace using Kieker.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Related</title>
    </sec>
    <sec id="sec-5">
      <title>Work</title>
      <p>the overhead of the tools, but their suitability for identification of performance changes.</p>
      <p>
        In contrast to this work, MooBench [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] measures the overhead of performance monitoring
tools. It is used continuously for measuring the performance overhead of Kieker. MooBench
has been extended and used for testing the replicability of performance measurements on the
Raspberry Pi by Knoche and Eichelberger [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ]. They used diferent benchmarks to assess the
replicability of performance measurements on the Raspberry Pi. They find that the Raspberry
Pi is capable of providing an infrastructure for replicable benchmark execution. In contrast to
our work, they did not consider OpenTelemetry and use a Raspberry Pi 3. OpenTelemetry itself
maintains continuous performance benchmarks for the performance of its python
implementation.7 While the users of OpenTelemetry do occasional overhead measurement,8 no continuous
benchmarking or benchmarking against other frameworks is done. Hence, a comparison of the
monitoring overhead of OpenTelemetry in Java and Kieker has not been done so far.
      </p>
      <p>
        Waller and Hasselbring [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] research the efects of activation of processor cores and
multithreading to the monitoring overhead. They nfid that using one processor core with
hyperthreading yields the lowest overhead in their configuration, since synchronization overhead
between diferent processor cores increases the monitoring overhead. In contrast to their work,
this work focusses on the comparison of diferent monitoring frameworks.
      </p>
    </sec>
    <sec id="sec-6">
      <title>5. Summary and Outlook</title>
      <p>We compared the monitoring overhead of OpenTelemetry and Kieker. Therefore, we extended
the MooBench benchmark. By execution of the benchmarks on a Raspberry Pi 4 and a regular
Desktop PC, we found that Kieker has better performance with serialization to hard disc and
with processing the results with TCP. This relation also persists with growing call tree depth.
We also see that the ratios between execution durations on Raspberry Pi 4 and the regular
Desktop PC vary for diferent benchmark configurations. Therefore, the Raspberry Pi might
not be a suitable hardware for benchmark execution in every use case.</p>
      <p>
        In the future, benchmarks are required that cover real world usages of application monitoring
frameworks better. Therefore, the following extensions are necessary from our point of view:
(1) Real world programs are not built out of single-children trees with workload only in the
one leaf node. The current tree structure leads to a regular execution order consisting of a
constant number of monitored method executions and one busy wait. More complex trees
containing a more complex distribution of the workload would make it possible to measure
more realistic overhead. In a binary tree with busy wait in every leaf, the count of executions
before the leaf node is called would vary. (2) Real world monitoring overhead is also caused by
monitoring of specific frameworks, e.g. Jersey, CXF and Spring. To benchmark the overhead
created by the probes for these frameworks, separate benchmarked application would need
to be created (or adopted for this use case) and maintained. (3) Monitoring overhead is only
one measurable property of monitoring. For practical purposes, like root cause analysis for
performance problems or anomaly detection, accuracy is also a main property. Accuracy could
be checked by how well certain root cause analysis algorithms perform with the examined
7https://open-telemetry.github.io/opentelemetry-python/benchmarks/index.html
8https://github.com/open-telemetry/opentelemetry-java-instrumentation/discussions/2104
monitoring framework like Ahmed et al. [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ].
      </p>
      <p>Acknowledgments This work is funded by the German Federal Ministry of Education and
Research within the project “Performance Überwachung Efizient Integriert” (PermanEnt, BMBF
01IS20032D).</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>J.</given-names>
            <surname>Waller</surname>
          </string-name>
          , Performance Benchmarking of Application Monitoring Frameworks, BoD-Books on Demand,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>D. G.</given-names>
            <surname>Reichelt</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Kühne</surname>
          </string-name>
          , W. Hasselbring,
          <article-title>PeASS: A Tool for Identifying Performance Changes at Code Level</article-title>
          ,
          <source>in: Proceedings of the 33rd ACM/IEEE ASE, ACM</source>
          ,
          <year>2019</year>
          . (in press).
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>W.</given-names>
            <surname>Hasselbring</surname>
          </string-name>
          ,
          <article-title>Benchmarking as Empirical Standard in Software Engineering Research</article-title>
          , CoRR abs/2105.00272 (
          <year>2021</year>
          ). URL: https://arxiv.org/abs/2105.00272. arXiv:
          <volume>2105</volume>
          .
          <fpage>00272</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>J.</given-names>
            <surname>Waller</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N. C.</given-names>
            <surname>Ehmke</surname>
          </string-name>
          ,
          <string-name>
            <surname>W. Hasselbring,</surname>
          </string-name>
          <article-title>Including Performance Benchmarks into Continuous Integration to Enable DevOps</article-title>
          ,
          <source>ACM SIGSOFT Software Engineering Notes</source>
          <volume>40</volume>
          (
          <year>2015</year>
          )
          <fpage>1</fpage>
          -
          <lpage>4</lpage>
          . URL: http://eprints.uni-kiel.de/28433/. doi:doi:10.1145/2735399.2735416.
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>W.</given-names>
            <surname>Hasselbring</surname>
          </string-name>
          ,
          <string-name>
            <surname>A. van Hoorn</surname>
          </string-name>
          ,
          <article-title>Kieker: A monitoring framework for software engineering research</article-title>
          ,
          <source>Software Impacts</source>
          <volume>5</volume>
          (
          <year>2020</year>
          )
          <article-title>100019</article-title>
          . doi:https://doi.org/10.1016/j.simpa.
          <year>2020</year>
          .
          <volume>100019</volume>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>H.</given-names>
            <surname>Eichelberger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Schmid</surname>
          </string-name>
          ,
          <article-title>Flexible resource monitoring of Java programs</article-title>
          ,
          <source>Journal of Systems and Software</source>
          <volume>93</volume>
          (
          <year>2014</year>
          )
          <fpage>163</fpage>
          -
          <lpage>186</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>A.</given-names>
            <surname>Georges</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Buytaert</surname>
          </string-name>
          , L. Eeckhout,
          <article-title>Statistically Rigorous Java Performance Evaluation</article-title>
          ,
          <source>ACM SIGPLAN Notices</source>
          <volume>42</volume>
          (
          <year>2007</year>
          )
          <fpage>57</fpage>
          -
          <lpage>76</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>H.</given-names>
            <surname>Knoche</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Eichelberger</surname>
          </string-name>
          ,
          <article-title>The Raspberry Pi: A Platform for Replicable Performance Benchmarks?</article-title>
          ,
          <source>Softwaretechnik-Trends</source>
          <volume>37</volume>
          (
          <year>2017</year>
          )
          <fpage>14</fpage>
          -
          <lpage>16</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>P.</given-names>
            <surname>Stefan</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Horky</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Bulej</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Tuma</surname>
          </string-name>
          ,
          <article-title>Unit Testing Performance in Java Projects: Are We There Yet?</article-title>
          ,
          <source>in: Proceedings of ACM/SPEC ICPE</source>
          <year>2017</year>
          , ACM,
          <year>2017</year>
          , pp.
          <fpage>401</fpage>
          -
          <lpage>412</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>S.</given-names>
            <surname>Huang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Huang</surname>
          </string-name>
          ,
          <string-name>
            <given-names>Y.</given-names>
            <surname>Liu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Yi</surname>
          </string-name>
          ,
          <string-name>
            <surname>J. Dai,</surname>
          </string-name>
          <article-title>HiBench: A Representative and Comprehensive Hadoop Benchmark Suite</article-title>
          ,
          <source>in: Proc. ICDE Workshops</source>
          ,
          <year>2010</year>
          , pp.
          <fpage>41</fpage>
          -
          <lpage>51</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>S.</given-names>
            <surname>Henning</surname>
          </string-name>
          , W. Hasselbring, Theodolite: Scalability Benchmarking of Distributed Stream Processing Engines in Microservice Architectures,
          <source>Big Data Research</source>
          <volume>25</volume>
          (
          <year>2021</year>
          )
          <fpage>100209</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>P.</given-names>
            <surname>Mattson</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V. J.</given-names>
            <surname>Reddi</surname>
          </string-name>
          , C. Cheng, C. Coleman,
          <string-name>
            <given-names>G.</given-names>
            <surname>Diamos</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Kanter</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Micikevicius</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Patterson</surname>
          </string-name>
          , G. Schmuelling,
          <string-name>
            <given-names>H.</given-names>
            <surname>Tang</surname>
          </string-name>
          , et al.,
          <source>MLPerf: An Industry Standard Benchmark Suite for Machine Learning Performance, IEEE Micro 40</source>
          (
          <year>2020</year>
          )
          <fpage>8</fpage>
          -
          <lpage>16</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <surname>T. M. Ahmed</surname>
            ,
            <given-names>C.-P.</given-names>
          </string-name>
          <string-name>
            <surname>Bezemer</surname>
            ,
            <given-names>T.-H.</given-names>
          </string-name>
          <string-name>
            <surname>Chen</surname>
            ,
            <given-names>A. E.</given-names>
          </string-name>
          <string-name>
            <surname>Hassan</surname>
          </string-name>
          , W. Shang,
          <article-title>Studying the Efectiveness of Application Performance Management (APM) Tools for Detecting Performance Regressions for Web Applications: An Experience Report</article-title>
          , in: IEEE/ACM MSR, IEEE,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>H.</given-names>
            <surname>Knoche</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Eichelberger</surname>
          </string-name>
          ,
          <article-title>Using the Raspberry Pi and Docker for Replicable Performance Experiments: Experience Paper</article-title>
          ,
          <source>in: Proceedings of the 2018 ICPE</source>
          ,
          <year>2018</year>
          , pp.
          <fpage>305</fpage>
          -
          <lpage>316</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>J.</given-names>
            <surname>Waller</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Hasselbring</surname>
          </string-name>
          ,
          <article-title>A Comparison of the Influence of Diferent Multi-Core Processors on the Runtime Overhead for Application-Level Monitoring</article-title>
          , in: ICMSEPT, Springer,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>