improving asp.net mvc application performance
DESCRIPTION
You've built an ASP.NET MVC application, but now you want it to go faster and serve more concurrent user requests. In this session, we'll look at some of the common performance problems ASP.NET MVC applications may encounter, and how to diagnose and correct them, using Visual Studio 2010's testing tools.Presented 8 Feb 2010 at MVCConf.com.TRANSCRIPT
www.mvcConf.com
Improving ASP.NET MVC
Application Performance
Steve Smith
The Code Project
SteveSmithBlog.com | @ardalis
www.mvcConf.com
Defining Performance Metrics
• Page Execution Time
• Requests/Sec
• TTLB
www.mvcConf.com
Defining Performance
Requirements
• A given web request (/Home/Index)
• Must return within a given time (TTLB or Page Execution Time)
• Under a given load (Requests/Sec + Active Users)
• Given system characteristics (50k records)
• Resource constraints (< 400 database server requests/sec)
www.mvcConf.com
Performance Requirement
• /Home/Index
• Must return within 1s Page Execution
Time
• Given 100 request/sec and base database
• With < 200 database requests/sec
www.mvcConf.com
Measure Baseline
• Record the Scenario
• Set up the Load Test
• Run the Test
• Analyze the Results
www.mvcConf.com
DEMO
Baseline Measurement: MVC Music Store
www.mvcConf.com
www.mvcConf.com
Find the Slowest Pages
www.mvcConf.com
Tuning a Web Application
Define Goal
Measure System
Form Hypothesis;Alter System
StopMeets Goal
Does Not Meet Goal
Change Only One Thing!
www.mvcConf.com
Most Common Performance
Problems
• Database
– Too many queries
– Queries Not Optimized
• Network Requests
– From Server to Services
– From Browser to Web Server
www.mvcConf.com
Simple but Important
• Be sure production DLLs are compiled in Release mode!
• Isis.CodePlex.com (still alpha)
www.mvcConf.com
Caching
• Output Caching
– [OutputCache] attribute
– Applies to
• Action methods within Controller
• Or Entire Controller
www.mvcConf.com
Identify Pages To Cache
www.mvcConf.com
DEMO
Applying Output Caching
www.mvcConf.com
www.mvcConf.com
Add Data Caching
• Apply to Read operations
• Use where Output Caching can’t be used
• Consider applying at Repository level
• Consider using Sql Cache Invalidation or
short cache duration
www.mvcConf.com
What About Writes?
• Avoid blocking on writes– Send messages
– Use Async calls on server
– Use Async/Ajax calls from client
• Logically partition reads and writes– Command Query Responsibility Separation
(CQRS)
www.mvcConf.com
Other Tools: Profiling
www.mvcConf.com
Tier Interactions
www.mvcConf.com
What about Async?
• Async Actions
• AsyncController
• Improves scalability
• May improve performance
www.mvcConf.com
Comparing MVC and View
Engines
• MVC 2 Template on MVC 2– 8135 Requests/sec
• MVC 2 Template on MVC 3– 7987 Requests/sec
• MVC 3 Webforms View Engine on MVC 3– 7457 Requests/sec
• MVC 3 Razor View Engine on MVC 3– 7136 Requests/sec
http://blogs.msdn.com/b/marcinon/archive/2011/01/17/mvc-3-performance.aspx
www.mvcConf.com
MVC 3 Performance
• Unobtrusive client-side validation on by default
• Razor view engine imposes small cost over webforms view engine
• Performance improved for:
– Expression caching (lambdas)
– URL generation
– Action lookup
– Filter invocation
www.mvcConf.com
MVC Gotchas
• Avoid HttpResponse.WriteSubstitution()– Contents may be incorrectly cached– http://haacked.com/archive/2008/11/05/donut-caching-in-asp.net-mvc.aspx
– May work with MVC3 + ASPX; not supported; definitely not w/Razor
• RenderAction() Cache Bug– Calling an action with OutputCache attribute may
result in entire page being cached– http://haacked.com/archive/2009/05/12/donut-hole-caching.aspx
www.mvcConf.com
MVC Performance Tips
Disable Unused View Engines
• Html.EditorFor, Html.DisplayFor always
look for templates for each view engine
• Save extra “misses” to disk by removing
unused view engines.
www.mvcConf.com
Remove Unused View Engines
www.mvcConf.com
MVC Performance Tips
Avoid Passing Null to Strongly Typed Views w/Helpers
• Helpers like Html.TextBoxFor(m => m.Name) will throw NullReferenceException
• Exceptions will be caught/ignored, but may add up to negative performance impact
www.mvcConf.com
Avoid Passing Null to View
www.mvcConf.com
MVC Performance Tips
Uninstall IIS UrlRewrite Module
• If no applications on the server are using
it
• No effect in MVC apps before v3
• Enhances speed of URL generation
www.mvcConf.com
Uninstall UrlRewrite
(if not used)
www.mvcConf.com
DEMO
Applying Performance Fixes
www.mvcConf.com
Summary of Perf Gains
0
50
100
150
200
250
300
Pages/Sec Page Time (ms)
Base
Release Mode
No Null ViewModel
1 ViewEngine
OutputCache
www.mvcConf.com
Summary
• Set Goals – Don’t Optimize Prematurely
• Measure and Tune Scientifically
• Look for big wins first
• Watch out for Gotchas and apply Tips
www.mvcConf.com
References
• http://blogs.msdn.com/b/marcinon/archive/2011/01/17/mvc-3-performance.aspx
• http://blogs.msdn.com/b/marcinon/archive/2011/02/07/mvc-performance-tips.aspx
• http://www.asp.net/mvc/tutorials/improving-performance-with-output-caching-cs
• http://www.asp.net/mvc/tutorials/adding-dynamic-content-to-a-cached-page-cs
• http://mvcmusicstore.codeplex.com/
• http://isis.codeplex.com/
www.mvcConf.com
Questions?
Tweet Your Questions to:
@ardalis How do I…? #mvcconf
Steve Smith
SteveSmithBlog.com
Twitter: @ardalis