$30 off During Our Annual Pro Sale. View Details »

Tradeoffs, bad science, and polar bears: the world of Java optimisation

Tradeoffs, bad science, and polar bears: the world of Java optimisation

Welcome to the Java optimisation jungle. Why can’t we “just make it go faster”? It turns out, in most cases, we need to first work out “faster for whom?” and “why do we want to go faster?” and “what even *is* faster?” This talk introduces the basic principles of optimisation, before bouncing through the pitfalls of optimisation; why the exact same techniques which make Quarkus rocket-fast used to be a terrible idea fifteen years ago, why fast benchmarks make for slow programs, and why even though it can be easy to get wrong, optimisation really really matters. Along the way we’ll talk about measuring things, bad advice, garbage collection, and climate change.

Holly Cummins

November 29, 2022
Tweet

More Decks by Holly Cummins

Other Decks in Programming

Transcript

  1. tradeoffs, bad science, and polar bears:


    the world of java optimisation


    Holly Cummins


    Red Hat


    View Slide

  2. #Quarkus @holly_cummins
    why optimise?

    View Slide

  3. #Quarkus @holly_cummins
    why optimise?

    View Slide

  4. #Quarkus @holly_cummins
    why optimise?
    0.5s extra search
    page time

    View Slide

  5. #Quarkus @holly_cummins
    why optimise?
    0.5s extra search
    page time
    20% drop in
    traffic

    View Slide

  6. #Quarkus @holly_cummins
    why optimise?
    0.5s extra search
    page time
    20% drop in
    traffic
    100 ms latency on page
    load

    View Slide

  7. #Quarkus @holly_cummins
    why optimise?
    0.5s extra search
    page time
    20% drop in
    traffic
    100 ms latency on page
    load
    7% lower
    conversion rate

    View Slide

  8. #Quarkus @holly_cummins
    why optimise?
    0.5s extra search
    page time
    20% drop in
    traffic
    100 ms latency on page
    load
    7% lower
    conversion rate

    View Slide

  9. #Quarkus @holly_cummins
    why optimise?
    0.5s extra search
    page time
    20% drop in
    traffic
    10 ms delay in trading
    platform
    100 ms latency on page
    load
    7% lower
    conversion rate

    View Slide

  10. #Quarkus @holly_cummins
    why optimise?
    0.5s extra search
    page time
    20% drop in
    traffic
    10 ms delay in trading
    platform
    10% drop in
    revenue
    100 ms latency on page
    load
    7% lower
    conversion rate

    View Slide

  11. #Quarkus @holly_cummins
    what is optimising?

    View Slide

  12. #Quarkus @holly_cummins
    for whom?


    when?


    doing what?
    “make it go faster”

    View Slide

  13. #Quarkus @holly_cummins
    human-centric (technical) design

    View Slide

  14. #Quarkus @holly_cummins

    View Slide

  15. #Quarkus @holly_cummins
    performance can be:

    View Slide

  16. #Quarkus @holly_cummins
    performance can be:
    throughput

    View Slide

  17. #Quarkus @holly_cummins
    performance can be:
    throughput
    transactions
    per second

    View Slide

  18. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    transactions
    per second

    View Slide

  19. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    transactions
    per second
    start-up
    time

    View Slide

  20. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    transactions
    per second
    response
    time
    start-up
    time

    View Slide

  21. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    ramp-up
    time
    transactions
    per second
    response
    time
    start-up
    time

    View Slide

  22. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    capacity
    ramp-up
    time
    transactions
    per second
    response
    time
    start-up
    time

    View Slide

  23. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    capacity
    ramp-up
    time
    transactions
    per second
    response
    time
    start-up
    time
    bandwidth

    View Slide

  24. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    capacity
    ramp-up
    time
    transactions
    per second
    response
    time
    start-up
    time
    footprint
    bandwidth

    View Slide

  25. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    capacity
    ramp-up
    time
    transactions
    per second
    response
    time
    start-up
    time
    CPU usage
    footprint
    bandwidth

    View Slide

  26. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    capacity
    utilisation
    ramp-up
    time
    transactions
    per second
    response
    time
    start-up
    time
    CPU usage
    footprint
    bandwidth

    View Slide

  27. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    capacity
    utilisation

    ramp-up
    time
    transactions
    per second
    response
    time
    start-up
    time
    CPU usage
    footprint
    bandwidth

    View Slide

  28. #Quarkus @holly_cummins
    performance can be:
    throughput
    latency
    capacity
    utilisation

    ramp-up
    time
    transactions
    per second
    response
    time
    start-up
    time
    CPU usage
    footprint
    bandwidth

    View Slide

  29. #Quarkus @holly_cummins
    Never underestimate the bandwidth [throughput] of a
    station wagon full of tapes hurtling down the highway.


    –Andrew Tanenbaum, 1981

    View Slide

  30. #Quarkus @holly_cummins
    Never underestimate the bandwidth [throughput] of a
    station wagon full of tapes hurtling down the highway.


    –Andrew Tanenbaum, 1981
    but the latency is terrible …


    View Slide

  31. @holly_cummins
    requirements change

    View Slide

  32. @holly_cummins

    View Slide

  33. @holly_cummins

    View Slide

  34. @holly_cummins

    View Slide

  35. @holly_cummins

    View Slide

  36. @holly_cummins
    I am not
    designed for this.

    View Slide

  37. @holly_cummins
    the world changes

    View Slide

  38. #Quarkus @holly_cummins

    View Slide

  39. #Quarkus @holly_cummins
    -Xmx == $

    View Slide

  40. #Quarkus @holly_cummins
    -Xmx == $
    footprint

    View Slide

  41. #Quarkus @holly_cummins

    View Slide

  42. #Quarkus @holly_cummins
    which performs better?

    View Slide

  43. #Quarkus @holly_cummins
    quarkus
    trading-off flexibility against
    startup speed and footprint

    View Slide

  44. #Quarkus @holly_cummins
    quarkus
    trading-off flexibility against
    startup speed and footprint
    uhh … are you supposed
    to shut down applications
    after using them?

    View Slide

  45. #Quarkus @holly_cummins
    which is better?

    View Slide

  46. #Quarkus @holly_cummins
    which is better?
    which is faster?

    View Slide

  47. #Quarkus @holly_cummins
    which is better?
    GraalVM
    Quarkus
    Application
    which is faster?

    View Slide

  48. #Quarkus @holly_cummins
    which is better?
    OpenJDK GraalVM
    Quarkus Quarkus
    Application Application
    which is faster?

    View Slide

  49. #Quarkus @holly_cummins
    which is better?
    ephemeral or serverless
    OpenJDK GraalVM
    Quarkus Quarkus
    Application Application
    which is faster?

    View Slide

  50. #Quarkus @holly_cummins
    which is better?
    ephemeral or serverless
    OpenJDK GraalVM
    Quarkus Quarkus
    Application Application
    running your application
    for a long time
    which is faster?

    View Slide

  51. #Quarkus @holly_cummins
    30% of VMs are zombies (antithesisgroup.com)
    behaviour at idle

    View Slide

  52. #Quarkus @holly_cummins
    how to optimise?

    View Slide

  53. #Quarkus @holly_cummins
    find the bottleneck.
    fix it.

    View Slide

  54. #IBM @holly_cummins
    what could possibly go wrong?!

    View Slide

  55. #RedHat @holly_cummins
    intuition
    pitfall 1

    View Slide

  56. #Quarkus @holly_cummins
    this is not the place for ideas

    View Slide

  57. #Quarkus @holly_cummins
    measure, don’t guess.

    View Slide

  58. #Quarkus @holly_cummins
    measure the right thing

    View Slide

  59. #Quarkus @holly_cummins
    measure the right thing
    what do your users care about?

    View Slide

  60. #RedHat @holly_cummins
    numbers
    pitfall 2
    (The McNamara Fallacy)

    View Slide

  61. #Quarkus @holly_cummins

    View Slide

  62. #Quarkus @holly_cummins
    leading indicators

    View Slide

  63. #Quarkus @holly_cummins
    leading indicators lagging indicators

    View Slide

  64. #Quarkus @holly_cummins
    leading indicators
    we care about them
    lagging indicators

    View Slide

  65. #Quarkus @holly_cummins
    leading indicators
    we care about them
    easy to measure
    lagging indicators

    View Slide

  66. #Quarkus @holly_cummins
    leading indicators
    we care about them
    easy to measure
    hard to change
    lagging indicators

    View Slide

  67. #Quarkus @holly_cummins
    leading indicators
    we care about them
    easy to measure
    hard to change
    lagging indicators
    easy to change

    View Slide

  68. #Quarkus @holly_cummins
    leading indicators
    we care about them
    easy to measure
    hard to change
    lagging indicators
    predictive of a thing we care about
    easy to change

    View Slide

  69. #Quarkus @holly_cummins
    leading indicators
    we care about them
    easy to measure
    hard to change
    lagging indicators
    predictive of a thing we care about
    hard to identify
    easy to change

    View Slide

  70. #Quarkus @holly_cummins
    leading indicators
    we care about them
    easy to measure
    hard to change
    lagging indicators
    predictive of a thing we care about
    hard to identify
    easy to change

    View Slide

  71. #Quarkus @holly_cummins
    caution:


    performance experiments for entertainment purposes only.


    do not try these at home.

    View Slide

  72. #Quarkus @holly_cummins
    2007

    View Slide

  73. #Quarkus @holly_cummins
    bad-ish advice: “reduce time spent in garbage collection”

    View Slide

  74. #Quarkus @holly_cummins
    bad-ish advice: “reduce time spent in garbage collection”
    actually, garbage collection can make your application go faster

    View Slide

  75. #Quarkus @holly_cummins
    2007

    View Slide

  76. #Quarkus @holly_cummins
    2007

    View Slide

  77. #Quarkus @holly_cummins
    2021

    View Slide

  78. #Quarkus @holly_cummins
    2021

    View Slide

  79. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xcompactgc

    View Slide

  80. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    -Xcompactgc

    View Slide

  81. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    -Xmx110m
    -Xms110m
    -Xnocompactgc

    View Slide

  82. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    -Xmx160m
    -Xms160m
    -Xnocompactgc

    View Slide

  83. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    -Xmx300m
    -Xms300m
    -Xcompactgc
    why does the
    performance stay exactly the
    same no matter what gc
    settings I choose?

    View Slide

  84. #Quarkus @holly_cummins
    by the way, this is cheating.
    (remember the ‘bad science’?)

    View Slide

  85. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput

    View Slide

  86. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    tool: GCMV

    View Slide

  87. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    total GC time: 21.6s
    tool: GCMV

    View Slide

  88. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    total GC time: 21.6s
    4.1% of time in GC pause
    tool: GCMV

    View Slide

  89. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    total GC time: 21.6s
    4.1% of time in GC pause
    total GC time: 12.0s
    tool: GCMV

    View Slide

  90. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    total GC time: 21.6s
    4.1% of time in GC pause
    total GC time: 12.0s
    3.6% of time in GC pause
    tool: GCMV

    View Slide

  91. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    tool: GCMV

    View Slide

  92. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    493 transactions/s
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    260 transactions/s
    tool: GCMV

    View Slide

  93. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    493 transactions/s
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    260 transactions/s
    tool: GCMV

    View Slide

  94. #Quarkus @holly_cummins
    -verbose:gc
    -Xverbosegclog:gclog.xml
    -Xgcpolicy:optthruput
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    493 transactions/s
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    260 transactions/s
    tool: GCMV

    View Slide

  95. #Quarkus @holly_cummins
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    493 transactions/s
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    260 transactions/s

    View Slide

  96. #Quarkus @holly_cummins
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    493 transactions/s
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    260 transactions/s

    View Slide

  97. #Quarkus @holly_cummins
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    493 transactions/s
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    260 transactions/s
    leading indicator

    View Slide

  98. #Quarkus @holly_cummins
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    493 transactions/s
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    260 transactions/s
    leading indicator

    View Slide

  99. #Quarkus @holly_cummins
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    493 transactions/s
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    260 transactions/s
    leading indicator
    lagging indicator

    View Slide

  100. #Quarkus @holly_cummins
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    493 transactions/s
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    260 transactions/s
    leading indicator
    lagging indicator
    ?

    View Slide

  101. #Quarkus @holly_cummins
    total GC time: 21.6s
    4.1% of time in GC pause
    23.9 GB garbage collected
    493 transactions/s
    total GC time: 12.0s
    3.6% of time in GC pause
    13.0 GB garbage collected
    260 transactions/s
    leading indicator
    lagging indicator
    ?
    ?

    View Slide

  102. #Quarkus @holly_cummins
    so wait, what changed to make the app faster?
    running jmeter on the same machine as the app gives a big speedup!

    View Slide

  103. #Quarkus @holly_cummins
    “Any improvements made anywhere
    besides the bottleneck are an illusion.”


    – Gene Kim

    View Slide

  104. #Quarkus @holly_cummins
    time kills all performance advice
    (even mine)

    View Slide

  105. #Quarkus @holly_cummins
    the takeaways:


    gc can improve performance by rearranging the heap


    find the bottleneck


    validate advice independently

    View Slide

  106. #RedHat @holly_cummins
    advice
    pitfall 3

    View Slide

  107. #Quarkus @holly_cummins
    I read it on the
    internet!

    View Slide

  108. #IBM @holly_cummins
    noooooo!
    “make one big method because method dispatching is slow”

    View Slide

  109. #IBM @holly_cummins
    noooooo!
    “re-use your objects to help the garbage collector”

    View Slide

  110. #IBM @holly_cummins
    noooooo!
    “to tune your JVM, use this command-line:”


    -server -Xms1g -Xmx1g -XX:PermSize=1g -XX:MaxPermSize=256m -Xmn256m
    -Xss64k -XX:SurvivorRatio=30 -XX:+UseConcMarkSweepGC -XX:
    +CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly
    -XX:CMSInitiatingOccupancyFraction=10 -XX:+ScavengeBeforeFullGC -XX:
    +CMSScavengeBeforeRemark -XX:+PrintGCDateStamps -verbose:gc -XX:
    +PrintGCDetails -Dsun.net.inetaddr.ttl=5 -XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=`date`.hprof -Dcom.sun.management.jmxremote.port=5616
    -Dcom.sun.management.jmxremote.authenticate=false
    -Dcom.sun.management.jmxremote.ssl=false -server -Xms2g -Xmx2g
    -XX:MaxPermSize=256m -XX:NewRatio=1 -XX:+UseConcMarkSweepGC

    View Slide

  111. #IBM @holly_cummins
    noooooo!
    use StringBuilder, never concatenate strings with +=

    View Slide

  112. #IBM @holly_cummins
    noooooo!
    use StringBuilder, never concatenate strings with +=
    wait, what?


    yes, right?

    View Slide

  113. #Quarkus @holly_cummins
    2 things ruin advice:


    • context


    • time

    View Slide

  114. #RedHat @holly_cummins
    micro-optimisation
    pitfall 4

    View Slide

  115. #Quarkus @holly_cummins

    View Slide

  116. #Quarkus @holly_cummins
    static string beSlow()
    {
    string result = "";
    for (int i = 0; i < 314159; i++)
    {
    result += getStringData(i);
    }
    return result;
    }

    View Slide

  117. #Quarkus @holly_cummins
    @Override
    public String toString() {
    String ret = "\n\tMarket Summary at: " + getSummaryDate() + “\n\t\t TSIA:" + getTSIA() + “\n\t\t openTSIA:" + getOpenTSIA()
    + “\n\t\t gain:" + getGainPercent() + “\n\t\t volume:" + getVolume();
    if ((getTopGainers() == null) || (getTopLosers() == null)) {
    return ret;
    }
    ret += "\n\t\t Current Top Gainers:";
    Iterator it = getTopGainers().iterator();
    while (it.hasNext()) {
    QuoteDataBean quoteData = it.next();
    ret += ("\n\t\t\t" + quoteData.toString());
    }
    ret += "\n\t\t Current Top Losers:";
    it = getTopLosers().iterator();
    while (it.hasNext()) {
    QuoteDataBean quoteData = it.next();
    ret += ("\n\t\t\t" + quoteData.toString());
    }
    return ret;
    }

    View Slide

  118. #Quarkus @holly_cummins
    @Override
    public String toString() {
    String ret = "\n\tMarket Summary at: " + getSummaryDate() + “\n\t\t TSIA:" + getTSIA() + “\n\t\t openTSIA:" + getOpenTSIA()
    + “\n\t\t gain:" + getGainPercent() + “\n\t\t volume:" + getVolume();
    if ((getTopGainers() == null) || (getTopLosers() == null)) {
    return ret;
    }
    ret += "\n\t\t Current Top Gainers:";
    Iterator it = getTopGainers().iterator();
    while (it.hasNext()) {
    QuoteDataBean quoteData = it.next();
    ret += ("\n\t\t\t" + quoteData.toString());
    }
    ret += "\n\t\t Current Top Losers:";
    it = getTopLosers().iterator();
    while (it.hasNext()) {
    QuoteDataBean quoteData = it.next();
    ret += ("\n\t\t\t" + quoteData.toString());
    }
    return ret;
    }

    View Slide

  119. #Quarkus @holly_cummins
    @Override
    public String toString() {
    String ret = "\n\tMarket Summary at: " + getSummaryDate() + “\n\t\t TSIA:" + getTSIA() + “\n\t\t openTSIA:" + getOpenTSIA()
    + “\n\t\t gain:" + getGainPercent() + “\n\t\t volume:" + getVolume();
    if ((getTopGainers() == null) || (getTopLosers() == null)) {
    return ret;
    }
    ret += "\n\t\t Current Top Gainers:";
    Iterator it = getTopGainers().iterator();
    while (it.hasNext()) {
    QuoteDataBean quoteData = it.next();
    ret += ("\n\t\t\t" + quoteData.toString());
    }
    ret += "\n\t\t Current Top Losers:";
    it = getTopLosers().iterator();
    while (it.hasNext()) {
    QuoteDataBean quoteData = it.next();
    ret += ("\n\t\t\t" + quoteData.toString());
    }
    return ret;
    }

    View Slide

  120. #Quarkus @holly_cummins
    @Override
    public String toString() {
    String ret = "\n\tMarket Summary at: " + getSummaryDate() + “\n\t\t TSIA:" + getTSIA() + “\n\t\t openTSIA:" + getOpenTSIA()
    + “\n\t\t gain:" + getGainPercent() + “\n\t\t volume:" + getVolume();
    if ((getTopGainers() == null) || (getTopLosers() == null)) {
    return ret;
    }
    ret += "\n\t\t Current Top Gainers:";
    Iterator it = getTopGainers().iterator();
    while (it.hasNext()) {
    QuoteDataBean quoteData = it.next();
    ret += ("\n\t\t\t" + quoteData.toString());
    }
    ret += "\n\t\t Current Top Losers:";
    it = getTopLosers().iterator();
    while (it.hasNext()) {
    QuoteDataBean quoteData = it.next();
    ret += ("\n\t\t\t" + quoteData.toString());
    }
    return ret;
    }
    this never gets called

    View Slide

  121. #Quarkus @holly_cummins
    let’s make travel energy-efficient?

    View Slide

  122. #Quarkus @holly_cummins
    every little helps?

    View Slide

  123. #Quarkus @holly_cummins
    every little helps?
    every optimisation is another optimisation you aren’t doing

    View Slide

  124. #Quarkus @holly_cummins
    our platforms help

    View Slide

  125. #Quarkus @holly_cummins
    static string beSlow()
    {
    string result = "";
    for (int i = 0; i < 314159; i++)
    {
    result += getStringData(i);
    }
    return result;
    }

    View Slide

  126. #Quarkus @holly_cummins
    static string beSlow()
    {
    string result = “";
    result += getStringData(1);
    result += getStringData(2);
    result += getStringData(3);
    return result;
    }

    View Slide

  127. #Quarkus @holly_cummins
    static string beSlow()
    {
    string result = “";
    result += getStringData(1);
    result += getStringData(2);
    result += getStringData(3);
    return result;
    }
    this is fine

    View Slide

  128. #Quarkus @holly_cummins
    the JVM writers have far more time for optimising than you do
    clean, typical, code runs best

    View Slide

  129. #Quarkus @holly_cummins
    ok, but how to optimise?

    View Slide

  130. #Quarkus @holly_cummins
    tools

    View Slide

  131. #Quarkus @holly_cummins
    “What you can optimize is limited to what
    you can observe.”


    -Susie Xia, Netflix

    View Slide

  132. #Quarkus @holly_cummins
    observability

    View Slide

  133. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money

    View Slide

  134. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    VisualVM
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money

    View Slide

  135. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    VisualVM
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money

    View Slide

  136. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    VisualVM
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money
    IBM Health Center
    (for OpenJ9)

    View Slide

  137. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    flame graphs
    VisualVM
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money
    IBM Health Center
    (for OpenJ9)

    View Slide

  138. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    flame graphs
    GCMV
    VisualVM
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money
    IBM Health Center
    (for OpenJ9)

    View Slide

  139. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    flame graphs
    GCMV
    VisualVM
    Eclipse MAT
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money
    IBM Health Center
    (for OpenJ9)

    View Slide

  140. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    flame graphs
    GCMV
    VisualVM
    Eclipse MAT
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money
    GlowRoot
    IBM Health Center
    (for OpenJ9)

    View Slide

  141. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    flame graphs
    GCMV
    New Relic*
    VisualVM
    Eclipse MAT
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money
    GlowRoot
    IBM Health Center
    (for OpenJ9)

    View Slide

  142. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    flame graphs
    GCMV
    New Relic*
    AppDynamics*
    VisualVM
    Eclipse MAT
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money
    GlowRoot
    IBM Health Center
    (for OpenJ9)

    View Slide

  143. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    flame graphs
    GCMV
    New Relic*
    AppDynamics*
    VisualVM
    Dynatrace*
    Eclipse MAT
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money
    GlowRoot
    IBM Health Center
    (for OpenJ9)

    View Slide

  144. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    flame graphs
    GCMV
    New Relic*
    AppDynamics*
    Zipkin
    VisualVM
    Dynatrace*
    Eclipse MAT
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money
    GlowRoot
    IBM Health Center
    (for OpenJ9)

    View Slide

  145. #Quarkus @holly_cummins
    method profiler


    GC analysis


    heap analysis


    APM


    distributed tracing
    Mission Control
    flame graphs
    GCMV
    New Relic*
    AppDynamics*
    Jaeger
    Zipkin
    VisualVM
    Dynatrace*
    Eclipse MAT
    * not free


    this is an incomplete list, because there are a lot of tools out there, and many cost money
    GlowRoot
    IBM Health Center
    (for OpenJ9)

    View Slide

  146. #Quarkus @holly_cummins
    Netflix microservice
    architecture
    optimising a micro-service: is that micro-optimising?

    View Slide

  147. @holly_cummins
    you may need to know the whole system
    context to know what to optimise

    View Slide

  148. #Quarkus @holly_cummins
    don’t forget the edges
    queueing theory helps us understand
    where the disasters happen

    View Slide

  149. #Quarkus @holly_cummins
    “When it comes to IT performance, amateurs look
    at averages. Professionals look at distributions.”


    – Avishai Ish-Shalom

    View Slide

  150. #Quarkus @holly_cummins
    “Nines don’t matter if your
    users aren’t happy.”


    – Charity Majors

    View Slide

  151. #Quarkus @holly_cummins
    slow performance can turn into big cloud bills
    make cloud costs visible to engineers

    View Slide

  152. #Quarkus @holly_cummins
    ok, but you promised bears

    View Slide

  153. #Quarkus @holly_cummins
    if you leave the TV on when
    you’re not using it, you’re a
    polar bear murderer

    View Slide

  154. #Quarkus @holly_cummins
    it all fits together

    View Slide

  155. @holly_cummins #RedHat
    density
    Source: Clement Escoffier
    cost impact of framework choice
    Setup:


    • 800 requests/second, over 20 days


    • SLA > 99%


    • AWS instances


    Assumptions:


    • Costs are for us-east-1 data centre

    View Slide

  156. @holly_cummins #RedHat
    Setup:


    • 800 requests/second, over 20 days


    • SLA > 99%


    Assumptions:


    • 50% load


    • us-east-1 data centre


    • Teads dataset
    Source: Clement Escoffier x Teads
    cloud carbon impact of framework choice

    View Slide

  157. @holly_cummins #RedHat
    capacity
    Source: John O’Hara
    Setup:


    • REST + CRUD


    • large heap


    • RAPL energy measurement


    Assumptions:


    • US energy mix
    climate impact of framework choice

    View Slide

  158. @holly_cummins #RedHat
    our experiments show
    strong correlations between

    View Slide

  159. @holly_cummins #RedHat
    our experiments show
    strong correlations between

    View Slide

  160. @holly_cummins #RedHat
    our experiments show
    strong correlations between
    • lower runtime cost

    View Slide

  161. @holly_cummins #RedHat
    our experiments show
    strong correlations between
    • lower runtime cost
    • higher throughput

    View Slide

  162. @holly_cummins #RedHat
    our experiments show
    strong correlations between
    • lower runtime cost
    • higher throughput
    • better carbon-efficiency

    View Slide

  163. @holly_cummins #RedHat
    our experiments show
    strong correlations between
    • lower runtime cost
    • higher throughput
    • better carbon-efficiency

    View Slide

  164. #Quarkus @holly_cummins
    there is a moral imperative to avoid waste

    View Slide

  165. #Quarkus @holly_cummins
    there is a moral imperative to avoid waste
    electricity


    hardware

    View Slide

  166. #Quarkus @holly_cummins
    data centres use 1-2% of
    the world’s electricity

    View Slide

  167. #Quarkus @holly_cummins
    fewer devices


    longer lifetime

    View Slide

  168. #Quarkus @holly_cummins
    fewer devices


    longer lifetime
    higher efficiency

    View Slide

  169. #Quarkus @holly_cummins
    fewer devices


    longer lifetime
    higher efficiency
    lower footprint

    View Slide

  170. #Quarkus @holly_cummins
    fewer devices


    longer lifetime
    higher efficiency
    lower footprint
    more multitenancy

    View Slide

  171. #Quarkus @holly_cummins
    fewer devices


    longer lifetime
    higher efficiency
    lower footprint
    more multitenancy
    optimise for longevity

    View Slide

  172. #Quarkus @holly_cummins
    fewer devices


    longer lifetime
    higher efficiency
    lower footprint
    more multitenancy
    optimise for longevity
    the end of planned obsolescence?

    View Slide

  173. #Quarkus @holly_cummins
    sooo …


    you can optimise, and it can be fun


    measure, don’t guess


    only optimise what matters
    now for questions!


    @holly_cummins
    #Quarkus

    View Slide