24
Introduction to Performance Optimization of .NET web apps

ConFoo 2017: Introduction to performance optimization of .NET web apps

Embed Size (px)

Citation preview

Page 1: ConFoo 2017: Introduction to performance optimization of .NET web apps

Introduction to Performance Optimization of .NET web apps

Page 2: ConFoo 2017: Introduction to performance optimization of .NET web apps

About me

Developer/DevOps at Amilia Optimization, scaling, monitoring, SQL Server, Elastic

Search Editor at InfoQ.com, writing about .NET and F# @plmaheu

Page 3: ConFoo 2017: Introduction to performance optimization of .NET web apps

In this talk

What does “performance optimization” mean? Tools of the trade Focused on the server side

Page 4: ConFoo 2017: Introduction to performance optimization of .NET web apps

What does “performance” means?

Depends on how it is measured. What interest us is response time (measured in ms)

and resource utilisation (CPU, memory, disk, bandwidth)

Page 5: ConFoo 2017: Introduction to performance optimization of .NET web apps

The method everybody knows: Guessing

Tempting to try to optimize code out of a gut feeling Unlikely to get it right more than 5-10% of the time The possible causes are endless: code, third party

library, web server, CDN, DNS, bandwitdh, ISP, hardware, etc.

Page 6: ConFoo 2017: Introduction to performance optimization of .NET web apps

Ahmdal’s lawRegardless the magnitude of an improvement, the theoretical speedup

of a task is always limited by the part of the task that cannot benefit from the improvement.

TL;DR: Optimize the right thing.

Page 7: ConFoo 2017: Introduction to performance optimization of .NET web apps

That SQL query is slow. So what?

Page 8: ConFoo 2017: Introduction to performance optimization of .NET web apps

Time to optimize

Measure everything, all the time. Knowing precisely what is slow is key to efficient performance optimization.

Stopping profiling too early and fixing the wrong problem is an easy trap to fall into.

Page 9: ConFoo 2017: Introduction to performance optimization of .NET web apps

Optimize what?

Optimizing the the right thing: trickier than it sounds Libraries often have overhead on first call (razor view

compilation, scanning an object with reflection, data caching, library caching.

SQL queries: Parametrized queries, locks, data not in cache Tip: Run your request a few times times to get consistent

timings.

Page 10: ConFoo 2017: Introduction to performance optimization of .NET web apps

Not all bottlenecks are created equals Different application types lead to different bottlenecks Uncommon performance issues in unoptimized code:

Garbage Collection Hitting concurrent request limit, default in asp.net is 12 * cores

(async) Minor innefficiencies like an extra if condition

Page 11: ConFoo 2017: Introduction to performance optimization of .NET web apps

Different issues at different scales.1s Upload a file to third party cloud service10ms to100ms SQL Queries1ms Regex match0,001ms Get a property through reflection0,000,001ms Multiplying two numbers together

A file upload may look slow, but a thousand SQL queries is slower.

Page 12: ConFoo 2017: Introduction to performance optimization of .NET web apps

Tooling

Page 13: ConFoo 2017: Introduction to performance optimization of .NET web apps

Some numbers: Amilia 2 million pageviews per month Between 10 to 20 million requests per month Usual throughput : 300 to 500 requests per minute During registrations: Anywhere from 1,000 to 12,000 rpm SQL: 100,000+ queries per minute in peaks Avg. execution time: 100 ms

Note: Static files (js, css, html) are not included, served directly from CDN

Page 14: ConFoo 2017: Introduction to performance optimization of .NET web apps

Application Performance Monitoring

Provides a clear picture of what’s happening in production.

Data can be used as a starting point to reproduce an issue locally.

Stackify Retrace New Relic APM App Dynamics Application Insights

Page 15: ConFoo 2017: Introduction to performance optimization of .NET web apps
Page 16: ConFoo 2017: Introduction to performance optimization of .NET web apps

Lightweight code profilers

Provide live performance data on both dev and production systems.

MiniProfiler Glimpse Prefix

Page 17: ConFoo 2017: Introduction to performance optimization of .NET web apps

Example: MiniProfiler

Page 18: ConFoo 2017: Introduction to performance optimization of .NET web apps

Compared to an optimized pagewww.amilia.com/store/en/amilia-customer-success/shop/programs/17513

Page 19: ConFoo 2017: Introduction to performance optimization of .NET web apps

Code Profilers

Gives highest degree of details.Impractical for production, significant overhead. Redgate ANTS JetBrains dotTrace

Page 20: ConFoo 2017: Introduction to performance optimization of .NET web apps

Taken with ANTS

Page 21: ConFoo 2017: Introduction to performance optimization of .NET web apps

I/O: Third-party services and systems must be monitored, even if control over them is limited.

Databases, CDN, payment processor, etc.Service Map and Database tabs in New Relic

Page 22: ConFoo 2017: Introduction to performance optimization of .NET web apps

Follow best practices Issues can often be avoided by taking a quick look at best practices

for a library Difficult and time consuming to find

Examples: IIS and HTTPS -> Offload to a load balancer NHibernate -> Avoid implicit transactions SQL Server -> Too many to name them

Page 23: ConFoo 2017: Introduction to performance optimization of .NET web apps

To sum it up Measure before, during and after changing code Optimizing without measuring is like fixing a bug without testing Various tools are at your disposal, each giving visibility on some level

Article with links to the tools: https://www.infoq.com/articles/dotnet-performance-monitoring-optimization

Page 24: ConFoo 2017: Introduction to performance optimization of .NET web apps

Questions?