fastest servlets in the west

Post on 25-Jan-2015

205 Views

Category:

Software

5 Downloads

Preview:

Click to see full reader

DESCRIPTION

The venerable Servlet Container still has some performance tricks up its sleeve - this talk will demonstrate Apache Tomcat's stability under high load, describe some do's (and some don'ts!), explain how to performance test a Servlet-based application, troubleshoot and tune the container and your application and compare the performance characteristics of the different Tomcat connectors. The presenters will share their combined experience supporting real Tomcat applications for over 20 years and show how a few small changes can make a big, big difference.

TRANSCRIPT

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

Fastest Servlets in the West?

By Daniel Mikusa & Stuart Williams

Daniel Mikusa

users@tomcat.apache.org• Contributing Author on

TomcatExpert.com• Senior Technical Support

Engineer at Pivotal– Tomcat / tc Server– Spring Framework– CloudFoundry

@dmikusa

Stuart Williams

users@tomcat.apache.org• A committer on open source

projects at Apache, Eclipse and elsewhere

• Software Engineer at Pivotal– RTI project lead

@pidster

Presenter Bios

Introduction

• Not a talk about Tomcat being the fastest

• IS a talk about how to make your Servlets & applications perform well under load• It’s easier than you may think

Apache Tomcat

• History• Started at Sun as the RI for Servlet & JSP specs• Donated to the ASF in 1999, became top level project in 2005• First ASF release was 3.0, now up to 8.0• All versions implement Servlet & JSP specs. • EL was added with 6.• WebSockets in 7 & 8

• Trend towards lightweight increasing adoption

Daniel Mikusa
Added some basic notes from the Tomcat site. Not sure what else, if anything to add here.

We have some questions for you…

• Who’s brought a Tomcat app to production?• Who maintains a production Tomcat today?• What is the average load?

• Daily active users?• Daily active sessions?• Requests…

o per day, per hour, per second*?

* Prize for the provably largest!

Tomcat Internals

Architecture Overview

● Server is the top level structure, it

represents the entire container.● A Server can have multiple Services.● A Service is the combination of an engine

and one or more connectors● An Engine represents the request

processing machinery of the service.

Takes in requests, returns responses.● An Engine can have multiple Hosts (i.e.

virtual hosts).● Each Host can have multiple Contexts

(i.e. applications).● Elements marked in red in the diagram are

only valid at that level. Other elements can

be used at that level or below. Cluster is

the exception, not being valid in the

Context.

ServerListenersGlobal

Resources

Services Connectors

Engine

Realms Cluster

Hosts

Valves

Contexts

Executor

Loader Manager Resources

Servlets

Daniel Mikusa
Couldn't find a diagram on the Tomcat site. I'm thinking this is what we're going for here. Let me know if it's not hitting the mark.

Architecture Overview

● Server is the top level structure, it

represents the entire container.● A Server can have multiple Services.● A Service is the combination of an engine

and one or more connectors● An Engine represents the request

processing machinery of the service.

Takes in requests, returns responses.● An Engine can have multiple Hosts (i.e.

virtual hosts).● Each Host can have multiple Contexts

(i.e. applications).● Elements marked in red in the diagram are

only valid at that level. Other elements can

be used at that level or below. Cluster is

the exception, not being valid in the

Context.

ServerListenersGlobal

Resources

Services Connectors

Engine

Realms Cluster

Hosts

Valves

Contexts

Executor

Loader Manager Resources

Servlets

GlobalResources

Connectors Executor

Loader Manager

Daniel Mikusa
Couldn't find a diagram on the Tomcat site. I'm thinking this is what we're going for here. Let me know if it's not hitting the mark.

Request Execution Path

• Connectors are tunable• Engine – not tunable• Valve Pipeline

• Host, Context, Servlet are not tunable

• Your application is tunable

Connector Engine Host Context Servlet

Performance configuration and tuning for Tomcat

• Three main areas to focus1. Memory and OS

o JVM and GC configo Open file handles, ulimit & TCP socket buffers

2. Connectorso Typeo Config – e.g. thread count

3. Application

Memory & OS tuning

This is not a JVM tuning talk, but …

A simplified view of the a JVM’s Process Heap.

Java Object Heap

Young Generation

Old Generation

Perm Gen (Java 6 & 7)

Meta Space (Java 8)

Native Code

Compiler, GC, ...

Thread Stacks

Eden Survivor Spaces

Non-Heap

More questions…

• Who has seen an OOM in production?

• Was it ‘unfortunate’ configuration or …• … just not enough memory?• … or did you just delay the OOM?• Was it a leak in the application?• Was it a leak in Tomcat?

Daniel Mikusa
I added my basic rules for memory tuning the JVM. They are a big high level. Not sure if you were looking for something more concrete. I know on the original slide you had mentioned something about "Monitoring Eden & Overflow". Feel free to adjust.

Basic rules for memory tuning:

1. Start with the defaults, they will get you surprisingly far

2. Don’t play the guessing game!Know what you’re changing and what you expect the change to do (i.e. RTFM)

3. Change one setting at a time

Daniel Mikusa
I added my basic rules for memory tuning the JVM. They are a big high level. Not sure if you were looking for something more concrete. I know on the original slide you had mentioned something about "Monitoring Eden & Overflow". Feel free to adjust.

Basic rules for memory tuning:

4. Don’t change setting solely based on a someone’s StackOverflow, blog or forum post. What works for them might not work for you. Also see #2.

5. Monitor your application’s memory usage either via JMX or via GC logs.

6. Test your app, observe the results, adjust memory settings, repeat.

Daniel Mikusa
I added my basic rules for memory tuning the JVM. They are a big high level. Not sure if you were looking for something more concrete. I know on the original slide you had mentioned something about "Monitoring Eden & Overflow". Feel free to adjust.

Memory & OS tuning considerations

• Request handling objects are pooled & reused• Plain old Tomcat uses very little memory

• Connection counts • Sockets use memory too• Incorrect socket buffer size can cause serious instability

The most common memory switches

• -Xmx• Maximum object heap size

• -Xms• Initial object heap size

• -Xmn, -XX:NewSize & -XX:NewRatio• New or young generation sizes

The most common memory switches

• -XX:PermSize & -XX:MaxPermSize (Java 6 & 7)• Initial & max sizes of PermGen space

• -XX:MetaspaceSize & -XX:MaxMetaspaceSize (Java 8)• Initial & max sizes of Metaspace

• -Xss & -XX:ThreadStackSize• Size of the thread stack for each thread created by the JVM

Tomcat Connectors

Connector Types

BIO Oldest, battle-tested connectorBlocking, one thread per connected user

NIO New default in Tomcat 8Non-blocking

NIO2 New in Tomcat 8 (Experimental)Uses JVM’s NIO2, Non-blocking

APR Native implementationNon-blocking

AJP Separate BIO, NIO, NIO2& APR implementations

Connector Types

HTTP AJP

BIO 3.x 3.x

NIO 6.0.x 7.0.x

NIO2 8.0.x 8.0.x

APR 5.5.x 5.5.x

Connector Types - Performance Characteristics

BIO – Good for low concurrency w/no keep-aliveNIO – Good w/SSL & concurrency + no native code requiredAPR – Best for SSL & concurrencyAJP – Used with Apache or IIS

Application Testing

How to Test Your Application

• Unit Tests• Make sure it works first

• Integration Tests• Embedded Tomcat instances can be very useful

• System / Performance Tests• Deploy your application in a production-like environment

o Means similar network, CPU, RAM, disk typeo This is not negotiable

Performance Testing Basics

• Your application• Needs resources

o 1 wobbly old spare server is Not A Good Choice

• Load Generator• Needs resources

o 1 wobbly old spare server is Still Not A Good Choice• Use Open Source

o Commercial tools usually have per-seat licenses

Performance Testing Process

• Start with a working / properly configured system.• Determine your performance goals (i.e. how

“fast”)• Measure the current performance• Examine metrics & data gathered to determine

bottlenecks• Determine and implement a fix• Repeat until all performance goals are met

Goals of Performance Tuning

• You are not Twitter or Facebook! (Probably)• Realistic Goals

• Account for annual peaks• Account for failure• Resource utilization == Cost

o Tuning lowers expenditures for Cloud applications

• Test the performance of basic Tomcat features• Iterate with small changes to see how they

impact performance• Throw a consistent amount of load at the server,

monitor CPU usage

Test Goals

Some Test Results

The Setup

• Tomcat 8.0.12 - running on one server with the default configuration & OpenJDK 7

• Two clients - sending requests with ab• Running on DigitalOcean VMs - 2CPUs, 2GB

RAM, communicating on 1Gbps private LAN• Tests with APR - libapr 1.5.1, libopenssl 1.0.1f

(Ubuntu)• Full configurations available from our Github repo

Some Load Tests

• https://github.com/dmikusa-pivotal/s12gx-2014-fastest-servlets/tree/master/LoadTestResults

Tests

• Test #1 - Small static file (32KB), served up with NIO connector• Test #2 - Small static file (32KB), client using keep-alive• Test #3 - Medium static file (107KB), served up with NIO connector• Test #4 - Large static file (5MB), served up with NIO connector• Test #5 - Small static file (32KB), served up with NIO over SSL• Test #6 - Small static file (32KB), served up with APR connector• Test #7 - Small static file (32KB), served up with APR connector over

SSL

Test #1 - 1555.40 & 1550.46Test #2 - 1805.74 & 1874Test #3 - 422.51 & 422.02Test #4 - 11.15 & 11.15Test #5 - 474.77 & 476.71Test #6 - 1810.40 & 1821.67Test #7 - 1221.21 & 1199.73

Tests Interesting Comparisons…

#1 & #2 - requests / sec go up when client uses keep-alive#1 & #3 (or #4) - requests / sec go down with bigger file #1 & #5 - requests / sec drop when SSL is in uses#1 & #6 - requests / sec go up when using APR#5 & #7 - impact of SSL is not as bad when using APRAll of these are expected

The Numbers - Requests Per Second (avg)

The Numbers - 99% Percentile

Tests

Test #1 - 42ms & 43msTest #2 - 46ms & 46msTest #3 - 300ms & 304msTest #4 - 60571ms & 60841msTest #5 - 1210ms & 1041msTest #6 - 33ms & 32msTest #7 - 158ms & 166ms

Interesting comparisons…

• #1 & #3 (or #4) - takes longer to serve larger files (duh)

• #1 & #5 - takes longer to serve SSL

• #1 & #6 - APR serves files faster• #5 & #7 - Impact of SSL

Graphs - NIO vs APR (small files)

Graphs - NIO w/SSL vs APR w/SSL

What Else?

• Runs tests against the BIO connector• Adjust the number of concurrent connections sent

by our clients• Test with dynamic content (i.e servlet or JSP)• Monitor CPU usage or other statistics through the

tests• Use a different client (instead of ab) to have more

control over the requests

Profilers

Use a Profiler

• VisualVM• Load the plugins• MBean, Memory Pools, Buffer Pools, VisualGC

• Java Mission Control• Since 7u40

• YourKit• Other commercial products are available

• JMH (for serious, lower level testing)

Profiler Demo

The Application

What to Tune

• Your Application• Connectors

• Type• Threads & Connections

• Logging• Disable logging to console handler• FileHandler vs AsyncFileHandler

• Memory• Heap, Eden & Survivor

What to Tune

Tomcat Your Application

Daniel Mikusa
I was looking for a graphic to emphasize that applications are complicated. Thought this worked. Open for other suggestions though.

What to Tune

• Your application has…• 3rd party libraries• Database connections• Message queues• Other services

• (REST, SOAP, etc…)• Thread pools

Profiler Time Spent

What to Tune

With applications performing “real” work, time spent in the application will greatly overshadow time spent working by Tomcat.

Daniel Mikusa
I took this screenshot while running the spring-music app that I added to our code repo. It was generated while running `ab -n 1000 -c 10 http://localhost:8080/albums`. Not the most scientific approach, but highlights the point that most of the work happens in the application, which is what I think we were going for here.

Summary

Do’s

• Set clear and realistic goals• Monitor Tomcat & the JVM• Profile your application• Use a load test tool to appropriately stress the system• Try to fix the cause of the bottleneck, not just address its

symptoms• Stop when you’ve hit your goals

Dont’s

• Begin optimizing before you have measured the performance of your system.

• Expect a silver bullet (i.e. a JVM or Tomcat setting) to solve all of your performance problems.

• Load test on your laptop• Use unrealistic data volumes or user loads.• Optimise code or configuration that doesn’t need it.• Try to work on multiple bottlenecks or problems at one

time.

Questions

https://github.com/dmikusa-pivotal/s12gx-2014-fastest-servlets/tree/master/LoadTestResults

@dmikusa@pidster

top related