Slide 1

Slide 1 text

tradeoffs, bad science, and polar bears: the world of java optimisation www.cloud-builders.tech Holly Cummins Red Hat

Slide 2

Slide 2 text

#Quarkus @holly_cummins why optimise?

Slide 3

Slide 3 text

#Quarkus @holly_cummins why optimise?

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

#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

Slide 8

Slide 8 text

#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

Slide 9

Slide 9 text

#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

Slide 10

Slide 10 text

#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

Slide 11

Slide 11 text

#Quarkus @holly_cummins what is optimising?

Slide 12

Slide 12 text

#Quarkus @holly_cummins for whom? when? doing what? “make it go faster”

Slide 13

Slide 13 text

#Quarkus @holly_cummins human-centric (technical) design

Slide 14

Slide 14 text

#Quarkus @holly_cummins

Slide 15

Slide 15 text

#Quarkus @holly_cummins performance can be:

Slide 16

Slide 16 text

#Quarkus @holly_cummins performance can be: throughput

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

#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

Slide 27

Slide 27 text

#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

Slide 28

Slide 28 text

#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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

#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 …

Slide 31

Slide 31 text

@holly_cummins requirements change

Slide 32

Slide 32 text

@holly_cummins

Slide 33

Slide 33 text

@holly_cummins

Slide 34

Slide 34 text

@holly_cummins

Slide 35

Slide 35 text

@holly_cummins

Slide 36

Slide 36 text

@holly_cummins I am not designed for this.

Slide 37

Slide 37 text

@holly_cummins the world changes

Slide 38

Slide 38 text

#Quarkus @holly_cummins

Slide 39

Slide 39 text

#Quarkus @holly_cummins -Xmx == $

Slide 40

Slide 40 text

#Quarkus @holly_cummins -Xmx == $ footprint

Slide 41

Slide 41 text

#Quarkus @holly_cummins

Slide 42

Slide 42 text

#Quarkus @holly_cummins which performs better?

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

#Quarkus @holly_cummins which is better?

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

#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?

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

#Quarkus @holly_cummins how to optimise?

Slide 53

Slide 53 text

#Quarkus @holly_cummins find the bottleneck. fix it.

Slide 54

Slide 54 text

#IBM @holly_cummins what could possibly go wrong?!

Slide 55

Slide 55 text

#IBM @holly_cummins intuition pitfall 1

Slide 56

Slide 56 text

#Quarkus @holly_cummins this is not the place for ideas

Slide 57

Slide 57 text

#Quarkus @holly_cummins measure, don’t guess.

Slide 58

Slide 58 text

#Quarkus @holly_cummins measure the right thing

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

#IBM @holly_cummins numbers pitfall 2

Slide 61

Slide 61 text

#Quarkus @holly_cummins

Slide 62

Slide 62 text

#Quarkus @holly_cummins leading indicators

Slide 63

Slide 63 text

#Quarkus @holly_cummins leading indicators lagging indicators

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

#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

Slide 69

Slide 69 text

#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

Slide 70

Slide 70 text

#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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

#Quarkus @holly_cummins 2007

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

#Quarkus @holly_cummins 2007

Slide 76

Slide 76 text

#Quarkus @holly_cummins 2007

Slide 77

Slide 77 text

#Quarkus @holly_cummins 2021

Slide 78

Slide 78 text

#Quarkus @holly_cummins 2021

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

#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?

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

#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

Slide 90

Slide 90 text

#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

Slide 91

Slide 91 text

#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

Slide 92

Slide 92 text

#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

Slide 93

Slide 93 text

#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

Slide 94

Slide 94 text

#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

Slide 95

Slide 95 text

#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

Slide 96

Slide 96 text

#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

Slide 97

Slide 97 text

#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

Slide 98

Slide 98 text

#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

Slide 99

Slide 99 text

#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

Slide 100

Slide 100 text

#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 ?

Slide 101

Slide 101 text

#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 ? ?

Slide 102

Slide 102 text

#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!

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

#IBM @holly_cummins advice pitfall 3

Slide 107

Slide 107 text

#Quarkus @holly_cummins I read it on the internet!

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

#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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

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

Slide 114

Slide 114 text

#IBM @holly_cummins micro-optimisation pitfall 4

Slide 115

Slide 115 text

#Quarkus @holly_cummins

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

#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; }

Slide 118

Slide 118 text

#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; }

Slide 119

Slide 119 text

#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; }

Slide 120

Slide 120 text

#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

Slide 121

Slide 121 text

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

Slide 122

Slide 122 text

#Quarkus @holly_cummins every little helps?

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

#Quarkus @holly_cummins our platforms help

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

#Quarkus @holly_cummins ok, but how to optimise?

Slide 130

Slide 130 text

#Quarkus @holly_cummins tools

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

#Quarkus @holly_cummins observability

Slide 133

Slide 133 text

#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

Slide 134

Slide 134 text

#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

Slide 135

Slide 135 text

#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

Slide 136

Slide 136 text

#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)

Slide 137

Slide 137 text

#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)

Slide 138

Slide 138 text

#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)

Slide 139

Slide 139 text

#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)

Slide 140

Slide 140 text

#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)

Slide 141

Slide 141 text

#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)

Slide 142

Slide 142 text

#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)

Slide 143

Slide 143 text

#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)

Slide 144

Slide 144 text

#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)

Slide 145

Slide 145 text

#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)

Slide 146

Slide 146 text

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

Slide 147

Slide 147 text

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

Slide 148

Slide 148 text

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

Slide 149

Slide 149 text

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

Slide 150

Slide 150 text

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

Slide 151

Slide 151 text

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

Slide 152

Slide 152 text

#Quarkus @holly_cummins ok, but you promised bears

Slide 153

Slide 153 text

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

Slide 154

Slide 154 text

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

Slide 155

Slide 155 text

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

Slide 156

Slide 156 text

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

Slide 157

Slide 157 text

#Quarkus @holly_cummins fewer devices longer lifetime

Slide 158

Slide 158 text

#Quarkus @holly_cummins fewer devices longer lifetime higher efficiency

Slide 159

Slide 159 text

#Quarkus @holly_cummins fewer devices longer lifetime higher efficiency lower footprint

Slide 160

Slide 160 text

#Quarkus @holly_cummins fewer devices longer lifetime higher efficiency lower footprint more multitenancy

Slide 161

Slide 161 text

#Quarkus @holly_cummins fewer devices longer lifetime higher efficiency lower footprint more multitenancy optimise for longevity

Slide 162

Slide 162 text

#Quarkus @holly_cummins fewer devices longer lifetime higher efficiency lower footprint more multitenancy optimise for longevity the end of planned obsolescence?

Slide 163

Slide 163 text

#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