Essentials of Java Performance Tuning. Dr Heinz Kabutz Kirk Pepperdine Sun Java Champions



Similar documents
talent. technology. true business value

Performance Testing of Java Enterprise Systems

Delivering Quality in Software Performance and Scalability Testing

Tuning WebSphere Application Server ND 7.0. Royal Cyber Inc.

THE BUSY DEVELOPER'S GUIDE TO JVM TROUBLESHOOTING

Copyright 1

MEASURING WORKLOAD PERFORMANCE IS THE INFRASTRUCTURE A PROBLEM?

TRACE PERFORMANCE TESTING APPROACH. Overview. Approach. Flow. Attributes

Performance Improvement In Java Application

Effective Java Programming. measurement as the basis

WebSphere Architect (Performance and Monitoring) 2011 IBM Corporation

Put a Firewall in Your JVM Securing Java Applications!

Java Monitoring. Stuff You Can Get For Free (And Stuff You Can t) Paul Jasek Sales Engineer

1 How to Monitor Performance

Best Practices for Web Application Load Testing

Holly Cummins IBM Hursley Labs. Java performance not so scary after all

WEBLOGIC ADMINISTRATION

Informatica Master Data Management Multi Domain Hub API: Performance and Scalability Diagnostics Checklist

Monitoring and Diagnosing Production Applications Using Oracle Application Diagnostics for Java. An Oracle White Paper December 2007

Tomcat Tuning. Mark Thomas April 2009

1 How to Monitor Performance

Audit & Tune Deliverables

Performance Testing Percy Pari Salas

An Oracle White Paper September Advanced Java Diagnostics and Monitoring Without Performance Overhead

<Insert Picture Here> Java Application Diagnostic Expert

Practical Performance Understanding the Performance of Your Application

Transaction Performance Maximizer InterMax

Oracle WebLogic Thread Pool Tuning

Tuning Your GlassFish Performance Tips. Deep Singh Enterprise Java Performance Team Sun Microsystems, Inc.

Performance Optimization For Operational Risk Management Application On Azure Platform

Network Monitoring with Xian Network Manager

An Oracle White Paper March Load Testing Best Practices for Oracle E- Business Suite using Oracle Application Testing Suite

Performance Monitoring and Tuning. Liferay Chicago User Group (LCHIUG) James Lefeu 29AUG2013

Winning the J2EE Performance Game Presented to: JAVA User Group-Minnesota

Agility Database Scalability Testing

Java VM monitoring and the Health Center API. William Smith

Performance Tuning and Optimizing SQL Databases 2016

Configuring Apache Derby for Performance and Durability Olav Sandstå

Monitoring applications in multitier environment. Uroš Majcen A New View on Application Management.

Java DB Performance. Olav Sandstå Sun Microsystems, Trondheim, Norway Submission ID: 860

Taking the First Steps in. Web Load Testing. Telerik

Tool - 1: Health Center

Databases Going Virtual? Identifying the Best Database Servers for Virtualization

Apache Tomcat Tuning for Production

B M C S O F T W A R E, I N C. BASIC BEST PRACTICES. Ross Cochran Principal SW Consultant

What Is Specific in Load Testing?

A Talk ForApacheCon Europe 2008

AgencyPortal v5.1 Performance Test Summary Table of Contents

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Mission-Critical Java. An Oracle White Paper Updated October 2008

JBoss Seam Performance and Scalability on Dell PowerEdge 1855 Blade Servers

MONITORING A WEBCENTER CONTENT DEPLOYMENT WITH ENTERPRISE MANAGER

Monitoring HP OO 10. Overview. Available Tools. HP OO Community Guides

Java Troubleshooting and Performance

APPLICATION MANAGEMENT SUITE FOR ORACLE E-BUSINESS SUITE APPLICATIONS

TDA - Thread Dump Analyzer

Performance Testing Process A Whitepaper

Holistic Performance Analysis of J2EE Applications

How To Improve Performance On An Asa 9.4 Web Application Server (For Advanced Users)

Debugging Java performance problems. Ryan Matteson

Application Performance Testing Basics

Throughput Capacity Planning and Application Saturation

Response Time Analysis

MID-TIER DEPLOYMENT KB

Blackboard Open Source Monitoring

New Relic & JMeter - Perfect Performance Testing

Memory Profiling using Visual VM

Architecting ColdFusion For Scalability And High Availability. Ryan Stewart Platform Evangelist

A Performance Engineering Story

Validating Java for Safety-Critical Applications

Performance Testing Process

Advanced Liferay Architecture: Clustering and High Availability

A Comparison of Oracle Performance on Physical and VMware Servers

High-Availability. Configurations for Liferay Portal. James Min. Senior Consultant / Sales Engineer, Liferay, Inc.

SharePoint 2013 Best Practices

Load Testing Analysis Services Gerhard Brückl

Top 10 Performance Tips for OBI-EE

How To Use Java On An Ipa (Jspa) With A Microsoft Powerbook (Jempa) With An Ipad And A Microos 2.5 (Microos)

Implementing a Well- Performing and Reliable Portal

A Comparison of Oracle Performance on Physical and VMware Servers

Test Run Analysis Interpretation (AI) Made Easy with OpenLoad

Response Time Analysis

Guideline for stresstest Page 1 of 6. Stress test

Oracle WebLogic Server 11g: Monitor and Tune Performance

Advanced Performance Forensics

NetBeans Profiler is an

Resource Monitoring During Performance Testing. Experience Report by Johann du Plessis. Introduction. Planning for Monitoring

IBM WebSphere Server Administration

Monitoring and Managing a JVM

Application of Predictive Analytics for Better Alignment of Business and IT

Running a Workflow on a PowerCenter Grid

MAGENTO HOSTING Progressive Server Performance Improvements

Linux Tools for Monitoring and Performance. Khalid Baheyeldin November 2009 KWLUG

Load Testing with JMeter

BridgeWays Management Pack for VMware ESX

Transcription:

Essentials of Java Performance Tuning Dr Heinz Kabutz Kirk Pepperdine Sun Java Champions

Our Typical Story Customer JoGoSlo Ltd calls us in desperation > Millions of Rands invested > Users complain about poor performance > Customers consider abandoning the project Developers in a panic > 6 man months already invested with no results > Can almost reproduce the problem > Still had some ideas what to do > However management has lost confidence We have 5 days to diagnose problem

Solve All Your Performance Problems

Speakers Kirk Pepperdine > Engaged around the world to solve Java performance problems > http://www.javaperformancetuning.com

Speakers Heinz Kabutz > The Java Specialists Newsletter > Based in Cape Town > http://www.javaspecialists.co.za

Project in Crisis What do people do under stress? > Decision making skills are much impaired > Not in learning mode > Almost impossible to introduce new tools > Tend to rely on the familiar Performance tuning requires own skillsets > Takes time to learn > When is a good time to learn CPR?

Panic Attack Lots of finger pointing between groups Without real evidence developers start to guess > Start changing code (that s what developers do) > Convert Vector to ArrayList > Convert String to StringBuffer > Add more threads > Add more memory > Focus on database interactions > with unpredictable results How do we avoid this?

Measure, don t guess!

Heap Usage after GC

Typical Production Environment

Hardware Resources

Java Virtual Machine Resources

Application

People System usage patterns > What they are doing? Rate of doing work?

Forward Propagation of Actions People telling application what to do Application tells the JVM what it needs done > Direct consequence of what the people are asking > And how application was coded JVM tells the hardware what it needs done > Direct consequence of what the application is asking > And how JVM was coded and configured

Backward Propagation of Trouble If hardware does not have enough capacity, people will see bad response times If JVM is incorrectly configured, people will see bad response times If application is suffering from contention, people will see bad response times Therefore, the only information you start with is that people are experiencing poor response times What to do next?

W5 of Investigative Journalism Five questions asked by investigators: > Who? > Which resource is exhibiting the problem? > What? > Observation: what do the users see? > Where? > Which layer is exhibiting the problem? > When? > Are there any peculiarities about when the problems occur? > Why? > An explanation of the observation from system perspective

Typical Production Environment What Where Who

Plan of Action Review or set the performance targets Layer by layer performance investigation Start with hardware > Work outward until we find overextended resource Need a repeatable test > Need to know what the people are doing > Need a test harness > Need a realistic test environment

JoGoSlo Test Environment Database did not have adequate amount of data > Solution: Cloned the production database Did not have a test harness > Solution: Introduced Apache JMeter

Test Harness Software that simulates realistic user activity > Includes normal activity, coffee breaks, user mistakes > People will use system in unexpected ways Good test harness: > Easily scripted to create our usage patterns > Randomize test data input > Ability to randomize think times > Validate responses from server > Monitor response times and other system parameters

Test Harness: Apache JMeter Project by Apache Software Foundation > Open source Used extensively for testing web applications > Can also be applied in other environments http://jakarta.apache.org/jmeter/index.html

Usage Pattern Traffic Recorder Randomized Timer

Parameterised input

Realistic Test Environment Production environment? > Not desirable and usually not an option QA environment should > Perfectly resemble your production environment > Data sizes, memory sizes, cache sizes, disk speeds, network speeds, should be the same > May need to consider the when > Sometimes have to add external elements to test Don t extrapolate! > You do not know when you will hit the wall

Performance Wall When will you hit the wall?

Who and Where Turn on monitoring of hardware Use the what to turn on additional low-impact monitoring, such as: > Verbose GC logging > -Xloggc:<filename> > JDBC logging > e.g. p6spy > JNI logging > RMI logging > Socket logging Beware of Heisenberg Uncertainty! > You can t observe a system without affecting the system

Run the Benchmark Isolate your system Start system from known consistent point Run JMeter or other test harness against system Observe if the what matches the users experiences Failures in the system should invalidate the run Record everything > Start time, end time, observations, response time, configurations, date of birth, starsign, basically anything that you might or might not need > Use a physical notepad mouse in left hand

How Long is Each Run? System must be in a steady state > Issues about test harness that need to be considered > Beyond the scope of this talk System should exhibit the problems experienced by users Can be 30 seconds or 30 days > Typically an hour Burn in the problem

Analysis Hardware > Carefully examine the output from monitoring and eliminate underutilised components from the list > Fully utilised components are bottlenecks CPU > Look at execution profile, such as Xrunhprof Memory > Look at GC, caching, large DB queries, memory leaks IO Wait > Will prevent CPU from being fully utilised If no hardware bottlenecks, look at the JVM layer

Java Virtual Machine Assuming hardware does not show problem Heap memory > Not enough memory in virtual machine Lock Contention > Excessive stop-the-world garbage collection If no JVM bottlenecks, look at application layer

Java Application Layer Thread lock contention > Only thing that you would not have diagnosed by now > Get thread dump > See what they are waiting on > Eliminate the expected If you have not found the problem by now, examine your testing process > It might help confirming that you have correctly simulated the users > Go visit the floor > Examine run logs

Bluedragon ThreadDump Full thread dump Java HotSpot(TM) Server VM (1.4.2_08-b03 mixed mode): "RMI ConnectionExpiration-[192.168.0.15:34113]" daemon prio=1 tid=0x0892f658 nid=0x2d7a waiting on condition [5b86f000..5b86f494] at java.lang.thread.sleep(native Method) at sun.rmi.transport.tcp.tcpchannel$reaper.run(tcpchannel.java:447) at java.lang.thread.run(thread.java:534) "RMI TCP Connection(902)-192.168.0.15" daemon prio=1 tid=0x41e112b8 nid=0x2d7a runnable [5ccff000..5ccff414] at java.net.socketinputstream.socketread0(native Method) at java.net.socketinputstream.read(socketinputstream.java:129) at java.io.bufferedinputstream.fill(bufferedinputstream.java:183) at java.io.bufferedinputstream.read(bufferedinputstream.java:201) - locked <0x49978800> (a java.io.bufferedinputstream) at java.io.filterinputstream.read(filterinputstream.java:66) at sun.rmi.transport.tcp.tcptransport.handlemessages(tcptransport.java) at sun.rmi.transport.tcp.tcptransport$connectionhandler.run(tcptransport) at java.lang.thread.run(thread.java:534)

Bluedragon ThreadDump "PingThread-8692809" daemon prio=1 tid=0x081a3058 nid=0x2d7a waiting on condition [5bda9000..5bda9294] at java.lang.thread.sleep(native Method) at org.exolab.jms.client.rmi.rmijmsconnectionstub$pingthread.run( RmiJmsConnectionStub.java:249) "EventManagerThread" daemon prio=1 tid=0x083101f8 nid=0x2d7a in Object.wait() [5caa9000..5caa9514] at java.lang.object.wait(native Method) - waiting on <0x47aa2800> (a java.lang.object) at java.lang.object.wait(object.java:429) at org.exolab.jms.events.basiceventmanager.run(basiceventmanager.java) - locked <0x47aa2800> (a java.lang.object) at java.lang.thread.run(thread.java:534) "PingThread-18183604" daemon prio=1 tid=0x08136dc8 nid=0x2d7a waiting on condition [5cc7f000..5cc7f494] at java.lang.thread.sleep(native Method) at org.exolab.jms.client.rmi.rmijmsconnectionstub$pingthread.run( RmiJmsConnectionStub.java:249)

Bluedragon ThreadDump "RMI RenewClean-[192.168.0.15:34113]" daemon prio=1 tid=0x081a2c68 nid=0x2d7a in Object.wait() [5ba10000..5ba10594] at java.lang.object.wait(native Method) - waiting on <0x4858a940> (a java.lang.ref.referencequeue$lock) at java.lang.ref.referencequeue.remove(referencequeue.java:111) - locked <0x4858a940> (a java.lang.ref.referencequeue$lock) at sun.rmi.transport.dgcclient$endpointentry$renewcleanthread.run( DGCClient.java:500) at java.lang.thread.run(thread.java:534) "BoundedThreadPool0-33" prio=1 tid=0x41ec8710 nid=0x2d7a in Object.wait() [5ca29000..5ca29594] at java.lang.object.wait(native Method) - waiting on <0x47a5> (a org.mortbay.thread.boundedthreadpool$poolthread) at org.mortbay.thread.boundedthreadpool$poolthread.run(boundedthreadpool) - locked <0x47a520b8> (a org.mortbay.thread.boundedthreadpool$poolthread)

Bluedragon ThreadDump "BoundedThreadPool0-32" prio=1 tid=0x5a159ed0 nid=0x2d7a runnable [5c9a9000..5c9a9614] at java.net.socketinputstream.socketread0(native Method) at java.net.socketinputstream.read(socketinputstream.java:129) at org.mortbay.io.bio.streamendpoint.fill(streamendpoint.java:99) at org.mortbay.jetty.bio.socketconnector$connection.fill(socketconnector) at org.mortbay.jetty.httpparser.parsenext(httpparser.java:257) at org.mortbay.jetty.httpparser.parseavailable(httpparser.java:192) at org.mortbay.jetty.httpconnection.handle(httpconnection.java:293) at org.mortbay.jetty.bio.socketconnector$connection.run(socketconnector) at org.mortbay.thread.boundedthreadpool$poolthread.run(boundedthreadpool) - locked <0x47a521f8> (a org.mortbay.thread.boundedthreadpool$poolthread)

Bluedragon ThreadDump "BoundedThreadPool0-31" prio=1 tid=0x5ad60d78 nid=0x2d7a runnable [5c929000..5c929694] at org.mortbay.jetty.httpgenerator.preparebuffers(httpgenerator.java:878) at org.mortbay.jetty.httpgenerator.flushbuffers(httpgenerator.java:681) at org.mortbay.jetty.httpgenerator.complete(httpgenerator.java:671) at org.mortbay.jetty.httpconnection.dohandler(httpconnection.java:388) at org.mortbay.jetty.httpconnection.access$1500(httpconnection.java:38) at org.mortbay.jetty.httpconnection$requesthandler.headercomplete( HttpConnection.java:598) at org.mortbay.jetty.httpparser.parsenext(httpparser.java:487) at org.mortbay.jetty.httpparser.parseavailable(httpparser.java:196) at org.mortbay.jetty.httpconnection.handle(httpconnection.java:293) at org.mortbay.jetty.bio.socketconnector$connection.run(socketconnector) at org.mortbay.thread.boundedthreadpool$poolthread.run(boundedthreadpool) - locked <0x47a52158> (a org.mortbay.thread.boundedthreadpool$poolthread)

Bluedragon ThreadDump "BoundedThreadPool0-30" prio=1 tid=0x41e2f878 nid=0x2d7a in Object.wait() [5c8a9000..5c8a9714] at java.lang.object.wait(native Method) - waiting on <0x47a5> (a org.mortbay.thread.boundedthreadpool$poolthread) at org.mortbay.thread.boundedthreadpool$poolthread.run(boundedthreadpool) - locked <0x47a52298> (a org.mortbay.thread.boundedthreadpool$poolthread) "BoundedThreadPool0-29" prio=1 tid=0x5a4c5650 nid=0x2d7a in Object.wait() [5c828000..5c828794] at java.lang.object.wait(native Method) - waiting on <0x47a5> (a org.mortbay.thread.boundedthreadpool$poolthread) at org.mortbay.thread.boundedthreadpool$poolthread.run(boundedthreadpool) - locked <0x47a52108> (a org.mortbay.thread.boundedthreadpool$poolthread) "BoundedThreadPool0-28" prio=1 tid=0x5a4c53f8 nid=0x2d7a runnable [5c7a8000..5c7a8814] at java.net.socketinputstream.socketread0(native Method) at java.net.socketinputstream.read(socketinputstream.java:129) at org.mortbay.io.bio.streamendpoint.fill(streamendpoint.java:99) at org.mortbay.jetty.bio.socketconnector$connection.fill(socketconnector) at org.mortbay.jetty.httpparser.parsenext(httpparser.java:257) at org.mortbay.jetty.httpparser.parseavailable(httpparser.java:192) at org.mortbay.jetty.httpconnection.handle(httpconnection.java:293) at org.mortbay.jetty.bio.socketconnector$connection.run(socketconnector)

Bluedragon ThreadDump "BoundedThreadPool0-27" prio=1 tid=0x41e6a640 nid=0x2d7a in Object.wait() [5c728000..5c728894] at java.lang.object.wait(native Method) - waiting on <0x47a5> (a org.mortbay.thread.boundedthreadpool$poolthread) at org.mortbay.thread.boundedthreadpool$poolthread.run(boundedthreadpool) - locked <0x47a52338> (a org.mortbay.thread.boundedthreadpool$poolthread) "BoundedThreadPool0-26" prio=1 tid=0x41e693f8 nid=0x2d7a in Object.wait() [5c6a8000..5c6a8914] at java.lang.object.wait(native Method) - waiting on <0x47a5> (a org.mortbay.thread.boundedthreadpool$poolthread) at org.mortbay.thread.boundedthreadpool$poolthread.run(boundedthreadpool) - locked <0x47a52248> (a org.mortbay.thread.boundedthreadpool$poolthread) "BoundedThreadPool0-25" prio=1 tid=0x086b1c50 nid=0x2d7a in Object.wait() [5c628000..5c628994] at java.lang.object.wait(native Method) - waiting on <0x47a4> (a org.mortbay.thread.boundedthreadpool$poolthread) at org.mortbay.thread.boundedthreadpool$poolthread.run(boundedthreadpool) - locked <0x47a4e180> (a org.mortbay.thread.boundedthreadpool$poolthread)

Bluedragon ThreadDump According to client, system was idle > Did not accept any more connection requests Let s go back a few slides > Why was HttpGenerator.prepareBuffers() being called?

Bluedragon ThreadDump "BoundedThreadPool0-31" prio=1 tid=0x5ad60d78 nid=0x2d7a runnable [5c929000..5c929694] at org.mortbay.jetty.httpgenerator.preparebuffers(httpgenerator.java:878) at org.mortbay.jetty.httpgenerator.flushbuffers(httpgenerator.java:681) at org.mortbay.jetty.httpgenerator.complete(httpgenerator.java:671) at org.mortbay.jetty.httpconnection.dohandler(httpconnection.java:388) at org.mortbay.jetty.httpconnection.access$1500(httpconnection.java:38) at org.mortbay.jetty.httpconnection$requesthandler.headercomplete( HttpConnection.java:598) at org.mortbay.jetty.httpparser.parsenext(httpparser.java:487) at org.mortbay.jetty.httpparser.parseavailable(httpparser.java:196) at org.mortbay.jetty.httpconnection.handle(httpconnection.java:293) at org.mortbay.jetty.bio.socketconnector$connection.run(socketconnector) at org.mortbay.thread.boundedthreadpool$poolthread.run(boundedthreadpool) - locked <0x47a52158> (a org.mortbay.thread.boundedthreadpool$poolthread)

Addressing the Problem Add more hardware > Often the cheapest solution > 100% CPU is it possible to add faster CPU? > May not always solve the problem

Java Virtual Machine Tuning Configuration > e.g. heap sizing, hotspot compilers, etc.

Application Code Otherwise, all roads lead back to application > Implies coding changes > Expensive, time consuming, error prone > Need good regression testing Well designed code makes changes easier > DRY (don t repeat yourself) > SRP (single responsibility principle) > Correct design patterns > http://www.javaspecialists.co.za

Application Profiling Java has built-in profiling tools Run the JVM with Xrunprof Other alternatives available from > http://www.javaperformancetuning.com

This is the Why! Profiling is the measurement that tells us why > From there we can implement the fix Run benchmark to ensure problem solved Regression test Have you reached your performance target? > If not, start from the beginning and find next bottleneck > When problem #1 is solved, problem #2 might be gone > Avoid fixing more than one problem at a time

Heap Usage after GC Session timed out

JoGoSlo Why? Discussions with client suggested database caching > Suspected cached SELECT * FROM very_large_table Investigation confirmed memory leak Troublesome point > Users claimed application sometimes recovered Question: is this from the database interaction or a memory leak in a long-term temporary object? Hypothesis: Memory leak could be from HTTPSession

JoGoSlo Why? HTTPSession timeout correlated strongly with decrease in memory > Confirmed with memory profiler > Output from memory profilers is often very confusing for large systems > This additional information helped us filter the memory profiler > Bingo! The HTTPSession was found to be retaining session object, due to the improper scoping of Struts Sessions

Conclusion Don t measure, guess > Then call us!

Essentials of Java Performance Tuning Dr Heinz Kabutz heinz@javaspecialists.co.za Kirk Pepperdine kirk@kodewerk.com