top .net, java & web performance mistakes - meetup jan 2015

69
- More on http://blog.dynatrace.com - Dynatrace Free Trial: http://bit.ly/dttrial Andreas Grabner - @grabnerandi Biggest Performance Mistakes (.NET, Java, Web …)

Upload: andreas-grabner

Post on 16-Jul-2015

417 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

1 @Dynatrace

- More on http://blog.dynatrace.com

- Dynatrace Free Trial: http://bit.ly/dttrial

Andreas Grabner - @grabnerandi

Biggest Performance Mistakes (.NET, Java, Web …)

Page 2: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

2 @Dynatrace

That’s why I ended up talking about performance

Page 3: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

3 @Dynatrace

Nobody wants this …

Page 4: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

4 @Dynatrace

Unless you work for Google or Microsoft

Page 5: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

5 @Dynatrace

Nor this …

Page 6: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

6 @Dynatrace

Page 7: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

7 @Dynatrace

As it leads to this …

Page 8: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

8 @Dynatrace

The “War Room”

Facebook – December 2012

Page 9: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

9 @Dynatrace

And potentially to this …

Page 10: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

10 @Dynatrace

Page 11: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

11 @Dynatrace

And this …

Page 12: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

12 @Dynatrace

Page 13: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

13 @Dynatrace

And that’s why Business doesn’t like it either …

Page 14: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

14 @Dynatrace

~80% of problems

caused by ~20% patterns

YES we know this

80% Dev Time in Bug Fixing

$60B Defect Costs

BUT

Page 15: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

15 @Dynatrace

6 Situations on

WHY this happened,

HOW to avoid it,

METRICS to look at

Page 16: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

16 @Dynatrace

Page 17: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

17 @Dynatrace

Incorrect Sizing of Pools and

Queues

Page 18: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

18 @Dynatrace

Online Banking: Slow Balance Check

1.69s (=101s!) To Check Balance!

87% spent in IIS 600! SQL Executions

Page 19: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

19 @Dynatrace

#1 Time really spent in IIS?

Tip: Elapsed Time tells us WHEN a Method was executed!

Finding: Thread 32 in IIS waited 87s to pass control to Thread 30 in ASP.NET

Tip: Thread# gives us insight on Thread Queues / Switches

Page 20: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

20 @Dynatrace

#2 What about these SQL Executions?

Finding: EVERY SQL statement is executed on

ITS OWN Connection!

Tip: Look at “GetConnection”

Page 21: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

21 @Dynatrace

#2 SQL Executions! continued …

#1: Same SQL is executed 67! times

#2: NO PREPARATIONbecause everything

executed on new Connection

Page 22: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

22 @Dynatrace

Lessons Learned!

ASP.NET Worker Thread Pool Sizing!

DB Connection PoolsMore Efficient SQL

Page 23: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

23 @Dynatrace

Idle vs. Busy Threads

# SQLs / Request

# GetConnection

Page 24: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

24 @Dynatrace

Page 25: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

25 @Dynatrace

“Blindly” (Re)use Existing

Components

Page 26: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

26 @Dynatrace

Requirement: We need a report

Page 27: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

27 @Dynatrace

Using Hibernate results in 4k+ SQL Statements to display 3 items!

Hibernate Executes 4k+ Statements

Individual Execution VERY FAST

But Total SUM takes 6s

Page 28: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

28 @Dynatrace

• Proper Sizing Specifications

• Understand the Frameworks you are using

Lessons Learned

Page 29: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

29 @Dynatrace

# SQLs / Request

# Same SQL / Request

Page 30: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

30 @Dynatrace

Page 31: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

31 @Dynatrace

Wrong Tools for the Job

Page 32: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

32 @Dynatrace

#1 Banking: Transaction History CSV Download!

Remember: High GC doesn’t necessarily mean that this request has a memory problem – BUT - …

Root Cause: Heavy use of String.Concat to build the CSV output in Memory

Recommendations:#1: Use System.Text.StringBuilder instead of String.Concat#2: Write directly back to OutputStream

Problem: Takes 207s! To download. 87% of Time spent in Garbage

Collection

Page 33: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

33 @Dynatrace

#2 Store: Rendering Search ResultProblem: 4.4s to render

result page

Root Cause: Custom RegExLibrary with performance

issues on large strings

Page 34: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

34 @Dynatrace

#3 Store: Occasional Performance Spikes

Problem: Occasional Spikes!Never seen in Development

Page 35: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

35 @Dynatrace

First Analysis: His own code

Page 36: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

36 @Dynatrace

DNS Lookup Issue during Login

Page 37: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

37 @Dynatrace

Reverse Lookup by IP fails on these IPs

Root Cause: Issues from Data Center Hoster

Page 38: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

38 @Dynatrace

• CSV Export Example

• Don’t build large Strings in Memory with String.Concat

• Write to output stream and use StringBuilder

• Search Result Page

• Don’t implement custom RegEx Library – existing Tools are better

• Test with large results and not just small test data

• Geo Lookup

• Don’t trust your Hosting Provider

• E.g: Use GeoIP Databases for accurate reverse lookups

Lessons Learned – Use Better Tools / Libraries

Page 39: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

39 @Dynatrace

Memory Usage

Time Spent in APIs

Page 40: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

40 @Dynatrace

Page 41: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

41 @Dynatrace

Not every Architect makes good decisions

Page 42: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

42 @Dynatrace

• Symptoms

• HTML takes between 60 and 120s to render

• High GC Time

• Assumptions

• Bad GC Tuning

• Probably bad Database Performance as rendering was simple

Project: Online Room Reservation System

Page 43: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

43 @Dynatrace

Developers built own monitoring

void roomreservationReport(int roomid)

{

long startTime = System.currentTimeMillis();

Object data = loadDataForRoom(roomid);

long dataLoadTime = System.currentTimeMillis() - startTime;

generateReport(data, roomid);

}

Result:

Avg. Data Load Time: 45s!

DB Tool says:

Avg. SQL Query: <1ms!

Page 44: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

44 @Dynatrace

#1: Loading too much data24889! Calls to the

Database API!

High CPU and High Memory Usage to keep all

data in Memory

Page 45: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

45 @Dynatrace

#2: On individual connections 12444!individual

connections

Classical N+1 Query Problem

Individual SQL really <1ms

Page 46: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

46 @Dynatrace

#3: Putting all data in temp Hashtable

Lots of time spent in

Hashtable.get

Called from their Entity Objects

Page 47: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

47 @Dynatrace

• Custom Measuring

• Was impacted by Garbage Collection

• Just measured overall time but not # SQL Executions

• Learn SQL and don’t use Hashtables as Workaround

Lesson Learned

void roomreservationReport(int roomid)

{

long startTime = System.currentTimeMillis();

Object data = loadDataForRoom(roomid);

long dataLoadTime = System.currentTimeMillis() - startTime;

generateReport(data, roomid);

}

Page 48: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

48 @Dynatrace

# SQL Executions

# of SAME SQLs

Conn. Acquisition Time

Page 49: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

49 @Dynatrace

Page 50: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

50 @Dynatrace

#Push without a Plan

Page 51: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

51 @Dynatrace

Mobile Landing Page of Super Bowl Ad

434 Resources in total on that page:230 JPEGs, 75 PNGs, 50 GIFs, …

Total size of ~ 20MB

Page 52: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

52 @Dynatrace

Fifa.com during Worldcup

http://apmblog.compuware.com/2014/05/21/is-the-fifa-world-cup-website-ready-for-the-tournament/

Page 53: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

53 @Dynatrace

# Images

# Redirects

Size of Resources

Page 54: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

54 @Dynatrace

Page 55: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

55 @Dynatrace

#No “Agile” Deployment

Page 56: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

56 @Dynatrace

Load Spike resulted in UnavailabilityAd

on

air

Page 57: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

57 @Dynatrace

Alternative: “GoDaddy goes DevOps”

1h before SuperBowl KickOff

1h after Game ended

Page 58: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

58 @Dynatrace

# of Domains

Total Size

Page 59: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

59 @Dynatrace

Waiting for Bug Reports

Page 60: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

60 @Dynatrace

Look behind the scenes

Page 61: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

61 @Dynatrace

•# Images

•# Redirects

•Size of Resources

•# SQL Executions

•# of SAME SQLs

•# Items per Page

•# AJAX per Page

Look at these Metrics Before Checking In Code

•Time Spent in API

•# Calls into API

•# Functional Errors

•3rd Party calls

•# of Domains

•Total Size

•…

Page 62: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

62 @Dynatrace

Commit Stage• Compile• Execute Unit Test• Code Analysis• Build installers

Automated Acceptance

Testing

Automated Capacity Testing

Manual testing• Key showcases• Exploratory testing Release

Unit & Integration Tests

Functional Tests

Performance TestsProductionMonitoring

Functional Tests

(R)Evolutionize Performance Optimization

Page 63: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

63 @Dynatrace

Page 64: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

64 @Dynatrace

Example from Web Diagnostics 282! Objects

on that page9.68MB Page Size

8.8s Page Load Time

Most objects are images delivered from your main

domain

Very long Connect time (1.8s) to your CDN

Page 65: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

65 @Dynatrace

Example from Server-Side Diagnostics526s to render that

report

1 SQL running

210s!

Lots of time spent in logging to Log4J

Lots of time spent in rendering

Page 66: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

66 @Dynatrace

Online Performance Clinics

Every Other week @

bit.ly/onlineperfclinic

Page 67: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

67 @Dynatrace

Your Benefits

• Free Performance Review

• Extended Dynatrace License

“Share Your PurePath”

bit.ly/sharepurepathMy Benefits

• More blog material for next year

• Gratification that I could help you

Page 68: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

68 @Dynatrace

Questions and/or Demo

Slides: slideshare.net/grabnerandi

Get Tools: bit.ly/dttrial

YouTube Tutorials: bit.ly/dttutorials

Contact Me: [email protected]

Follow Me: @grabnerandi

Read More: blog.dynatrace.com

Page 69: Top .NET, Java & Web Performance Mistakes - Meetup Jan 2015

69 @Dynatrace

Andreas GrabnerDynatrace Developer Advocate

@grabnerandi

http://blog.dynatrace.com