Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

April 14, 2022
Tweet

More Decks by Holly Cummins

Other Decks in Programming

Transcript



  1. Holly Cummins
    IBM
    @holly_cummins
    tradeoffs, bad science, and polar bears:
    the world of java optimisation

    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
    traf
    fi
    c

    View Slide

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

    View Slide

  7. #Quarkus @holly_cummins
    why optimise?
    0.5s extra search
    page time
    20% drop in
    traf
    fi
    c
    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
    traf
    fi
    c
    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
    traf
    fi
    c
    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
    traf
    fi
    c
    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
    design thinking

    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
    transactions
    per second
    response
    time start-up time
    ramp-up
    time

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

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

    View Slide

  27. #Quarkus @holly_cummins
    Never underestimate the bandwidth [throughput] of a
    station wagon full of tapes hurtling down the highway.
    –Andrew Tanenbaum, 1981

    View Slide

  28. #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

  29. @holly_cummins
    requirements change

    View Slide

  30. @holly_cummins

    View Slide

  31. @holly_cummins

    View Slide

  32. @holly_cummins

    View Slide

  33. @holly_cummins

    View Slide

  34. @holly_cummins
    I am not
    designed for this.

    View Slide

  35. @holly_cummins
    the world changes

    View Slide

  36. #Quarkus @holly_cummins

    View Slide

  37. #Quarkus @holly_cummins
    -Xmx == $

    View Slide

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

    View Slide

  39. #Quarkus @holly_cummins

    View Slide

  40. #Quarkus @holly_cummins
    which performs better?

    View Slide

  41. #Quarkus @holly_cummins
    quarkus
    trading-off
    fl
    exibility against
    startup speed and footprint

    View Slide

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

    View Slide

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

    View Slide

  44. #Quarkus @holly_cummins
    how to optimise?

    View Slide

  45. #Quarkus @holly_cummins
    find the bottleneck.
    fi
    x it.

    View Slide

  46. #IBM @holly_cummins
    intuition
    pitfall 1

    View Slide

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

    View Slide

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

    View Slide

  49. #Quarkus @holly_cummins
    measure the right thing

    View Slide

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

    View Slide

  51. #IBM @holly_cummins
    numbers
    pitfall 2

    View Slide

  52. #Quarkus @holly_cummins

    View Slide

  53. #Quarkus @holly_cummins
    leading indicators

    View Slide

  54. #Quarkus @holly_cummins
    leading indicators lagging indicators

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  59. #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

  60. #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

  61. #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

  62. #Quarkus @holly_cummins
    caution:
    performance experiments for entertainment purposes only.
    do not try these at home.

    View Slide

  63. #Quarkus @holly_cummins
    2007

    View Slide

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

    View Slide

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

    View Slide

  66. #Quarkus @holly_cummins
    2007

    View Slide

  67. #Quarkus @holly_cummins
    2007

    View Slide

  68. #Quarkus @holly_cummins
    2021

    View Slide

  69. #Quarkus @holly_cummins
    2021

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  74. #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

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  79. #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

  80. #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

  81. #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

  82. #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

  83. #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

  84. #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

  85. #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

  86. #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

  87. #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

  88. #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

  89. #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

  90. #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

  91. #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

  92. #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

  93. #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

  94. #Quarkus @holly_cummins
    “Any improvements made anywhere
    besides the bottleneck are an
    illusion.”
    – Gene Kim

    View Slide

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

    View Slide

  96. #Quarkus @holly_cummins
    the takeaways:
    gc can improve performance by rearranging the heap
    find the bottleneck
    validate advice independently

    View Slide

  97. #IBM @holly_cummins
    advice
    pitfall 3

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  101. #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

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

    View Slide

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

    View Slide

  104. #Quarkus @holly_cummins
    2 things ruin advice:
    • context
    • time

    View Slide

  105. #IBM @holly_cummins
    micro-optimisation
    pitfall 4

    View Slide

  106. #Quarkus @holly_cummins

    View Slide

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

    View Slide

  108. #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

  109. #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

  110. #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

  111. #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

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

    View Slide

  113. #Quarkus @holly_cummins
    every little helps?

    View Slide

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

    View Slide

  115. #Quarkus @holly_cummins
    our platforms help

    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
    static string beSlow()
    {
    string result = “";
    result += getStringData(1);
    result += getStringData(2);
    result += getStringData(3);
    return result;
    }

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  121. #Quarkus @holly_cummins
    tools

    View Slide

  122. #Quarkus @holly_cummins
    “What you can optimize is limited to
    what you can observe.”
    -Susie Xia, Netflix

    View Slide

  123. #Quarkus @holly_cummins
    observability

    View Slide

  124. #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

  125. #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

  126. #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

  127. #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

  128. #Quarkus @holly_cummins
    method profiler
    GC analysis
    heap analysis
    APM
    distributed tracing
    Mission Control
    fl
    ame 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

  129. #Quarkus @holly_cummins
    method profiler
    GC analysis
    heap analysis
    APM
    distributed tracing
    Mission Control
    fl
    ame 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

  130. #Quarkus @holly_cummins
    method profiler
    GC analysis
    heap analysis
    APM
    distributed tracing
    Mission Control
    fl
    ame 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

  131. #Quarkus @holly_cummins
    method profiler
    GC analysis
    heap analysis
    APM
    distributed tracing
    Mission Control
    fl
    ame 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

  132. #Quarkus @holly_cummins
    method profiler
    GC analysis
    heap analysis
    APM
    distributed tracing
    Mission Control
    fl
    ame 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

  133. #Quarkus @holly_cummins
    method profiler
    GC analysis
    heap analysis
    APM
    distributed tracing
    Mission Control
    fl
    ame 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

  134. #Quarkus @holly_cummins
    method profiler
    GC analysis
    heap analysis
    APM
    distributed tracing
    Mission Control
    fl
    ame 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

  135. #Quarkus @holly_cummins
    method profiler
    GC analysis
    heap analysis
    APM
    distributed tracing
    Mission Control
    fl
    ame 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

  136. #Quarkus @holly_cummins
    method profiler
    GC analysis
    heap analysis
    APM
    distributed tracing
    Mission Control
    fl
    ame 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

  137. #Quarkus @holly_cummins
    Net
    fl
    ix microservice
    architecture
    optimising a micro-service: is that micro-optimising?

    View Slide

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

    View Slide

  139. #Quarkus @holly_cummins
    “Nines don’t matter if your
    users aren’t happy.”
    – Charity Majors

    View Slide

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

    View Slide

  141. #Quarkus @holly_cummins
    “When it comes to IT performance, amateurs look
    at averages. Professionals look at distributions.”
    – Avishai Ish-Shalom

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  148. #Quarkus @holly_cummins
    fewer devices
    longer lifetime

    View Slide

  149. #Quarkus @holly_cummins
    fewer devices
    longer lifetime
    higher ef
    fi
    ciency

    View Slide

  150. #Quarkus @holly_cummins
    fewer devices
    longer lifetime
    higher ef
    fi
    ciency
    lower footprint

    View Slide

  151. #Quarkus @holly_cummins
    fewer devices
    longer lifetime
    higher ef
    fi
    ciency
    lower footprint
    more multitenancy

    View Slide

  152. #Quarkus @holly_cummins
    fewer devices
    longer lifetime
    higher ef
    fi
    ciency
    lower footprint
    more multitenancy
    optimise for longevity

    View Slide

  153. #Quarkus @holly_cummins
    fewer devices
    longer lifetime
    higher ef
    fi
    ciency
    lower footprint
    more multitenancy
    optimise for longevity
    the end of planned obsolescence?

    View Slide

  154. #Quarkus @holly_cummins
    sooo …
    you can optimise, and it can be fun
    measure, don’t guess
    only optimise what matters
    now for questions!

    View Slide