Performance Testing Java Applications Martin Thompson - @mjpt777 - - PowerPoint PPT Presentation

performance testing java
SMART_READER_LITE
LIVE PREVIEW

Performance Testing Java Applications Martin Thompson - @mjpt777 - - PowerPoint PPT Presentation

Performance Testing Java Applications Martin Thompson - @mjpt777 What is Performance? Throughput / Bandwidth Latency / Response Time Throughput vs. Latency How does an application cope under burst conditions? Are you able to measure


slide-1
SLIDE 1

Martin Thompson - @mjpt777

Performance Testing Java Applications

slide-2
SLIDE 2
slide-3
SLIDE 3

What is Performance?

slide-4
SLIDE 4

Throughput / Bandwidth

slide-5
SLIDE 5

Latency / Response Time

slide-6
SLIDE 6

Throughput vs. Latency

  • How does an application cope

under burst conditions?

  • Are you able to measure

queuing delay?

  • Back-off strategies and other

effects

  • Amortise the expensive
  • perations – Smart Batching

Latency Load Typical Possible

slide-7
SLIDE 7

Performance Requirements

slide-8
SLIDE 8

Performance Requirements

  • What throughput and latency does your

system require?

  • Do you need to care?
  • How will you be competitive?
  • Does performance drive business?
  • Investments start from a business plan
  • Work with the business folk
  • Set Transaction Budget limits
  • As the business scales does the software

scale in an economic fashion?

  • Don’t limit design options
slide-9
SLIDE 9

Decompose the Transaction Budget

  • How much time is each layer in the

architecture allowed?

  • Do all technology choices pay their way?
  • Think Aircraft or Spacecraft!
  • Profile to ensure budget is enforced
  • What happens when throughput

increases?

  • Queuing delay introduced?
  • Scale out at constant latency?

X µs Total with Breakdown

slide-10
SLIDE 10

How can we test Performance?

slide-11
SLIDE 11

Types of Performance Testing

  • 1. Throughput / Bandwidth Testing
  • 2. Latency / Response Testing
  • 3. Stress Testing
  • 4. Concurrent / Contention Testing
  • 5. Endurance / Soak Testing
  • 6. Capacity Testing
slide-12
SLIDE 12

Understand Algorithm Behaviour

  • Need to model realistic scenarios
  • Read to write ratios
  • Distribution across data sets
  • No single entity / item tests!
  • Model based on production
  • Are unbounded queries allowed?
  • Deal in manageable chunks
slide-13
SLIDE 13

The “Onion”

  • Separation of Concerns is key
  • Layer your architecture
  • Test individual components
  • Test assemblies of components with a

focus on interactions

  • Beware micro-benchmarking!
  • Test core infrastructure
  • Useful for catching upgrade issues
  • Same patterns at different levels of scale
slide-14
SLIDE 14

Know Your Platform/Infrastructure

  • Stress test until breaking point
  • Do things degrade gracefully?
  • Do things crash?
  • Order of the algorithms?
  • What are the infrastructure capabilities?
  • Profile to know relative costs of components
  • Operations Per Second
  • Bandwidth
  • Latency
  • Endurance
  • What happens when redundant

components take over?

slide-15
SLIDE 15

When should we test Performance?

slide-16
SLIDE 16

Performance Test & Profile

“Premature optimization is the root of all evil” – Donald Knuth / Tony Hoare

  • What does “optimization” mean?
  • Specialisation vs. Flexibility?
  • Very different from knowing your

system capabilities

  • Test / profile early and often
  • Integrate performance testing to CI
  • Monitor production systems
  • Change your development practices...
slide-17
SLIDE 17

Development Practices

  • Performance “Test First”
  • Red, Green, Debug, Profile, Refactor...
  • A deeper understanding makes you faster
  • Use “like live” pairing stations
  • Don’t add features you don’t need
  • Poor performance should fail the build!
slide-18
SLIDE 18

Performance Testing in Action

slide-19
SLIDE 19

The Java Pitfalls

  • Runtime Compiler
  • JIT & On Stack Replacement (OSR)
  • Polymorphism and In-lining
  • Dead code elimination
  • Race conditions in optimisation
  • Garbage Collection
  • Which collector - Dev vs. Production
  • Skewed results from pauses
  • Beware “Card Marking”
  • Class Loading
slide-20
SLIDE 20

Micro Benchmarking

  • Framework should handle warm up
  • Representative Data Sets
  • Vary set size
  • Key Measures
  • Ops Per Second (per thread)
  • Allocation rates
  • Concurrent Testing
  • Scaling effects with threads
  • Queuing effects

public class MyBenchmark extends Benchmark { public void timeMyOp(int reps) { int i = reps + 1; while (-–i != 0) { MyClass.myOperation(); } } }

slide-21
SLIDE 21

Anatomy Of A Micro Benchmark

public class MapBenchmark extends Benchmark { private int size; private Map<Long, String> map = new MySpecialMap<Long, String>(); private long[] keys; private String[] values; // setup method to init keys and values public void timePutOperation(int reps) { for (int i = 0; i < reps; i++) { map.put(keys[i], values[i]); } } }

slide-22
SLIDE 22

Performance Testing Concurrent Components

  • Straight Performance Tests
  • Ramp number of threads for plotting scaling characteristics
  • Measure Ops / Sec throughput – Averages vs. Intervals
  • Measure latency for queuing effects
  • Validating Performance Tests
  • Check invariants and sequences
slide-23
SLIDE 23

System Performance Tests

Distributed Load Generation Agents System Under Test << XML / JSON / Binary >> Observer Acceptance Test Runners? Vary numbers and firepower!!!

slide-24
SLIDE 24

System Performance Testing Analysis

  • Build a latency histogram for given throughput
  • Disruptor Histogram, HdrHistogram
  • Investigate the outliers!
  • Gather metrics from the system under test
  • Design system to be instrumented
  • Don’t forget the Operating System
  • Plot metrics against latency and throughput
  • Capacity planning from this is possible
  • Generate micro-bursts
  • They show up queuing effects at contention points
  • Uncover throughput bottlenecks
slide-25
SLIDE 25

Got a Performance Issue?

slide-26
SLIDE 26

Performance Profiling

  • Java Applications
  • JVisualVM, YourKit, Solaris Studio, etc
  • What is the GC doing?
  • Learn bytecode profiling
  • Operating System
  • htop, iostat, vmstat, pidstat, netstat, etc.
  • Hardware
  • Perf Counters – perf, likwid, VTune
  • Follow Theory of Constraints for what to tackle!
slide-27
SLIDE 27

Performance Testing Lessons

slide-28
SLIDE 28

Mechanical Sympathy

  • Java Virtual Machines
  • Garbage Collection
  • Optimization
  • Locks
  • Operating Systems
  • Schedulers
  • Virtual Memory
  • File Systems & IO
  • Hardware
  • Hardware capabilities and interactions
  • Profile the counters for greater understanding
slide-29
SLIDE 29

The Issues With “Time”

  • NTP is prone to time correction
  • Careful of System.currentTimeMillis()
  • Monotonic time not synchronised across

sockets

  • System.nanoTime() is monotonic
  • RDTSC is not an ordered instruction
  • Not all servers and OSes are equal
  • Pre Nehalem TSC was not invariant
  • Older OSes and VT can be expensive
  • Resolution is highly variable by OS/JVM
slide-30
SLIDE 30

Beware Being Too Predictable

  • CPU Branch Prediction
  • Fake Orders
  • Taking same path in code
  • Cache hits
  • Disk loaded into memory
  • Memory loaded into CPU cache
  • Application level caching
slide-31
SLIDE 31

Beware YAGNI

YAGNI

slide-32
SLIDE 32

The “Performance Team” Anti-Pattern

  • They struggle to keep up with rate of

change

  • Performance testing is everyone's

responsibility

  • Better to think of a “Performance Team”

as a rotating R&D exercise

  • Performance specialists should pair on

key components and spread knowledge

slide-33
SLIDE 33

Lame Excuses - “It’s only …”

  • It is only start-up code...
  • MTTF + MTTR
  • It is only test code...
  • Feedback cycles!
  • It is only UI code...
  • Read “High Performance Web Sites” by

Steve Souders

slide-34
SLIDE 34

Questions? Blog: http://mechanical-sympathy.blogspot.com/ Twitter: @mjpt777 Links:

https://github.com/giltene/HdrHistogram https://github.com/LMAX- Exchange/disruptor/blob/master/src/main/java/com/lmax/disruptor/collecti

  • ns/Histogram.java

https://code.google.com/p/caliper/ http://grinder.sourceforge.net/ http://www.javaworld.com/javaworld/jw-08-2012/120821-jvm-performance-

  • ptimization-overview.html