Performance-tuning the Spring Petclinic sample application

55
© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission. Performance-tuning the «Spring Pet Clinic» sample application By Julien Dubois

description

Speaker: Julien Dubois This talk is a live version of my blog posts on performance-tuning the Spring Petclinic application: http://blog.ippon.fr/tag/spring-petclinic/ We will talk about JVM locks, Web application performance best practices, JDBC vs JPA, and caching We will see how to use effectively tools such as JMeter, Yourkit and Intellij IDEA to quickly solve performance issues We will also explain the methodology used, so you can follow the same steps on your own applications In this session we will talk about : Stress tests Memory leaks Garbage Collection Profiling tools Application Server tuning JVM tuning Locks JDBC vs JPA Lazy loading Caching And much more !

Transcript of Performance-tuning the Spring Petclinic sample application

Page 1: Performance-tuning the Spring Petclinic sample application

© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission.

Performance-tuning the «Spring Pet Clinic» sample application

By Julien Dubois

Page 2: Performance-tuning the Spring Petclinic sample application

Why have Java developers chosen Spring?

DI

AOP

TX

CoreModel

J(2)EE usability

Testable, lightweightmodel for

programming

Application Portability

Powerful Service Abstractions

Deployment Flexibility

Page 3: Performance-tuning the Spring Petclinic sample application

Spring

Deploy to Cloud or on premise

Big, Fast,

FlexibleData Web,

Integration,Batch

CoreModel

GemFire

Page 4: Performance-tuning the Spring Petclinic sample application

Spring Stack

DI AOP TX JMS JDBC

MVC Testing

ORM OXM Scheduling

JMXREST Caching Profiles Expression

Spring Framework

HATEOAS

JPA 2.0 JSF 2.0 JSR-250 JSR-330 JSR-303 JTA JDBC 4.1

Java EE 1.4+/SE5+

JMX 1.0+WebSphere 6.1+

WebLogic 9+

GlassFish 2.1+

Tomcat 5+

OpenShift

Google App Eng.

Heroku

AWS Beanstalk

Cloud FoundrySpring Web Flow Spring Security

Spring Batch Spring Integration

Spring Security OAuth

Spring Social

Twitter LinkedIn Facebook

Spring Web Services

Spring AMQP

Spring Data

Redis HBase

MongoDB JDBC

JPA QueryDSL

Neo4j

GemFire

Solr Splunk

HDFS MapReduce Hive

Pig Cascading

Spring for Apache Hadoop

SI/Batch

Spring XD

Page 5: Performance-tuning the Spring Petclinic sample application

Learn More. Stay Connected.

Talk to us on Twitter: @springcentralFind session replays on YouTube: spring.io/video

Page 6: Performance-tuning the Spring Petclinic sample application

About me• Julien Dubois• From Paris, France• Co-authored «Spring par la pratique» (French

book on Spring)• Former SpringSource France director• Director of Consulting at Ippon Technologies• Follow me @juliendubois

6

Page 7: Performance-tuning the Spring Petclinic sample application

Goals of this presentation• Make a specific application run faster• Learn classic issues with Spring Web

applications• Learn our methodology to solve

performance issues

7

Page 8: Performance-tuning the Spring Petclinic sample application

More information on this presentation• This presentation started with a series of blog posts:

http://blog.ippon.fr/tag/spring-petclinic/• You can run your own tests, every step is cleanly commited

on Github:https://github.com/jdubois/spring-petclinic

8

Page 9: Performance-tuning the Spring Petclinic sample application

What’s new since the blog entries?• Java 7• I got a brand new MacBook :-)

–Does a SSD really matters?–Does the new core i7 matters?

9

Page 10: Performance-tuning the Spring Petclinic sample application

10

Introducing the Spring Pet Clinic sample

application

Page 11: Performance-tuning the Spring Petclinic sample application

Do you remember the Sun Java Pet Store?• Used to explain how you

could build an incredibly complex application

• On a very expensive application server

• With an horrible-looking result

• When your customer only wanted a simple Web app

11

Page 12: Performance-tuning the Spring Petclinic sample application

The Spring Pet Clinic• Is here to demonstrate Spring

features and best practices• Is a very classical MVC-style

application (no REST + funky JS library)

• Is still a good excuse to use cute dogs in your presentation

12

Page 14: Performance-tuning the Spring Petclinic sample application

14

#1Putting the application

in production

Page 15: Performance-tuning the Spring Petclinic sample application

Moving to production

• Be as close as possible to a «production environment»–Remove «debugging» logs [ Code ]–Use a «real» database [ Code ]

• For this presentation our environment isn’t perfect–Everything runs on the same machine–Even the presentation itself :-)

15

Page 16: Performance-tuning the Spring Petclinic sample application

Memory tuning• We’re running the application from the Maven Tomcat plugin

–Of course Maven takes some resources• Still the application runs with a small memory footprint

–export MAVEN_OPTS="-XX:MaxPermSize=64m -Xms128m -Xmx128m"

• Why not use more memory?–It’s easier to spot memory problems–We don’t need it (we’re not using a big fat Java EE server!)

16

Page 17: Performance-tuning the Spring Petclinic sample application

17

#2Creating a JMeter test

Page 18: Performance-tuning the Spring Petclinic sample application

Simulate load• JMeter will simulate users

–500 users–In a «realistic» way

• Use a timer• Check «clear cookies each iteration?»

18

Page 19: Performance-tuning the Spring Petclinic sample application

Results

• 250 req/sec• Lots of errors• Quickly ends with a crash...

19

Page 20: Performance-tuning the Spring Petclinic sample application

20

#3Profiling

Page 21: Performance-tuning the Spring Petclinic sample application

Does profiling distort results?• Short answer : not a lot

–We’ll see this when the application runs better• We have used JProfiler and VisualVM in production many

times–Often caused less trouble than official «production monitoring

tools» like HP Diagnostics–Only way to find problems and understand what’s going on–Easy to install

21

Page 22: Performance-tuning the Spring Petclinic sample application

Choose your weapon• VisualVM

–Free & lightweight–Included in the JDK

• JProfiler–Best tool we’ve used

• YourKit–Easy to use & cheap

22

Page 23: Performance-tuning the Spring Petclinic sample application

First culprit : Dandelion• More specifically, Dandelion module for

DataTables–https://github.com/dandelion/dandelion-datatables

• Nice & fun JSP taglib for rendering JQuery DataTables–Has a memory leak in this version–Is now corrected (extremely quick response time

from the Dandelion team)• So we switched to «plain old JQuery

DataTables» [ Code ]

23

Page 24: Performance-tuning the Spring Petclinic sample application

Second culprit : the HTTP Session• Using HTTP Sessions can be helpful

–Developer productivity–Data security

• Going stateless is often better–Uses less RAM–More scalable

24

Page 25: Performance-tuning the Spring Petclinic sample application

Going stateless• Example : the PetController.processUpdateForm() method

–Use Spring MVC REST to get more information from the URL–Fetch again the missing data

• We said more scalability, not more performance (for the moment)

• With some work, the whole application can become stateless [ Code ]

25

Page 26: Performance-tuning the Spring Petclinic sample application

Results

• 500 req/sec• A few errors• That’s a lot better than before!

26

Page 27: Performance-tuning the Spring Petclinic sample application

27

#4Tomcat tuning

Page 28: Performance-tuning the Spring Petclinic sample application

Tomcat tuning• This is the easiest step

–Migrate to the latest version of the Tomcat plugin–Use the new NIO connector

• org.apache.coyote.http11.Http11NioProtocol• [ Code ]

28

Page 29: Performance-tuning the Spring Petclinic sample application

29

• 950 req/sec• No errors• Victory :-)

Results

Page 30: Performance-tuning the Spring Petclinic sample application

30

#5Removing

locks

Page 31: Performance-tuning the Spring Petclinic sample application

Locks• Locks are blocked threads

–Aka «there’s a synchronized somewhere»• They obviously cause scalability problems• Let’s launch our profiler again!

31

Page 32: Performance-tuning the Spring Petclinic sample application

First culprit : commons DBCP• Commons DBCP does a lot of synchronization• We replaced it with Tomcat JDBC

–New JDBC pool for Tomcat, for highly concurrent systems• But we have kept the pool size at 8

–So obviously we will still have locks–Making it bigger hinders performance

• If the database was on a separate server, we would use a bigger number• The database is always the problem• [ Code ]

32

Page 33: Performance-tuning the Spring Petclinic sample application

Second culprit : Webjars• WebJars are client-side libraries (JQuery, etc...) packaged as Jar

files–http://www.webjars.org/–Those libraries are loaded from the classloader

• Which does a big lock each time it is accessed• So if you have a lot of libraries this can be a real problem

• There are many solutions to this issue–Cache those resources with a proxy server–Use another solution for loading those libraries (Bower ?)–[ Code ]

33

Page 34: Performance-tuning the Spring Petclinic sample application

Third culprit : the monitoring Aspect• This aspect was introduced on purpose• We should simply disable it [ Code ]

34

Page 35: Performance-tuning the Spring Petclinic sample application

Results• 1020 req/sec, still without any error• Only 10% performance increase

35

Page 36: Performance-tuning the Spring Petclinic sample application

36

#6JDBC

vs JPA

Page 37: Performance-tuning the Spring Petclinic sample application

3 profiles are available• Do you use Spring profiles?• Choose between

–JDBC–JPA–Spring Data

37

Page 38: Performance-tuning the Spring Petclinic sample application

Switch to JPA• Change the profile in the web.xml file• The application is a little bit slower

–904 req/sec–After an initial peak, we see the application hanging and then

starting again -> looks like a GC issue

38

Page 39: Performance-tuning the Spring Petclinic sample application

First problem : Memory• JPA uses more PermGen, and more memory in general than

JDBC• Let’s boost the application memory

–export MAVEN_OPTS="-XX:MaxPermSize=128m -Xms256m -Xmx256m"

–1103 req/sec ! Better than JDBC !• That’s a different result from our original blog entry

–Looks like we need more memory with JDK 7...

39

Page 40: Performance-tuning the Spring Petclinic sample application

Second problem : SQL requests• Run MySQL Workbench

–With JDBC we had more than 30 000 SQL requests per second–With JPA we have 15 000 SQL requests per second

• Why isn’t performance better when we have only half as many requests?

40

Page 41: Performance-tuning the Spring Petclinic sample application

41

#7Lazy

loading

Page 42: Performance-tuning the Spring Petclinic sample application

Lazy loading & Open Session In View• Pet.visits is an EAGER collection

–This is often a bad idea to eagerly fetch collections• Let’s configure it with the default, lazy-loaded mode• To prevent the dreaded LazyInitializationException we’ll use

the Open Session In View pattern–Not the «perfect» solution, which would require more refactoring–Good enough in this situation, and easy to implement–[ Code ]

42

Page 43: Performance-tuning the Spring Petclinic sample application

Results• 1165 req/sec, still without any error• 10 000 SQL req/sec• We have beaten the JDBC version!

43

Page 44: Performance-tuning the Spring Petclinic sample application

44

#8Adding cache

Page 45: Performance-tuning the Spring Petclinic sample application

Hibernate Caching• We have used Ehcache• We have put Hibernate’s @Cache annotation everywhere

–Owners, Pets, Visits, etc...

45

Page 46: Performance-tuning the Spring Petclinic sample application

Spring caching• For more complex queries, we used Spring’s cache

abstraction–Adds a caching aspect around slow methods

• Allowed us to remove the very slow «LIKE» in JpaOwnerRepositoryImpl.findByLastName()

• We could also have used Hibernate’s query cache for the same result

• [ Code ]

46

Page 47: Performance-tuning the Spring Petclinic sample application

Results• 1240 req/sec, still without any

error• But can we do better?

47

Page 48: Performance-tuning the Spring Petclinic sample application

48

#9Extreme testing

Page 49: Performance-tuning the Spring Petclinic sample application

Extreme testing• If we look at the JMeter report, we have reached JMeter’s

limits–Adding more users (=threads) isn’t doing a big difference

• The solution is to do more with the existing threads–Removed the counter–Decreased the ramp-up period to 5 seconds–Run without any listeners (or in command-line)

49

Page 50: Performance-tuning the Spring Petclinic sample application

Results• We achieved 3000 req/sec• Memory stayed stable

–We even let it run until we had 100 000 user sessions• We had to increase the JDBC pool size to 30

–Still a small number of connexions–Pushing it to 40 decreases performance

50

Page 51: Performance-tuning the Spring Petclinic sample application

51

Final notes

Page 52: Performance-tuning the Spring Petclinic sample application

Does JDK 7 helps?• Tested the new G1 Garbage Collector

–export MAVEN_OPTS="-XX:MaxPermSize=128m -Xms256m -Xmx256m -XX:+UseG1GC"

–3% to 5% slower–Needs a bigger heap to work correctly–Doesn’t do any miracle

52

Page 53: Performance-tuning the Spring Petclinic sample application

Does the new MacBook Pro helps?• Compared to my original blog posts, with my old MacBook

–We still have the memory issues (until solved)–We still have the HTTP errors (until solved)–Results are 10% to 20% better until the last,

«extreme testing» phase• If you write inefficient code, a faster

CPU and a SSD won’t save you

53

Page 54: Performance-tuning the Spring Petclinic sample application

54

#1 Put the application in

production

#2 Create a JMeter test

#3 Profile

#4 Tune the application

server

#5 Remove locks

#7 Lazy loading

#6 JDBC vs JPA

#8 Add cache

Page 55: Performance-tuning the Spring Petclinic sample application

55

Questions &

Answers

@julienduboisLate question?