SlideShare una empresa de Scribd logo
1 de 37
ASP.NET Performance & Optimization 
Andrea Dottor – Microsoft MVP ASP.NET/IIS
Perché questa sessione? 
 Da consulenze/sviluppo di soluzioni reali 
 Spesso si sviluppa non pensando alle prestazioni 
 "Tempo è denaro" 
 Spesso è il cliente/utente che fa notare la lentezza 
dell'applicazione 
 Dalla sessione "Architettura di 
Stackoverflow" di Marco Cecconi 
 Alcune note: 
 Metodo YAGNI 
 No Dependency Injection, no Providers, no… 
 Custom ORM (no Entity Framework, no NHibernate) 
 Soluzione composta da (soli) 8 progetti
Da tenere sempre a mente 
 KISS 
 http://it.wikipedia.org/wiki/KISS_(informatica) 
 KISS è un acronimo usato nell'informatica, che sta 
per Keep It Simple, Stupid, ossia "rimani sul semplice, 
stupido 
 YAGNI 
 http://en.wikipedia.org/wiki/You_aren't_gonna_need_it 
 "You aren't gonna need it" (acronym: YAGNI) is a 
principle of extreme programming (XP) that states a 
programmer should not add functionality until 
deemed necessary
Come capire dove intervenire? 
 Navigazione da browser 
 Test di carico 
 Performance counter 
 Profiler / Tracert / Logging 
 SQL Profiler
Performance 
Counter
Performance Counter 
 Esistono Performance Counter specifici 
per ASP.NET (e suoi componenti) 
 Permettono di monitorare lo stato 
dell'applicazione, e l'uso che viene fatto 
delle risorse (cache, session, …) 
 Possono venir messi a confronto con i performance 
counter di sistema per capire la causa di 
rallentamenti/blocchi 
 NOTE: attenzione che ogni counter ha 
una propria scala/range di valori
Performance Counter ASP.NET 
 Requests Failed 
 The total number of failed requests. Any status codes greater 
than or equal to 400 will increment this counter. 
 Requests/Sec 
 The number of requests executed per second. 
 Requests Queued 
 The number of requests waiting for service from the queue. 
 Request Wait Time 
 The number of milliseconds that the most recent request 
waited in the queue for processing. 
 Pipeline Instance Count 
 The number of active request pipeline instances for the 
specified ASP.NET application. Since only one execution thread 
can run within a pipeline instance, this number gives the 
maximum number of concurrent requests that are being 
processed for a given application.
Performance Counter ASP.NET 
 Errors During Execution 
 The total number of errors that occur during the 
execution of an HTTP request, excluding parser and 
compilation errors. 
 Errors Unhandled During Execution 
 The total number of unhandled errors that occur 
during the execution of HTTP requests.
Performance Counter ASP.NET 
 Sessions Active 
 The number of sessions currently active. This counter is 
supported only with in-memory session state. 
 Sessions Total 
 The total number of sessions. This counter is supported 
only with in-memory session state. 
 Session SQL Server Connections Total 
 The total number of session-state connections made to 
the computer on which out-of-process session-state 
data is stored. 
 State Server Sessions Active 
 The number of currently active user sessions. This 
counter is available only on the computer where the 
state server service (aspnet_state) is running.
Performance Counter ASP.NET 
 Cache Total Entries 
 The total number of entries in the cache. This counter 
includes both use of the cache by the ASP.NET page 
framework and use of the application cache through 
cache APIs. 
 Cache Total Turnover Rate 
 The number of additions and removals to the cache per 
second, which is useful in helping to determine how 
effectively the cache is being used. If the turnover rate is 
high, the cache is not being used efficiently. 
 Per monitorare solo la Cache API: 
 Cache API Entries 
 Cache API Turnover Rate
Performance counter 
 Potete creare dei vostri Performance 
Counter 
 Utili per poter monitorare valori/dati che vi sono 
utili a capire l'utilizzo della vostra applicazione 
 Link: https://www.simple-talk.com/dotnet/performance/building-performance- 
metrics-into-asp.net-mvc-applications/ 
 Potete salvare i dati recuperati dai 
counter: 
 Utile per analizzarli in un secono momento 
 http://technet.microsoft.com/en-us/library/cc722148.aspx
demo
Test di carico
Test di carico 
 Permettono di portare alla luce eventuali 
errori che compaiono "solamente" quando 
l'applicazione è sotto stress 
 Problemi di memory leak 
 Problemi di concorrenza/thread safety 
 Problemi dovuti ad un server sottodimensionato 
 CPU al 100% 
 Memoria RAM occupata 
 Problemi di connettività/banda 
 I Web Load & Performance Testing sono 
presenti sono nella versione Ultimate di 
Visual Studio
Test di carico 
 Non eseguire i test di carico dalla stessa 
macchina che ospita l'applicazione 
 Utilizzare più Test Agents (distribuiti) per 
eseguire i test 
 Possibilità di sfruttare Microsoft Azure 
per automatizzare il tutto 
 Oppure sfruttare le Virtual Machine/WorkerRole per 
scalare i Test Agents 
 http://msdn.microsoft.com/en-us/library/ms182594.aspx
demo
Profilazione 
accesso ai dati
SQL Profiler 
 Permette di monitorare l'uso che viene 
fatto del database 
 Di conseguenza anche il codice di accesso ai dati 
 Utile per scoprire chiamate non 
necessarie 
 Utile per scoprire chiamate duplicate
MiniProfiler 
 Libreria che permette di profilare la 
chiamate verso il database, e gli eventi 
di ASP.NET 
 MVC, WCF 
 Entity Framework, Raven DB, Mongo DB, 
 DbConnection, DbCommand, … 
 … 
 Sviluppato dal team di StackOverflow e 
rilasciato come OpenSource 
 http://miniprofiler.com/ 
 Nuget: Install-Package MiniProfiler 
 Possibilità di profilare codice custom
demo
Non 
dimentichiamo 
le "basi"
Cache 
 Non esiste solo HttpContext.Cache 
 HttpContext.Items 
 Per eseguire cache di dati per la richiesta corrente 
 HttpContext.Application 
 Per dati che non cambiano durante il ciclo di vita 
dell'applicazione 
 Non thread-safe 
 System.Runtime.Caching 
 Non ha dipendenze da System.Web 
 http://msdn.microsoft.com/en-us/ 
library/system.runtime.caching(v=vs.110).aspx 
 Deriva dall'Enterprise Library Caching Application Block 
 Presente da .NET Framework 4.0
Ma se più app accedono agli stessi dati? 
 La cache di ASP.NET diventa un limite 
 Ci si deve appoggiare ad una 
cache/servizio esterno alle applicazioni 
 Alcune soluzioni: 
 AppFabric 
 Redis 
 Memcached 
 In alcune realtà ci sono server dedicati a 
gestire solo la cache
Windows Server AppFabric 
 Estende Windows Server in modo da 
poter genstire e monitorare una cache 
applicativa centralizzata 
 Servizio scalabile 
 Possibilità di gestire anche le Sessioni 
ASP.NET 
 Possibilità di taggare gli oggetti in cache 
 NOTE: non installabile in Windows 
Server Web Edition
Redis 
 http://redis.io/ 
 In-memory 
 Key-Value store 
 Scalabile 
 (è possibile attivare la persistenza) 
 Microsoft ha eseguito il porting per 
Windows 
 https://github.com/MSOpenTech/redis 
 Librerie clients disponibili per molti 
linguaggi 
 Altamente performante
Memcached 
 http://memcached.org/ 
 Key-Value store 
 In-memory 
 Scalabile 
 Memcached Users 
 LiveJournal, Wikipedia, Flickr 
 Bebo, Twitter, Typepad 
 Yellowbot, Youtube, WordPress.com, ... 
 Clients disponibili su NuGet: 
 Esempio: Install-Package EnyimMemcached
NOTE: 
 Attenzione che gli oggetti che inserite in 
cache devono essere Serializzabili 
 Non inserite in cache oggetti compilati 
dinamicamente 
 Attenzione che gli oggetti non siano dei 
proxy (es con Lazy Loading)
demo
Second Level Cache for Entity Framework 
 https://efcache.codeplex.com/ 
 Implementazione del CachingProvider di 
Entity Framework 
 Permette di mantenere in cache il 
risultato delle query 
 Viene gestita anche l'invalidazione dei 
dati in cache
Output-cache 
 Permette di ritornare il rendering di una 
pagina/view/userControl/partialView 
senza doverla ricompilare ed eseguire 
 Possibilità di specificare quali 
chiavi/metodo utilizzare come chiavi per 
il riuso 
 Riduce notevolmente il carico di lavoro 
del server 
 Non utilizzarla in pagine con dati che 
variano di frequente
demo
CDN – Content Delivery Network 
 Utilizzare CDN o un secondo dominio per 
tutti i file statici 
 I browser hanno un limite per il numero di 
connessioni/richieste contemporanee verso 
lo stesso dominio 
 Includere immagini/file in un secondo dominio permette 
di aumentare il numero di download contemporanei del 
browser 
 Utilizzare librerie su CDN pubbliche 
aumenta la possibilità che queste siano già 
presenti nella cache del browser 
 Enabling CDN for Azure Websites 
 http://azure.microsoft.com/blog/2014/09/18/enabling-cdn- 
for-azure-websites/
Cache static content 
 Tramite il web.config è possibile 
specificare dei parametri per forzare la 
cache (lato client) di file statici 
 Immagini 
 CSS 
 JavaScript 
 … 
<system.webServer> 
<staticContent> 
<clientCache cacheControlMaxAge="7.00:00:00" cacheControlMode="UseMaxAge" /> 
</staticContent> 
</system.webServer>
demo
ASP.NET App Suspend 
 Possibilità di sospendere un'applicazione 
(invece che terminarla) dopo un tempo 
di inattività 
 Da IIS8, Windows Server 2012 R2, 
Framework 4.5.1 
 Riduzione dei tempi di avvio 
 Parametro dell'ApplicationPool
Links 
 Performance Counters for ASP.NET 
 http://msdn.microsoft.com/en-us/library/vstudio/fxk122b4(v=vs.100).aspx 
 Building Performance Metrics into ASP.NET MVC 
Applications 
 https://www.simple-talk.com/dotnet/performance/building-performance-metrics-into-asp.net-mvc-applications/ 
 Introduzione a Windows Server AppFabric 
 http://msdn.microsoft.com/en-us/library/hh351318.aspx 
 Redis on Windows 
 https://github.com/MSOpenTech/redis 
 StackExchange.Redis 
 https://github.com/StackExchange/StackExchange.Redis 
 Conditional GET 
 http://optimizeasp.net/conditional-get 
 Enabling CDN for Azure Websites 
 http://azure.microsoft.com/blog/2014/09/18/enabling-cdn-for-azure-websites/ 
 Plugin per Fiddler – Stress Stimulus 
 http://www.stresstimulus.com/ 
 Architettura di Stackoverflow 
 Video: https://www.youtube.com/watch?v=t6kM2EM6so4 
 Slide: http://www.slideshare.net/howtoweb/marco-cecconi-stack-overflow-architecture
feedback 
10 
• Materiale: 
– http://blog.dottor.net/files/xedotnet/20140919_Dottor. 
AspNetPerformance_code.zip 
– http://blog.dottor.net/files/xedotnet/20140919_Dottor. 
AspNetPerformance_slide.zip 
Email: andrea@dottor.net 
Website: http://www.dottor.net 
Blog: http://blog.dottor.net 
Twitter: http://twitter.com/dottor 
Contatti

Más contenido relacionado

La actualidad más candente

Blazor: are we ready for the launch?
Blazor: are we ready for the launch?Blazor: are we ready for the launch?
Blazor: are we ready for the launch?Andrea Agnoletto
 
Training Signal Webtrends
Training Signal WebtrendsTraining Signal Webtrends
Training Signal WebtrendsStefano Iaboni
 
UI Composition - Prism
UI Composition - PrismUI Composition - Prism
UI Composition - PrismDotNetMarche
 
ASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesAndrea Dottor
 
2015.04.23 Azure Community Bootcamp 2015 Keynote Italy
2015.04.23 Azure Community Bootcamp 2015 Keynote Italy2015.04.23 Azure Community Bootcamp 2015 Keynote Italy
2015.04.23 Azure Community Bootcamp 2015 Keynote ItalyMarco Parenzan
 
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVM
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVMRealizzare applicazioni cross-platform con Xamarin e il pattern MVVM
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVMCodemotion
 
Progettare in Team per il Responsive Web Design
Progettare in Team per il Responsive Web DesignProgettare in Team per il Responsive Web Design
Progettare in Team per il Responsive Web DesignSalvatore Paone
 
Sviluppare Azure Web Apps
Sviluppare Azure Web AppsSviluppare Azure Web Apps
Sviluppare Azure Web AppsAndrea Dottor
 
Sviluppo di soluzioni embedded moderne con .NET Micro Framework by Lorenzo Ma...
Sviluppo di soluzioni embedded moderne con .NET Micro Framework by Lorenzo Ma...Sviluppo di soluzioni embedded moderne con .NET Micro Framework by Lorenzo Ma...
Sviluppo di soluzioni embedded moderne con .NET Micro Framework by Lorenzo Ma...Codemotion
 
Slide typescript - net campus
Slide typescript - net campusSlide typescript - net campus
Slide typescript - net campusDotNetCampus
 
ARCHITETTURA DI UN'APPLICAZIONE SCALABILE
ARCHITETTURA DI UN'APPLICAZIONE SCALABILEARCHITETTURA DI UN'APPLICAZIONE SCALABILE
ARCHITETTURA DI UN'APPLICAZIONE SCALABILEDotNetCampus
 
Windows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppoWindows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppoAndrea Dottor
 
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Andrea Dottor
 
Dal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developersDal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developersAndrea Dottor
 
DotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerDotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerAlessandro Alpi
 
Blazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web FormBlazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web FormAndrea Dottor
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automationAntonio Liccardi
 

La actualidad más candente (20)

Blazor: are we ready for the launch?
Blazor: are we ready for the launch?Blazor: are we ready for the launch?
Blazor: are we ready for the launch?
 
Training Signal Webtrends
Training Signal WebtrendsTraining Signal Webtrends
Training Signal Webtrends
 
UI Composition - Prism
UI Composition - PrismUI Composition - Prism
UI Composition - Prism
 
ASP.NET Core - Razor Pages
ASP.NET Core - Razor PagesASP.NET Core - Razor Pages
ASP.NET Core - Razor Pages
 
2015.04.23 Azure Community Bootcamp 2015 Keynote Italy
2015.04.23 Azure Community Bootcamp 2015 Keynote Italy2015.04.23 Azure Community Bootcamp 2015 Keynote Italy
2015.04.23 Azure Community Bootcamp 2015 Keynote Italy
 
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVM
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVMRealizzare applicazioni cross-platform con Xamarin e il pattern MVVM
Realizzare applicazioni cross-platform con Xamarin e il pattern MVVM
 
Progettare in Team per il Responsive Web Design
Progettare in Team per il Responsive Web DesignProgettare in Team per il Responsive Web Design
Progettare in Team per il Responsive Web Design
 
Sviluppare Azure Web Apps
Sviluppare Azure Web AppsSviluppare Azure Web Apps
Sviluppare Azure Web Apps
 
Sviluppo di soluzioni embedded moderne con .NET Micro Framework by Lorenzo Ma...
Sviluppo di soluzioni embedded moderne con .NET Micro Framework by Lorenzo Ma...Sviluppo di soluzioni embedded moderne con .NET Micro Framework by Lorenzo Ma...
Sviluppo di soluzioni embedded moderne con .NET Micro Framework by Lorenzo Ma...
 
Angular and beyond
Angular and beyondAngular and beyond
Angular and beyond
 
jQuery
jQueryjQuery
jQuery
 
Slide typescript - net campus
Slide typescript - net campusSlide typescript - net campus
Slide typescript - net campus
 
ARCHITETTURA DI UN'APPLICAZIONE SCALABILE
ARCHITETTURA DI UN'APPLICAZIONE SCALABILEARCHITETTURA DI UN'APPLICAZIONE SCALABILE
ARCHITETTURA DI UN'APPLICAZIONE SCALABILE
 
Windows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppoWindows azure - abbattere tempi e costi di sviluppo
Windows azure - abbattere tempi e costi di sviluppo
 
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
Back to the Future: Migrare da WebForm ad ASP.NET Core gradualmente
 
Dal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developersDal RenderFragment ai Generics, tips for Blazor developers
Dal RenderFragment ai Generics, tips for Blazor developers
 
DotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql ServerDotNetCampus - Continuous Integration con Sql Server
DotNetCampus - Continuous Integration con Sql Server
 
Microsoft Fast - Overview
Microsoft Fast - OverviewMicrosoft Fast - Overview
Microsoft Fast - Overview
 
Blazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web FormBlazor per uno sviluppatore Web Form
Blazor per uno sviluppatore Web Form
 
Javascript task automation
Javascript task automationJavascript task automation
Javascript task automation
 

Destacado

L'EVOLUZIONE E LE NOVITÀ DI WINDOWS PHONE 8.1
L'EVOLUZIONE E LE NOVITÀ DI WINDOWS PHONE 8.1L'EVOLUZIONE E LE NOVITÀ DI WINDOWS PHONE 8.1
L'EVOLUZIONE E LE NOVITÀ DI WINDOWS PHONE 8.1codeblock
 
Typescript overview
Typescript overviewTypescript overview
Typescript overviewcodeblock
 
Works with ASP.NET Core on Linux and Mac
Works with ASP.NET Core on Linux and MacWorks with ASP.NET Core on Linux and Mac
Works with ASP.NET Core on Linux and MacEmanuele Bartolesi
 
Getting started with MVC 5 and Visual Studio 2013
Getting started with MVC 5 and Visual Studio 2013Getting started with MVC 5 and Visual Studio 2013
Getting started with MVC 5 and Visual Studio 2013Thomas Robbins
 
7.1 trans 2 teachers
7.1 trans 2 teachers7.1 trans 2 teachers
7.1 trans 2 teachersNRGPSchools
 
7.1 la1 teachers
7.1 la1 teachers7.1 la1 teachers
7.1 la1 teachersNRGPSchools
 
7.1 transparency 2
7.1 transparency 27.1 transparency 2
7.1 transparency 2NRGPSchools
 
7.1 Transparency 1
7.1 Transparency 17.1 Transparency 1
7.1 Transparency 1NRGPSchools
 

Destacado (11)

ASP.NET Core
ASP.NET CoreASP.NET Core
ASP.NET Core
 
L'EVOLUZIONE E LE NOVITÀ DI WINDOWS PHONE 8.1
L'EVOLUZIONE E LE NOVITÀ DI WINDOWS PHONE 8.1L'EVOLUZIONE E LE NOVITÀ DI WINDOWS PHONE 8.1
L'EVOLUZIONE E LE NOVITÀ DI WINDOWS PHONE 8.1
 
Typescript overview
Typescript overviewTypescript overview
Typescript overview
 
Works with ASP.NET Core on Linux and Mac
Works with ASP.NET Core on Linux and MacWorks with ASP.NET Core on Linux and Mac
Works with ASP.NET Core on Linux and Mac
 
Intro to asp.net mvc 4 with visual studio
Intro to asp.net mvc 4 with visual studioIntro to asp.net mvc 4 with visual studio
Intro to asp.net mvc 4 with visual studio
 
Getting started with MVC 5 and Visual Studio 2013
Getting started with MVC 5 and Visual Studio 2013Getting started with MVC 5 and Visual Studio 2013
Getting started with MVC 5 and Visual Studio 2013
 
7.1 la1
7.1 la17.1 la1
7.1 la1
 
7.1 trans 2 teachers
7.1 trans 2 teachers7.1 trans 2 teachers
7.1 trans 2 teachers
 
7.1 la1 teachers
7.1 la1 teachers7.1 la1 teachers
7.1 la1 teachers
 
7.1 transparency 2
7.1 transparency 27.1 transparency 2
7.1 transparency 2
 
7.1 Transparency 1
7.1 Transparency 17.1 Transparency 1
7.1 Transparency 1
 

Similar a ASP.NET performance optimization

Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!Massimo Bonanni
 
Il buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita feliceIl buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita feliceAndrea Dottor
 
Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0Alessandro Forte
 
Visual Studio Performance Tools
Visual Studio Performance ToolsVisual Studio Performance Tools
Visual Studio Performance ToolsAndrea Tosato
 
Le novita di visual studio 2012
Le novita di visual studio 2012Le novita di visual studio 2012
Le novita di visual studio 2012Crismer La Pignola
 
Working between the clouds (versione completa)
Working between the clouds (versione completa)Working between the clouds (versione completa)
Working between the clouds (versione completa)Davide Cerbo
 
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013Massimo Caliman
 
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAndrea Balducci
 
Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Fabrizio Bernabei
 
Esposizione RIA
Esposizione RIAEsposizione RIA
Esposizione RIAdiodorato
 
Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailStefano Ottaviani
 
Differenze tra Alfresco Community ed Enterprise
Differenze tra Alfresco Community ed EnterpriseDifferenze tra Alfresco Community ed Enterprise
Differenze tra Alfresco Community ed EnterpriseSoftInstigate
 
ASP.NET Ajax Community Launch VS2008
ASP.NET Ajax Community Launch VS2008ASP.NET Ajax Community Launch VS2008
ASP.NET Ajax Community Launch VS2008Fabrizio Bernabei
 
Azure Application Insights
Azure Application InsightsAzure Application Insights
Azure Application InsightsKlab
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciutaAndrea Dottor
 

Similar a ASP.NET performance optimization (20)

Novità di Asp.Net 4.0
Novità di Asp.Net 4.0Novità di Asp.Net 4.0
Novità di Asp.Net 4.0
 
Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!Asp.net web form 4.5 - what's new!!
Asp.net web form 4.5 - what's new!!
 
Il buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita feliceIl buon programmatore - consigli pratici per una vita felice
Il buon programmatore - consigli pratici per una vita felice
 
Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0Alessandro Forte - ASP.Net 4.0
Alessandro Forte - ASP.Net 4.0
 
Visual Studio Performance Tools
Visual Studio Performance ToolsVisual Studio Performance Tools
Visual Studio Performance Tools
 
Le novita di visual studio 2012
Le novita di visual studio 2012Le novita di visual studio 2012
Le novita di visual studio 2012
 
Working between the clouds (versione completa)
Working between the clouds (versione completa)Working between the clouds (versione completa)
Working between the clouds (versione completa)
 
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013
Google App Engine Overview Seminario GDG Genova 4 Ottobre 2013
 
Asp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community TourAsp.Net MVC 2 :: VS 2010 Community Tour
Asp.Net MVC 2 :: VS 2010 Community Tour
 
Build Automation Tips
Build Automation TipsBuild Automation Tips
Build Automation Tips
 
Ddive Xpage852
Ddive Xpage852Ddive Xpage852
Ddive Xpage852
 
Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010Asp.net 4 Community Tour VS2010
Asp.net 4 Community Tour VS2010
 
Grasso Frameworks Ajax
Grasso Frameworks AjaxGrasso Frameworks Ajax
Grasso Frameworks Ajax
 
Esposizione RIA
Esposizione RIAEsposizione RIA
Esposizione RIA
 
Sviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRailSviluppo Web Agile Con MonoRail
Sviluppo Web Agile Con MonoRail
 
Differenze tra Alfresco Community ed Enterprise
Differenze tra Alfresco Community ed EnterpriseDifferenze tra Alfresco Community ed Enterprise
Differenze tra Alfresco Community ed Enterprise
 
ASP.NET Ajax Community Launch VS2008
ASP.NET Ajax Community Launch VS2008ASP.NET Ajax Community Launch VS2008
ASP.NET Ajax Community Launch VS2008
 
Azure Application Insights
Azure Application InsightsAzure Application Insights
Azure Application Insights
 
Asp net (versione 1 e 2)
Asp net (versione 1 e 2)Asp net (versione 1 e 2)
Asp net (versione 1 e 2)
 
Dependency injection questa sconosciuta
Dependency injection questa sconosciutaDependency injection questa sconosciuta
Dependency injection questa sconosciuta
 

Más de Andrea Dottor

Blazor ♥️ JavaScript
Blazor ♥️ JavaScriptBlazor ♥️ JavaScript
Blazor ♥️ JavaScriptAndrea Dottor
 
Blazor, lo sapevi che...
Blazor, lo sapevi che...Blazor, lo sapevi che...
Blazor, lo sapevi che...Andrea Dottor
 
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Andrea Dottor
 
Blazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi realiBlazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi realiAndrea Dottor
 
What's New in ASP.NET Core 3
What's New in ASP.NET Core 3What's New in ASP.NET Core 3
What's New in ASP.NET Core 3Andrea Dottor
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPCAndrea Dottor
 
Real case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyReal case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyAndrea Dottor
 
Customize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingCustomize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingAndrea Dottor
 
ASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheAndrea Dottor
 
Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0Andrea Dottor
 
Creare API pubbliche, come evitare gli errori comuni
 Creare API pubbliche, come evitare gli errori comuni Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniAndrea Dottor
 
Deploy & Run on Azure App Service
Deploy & Run on Azure App ServiceDeploy & Run on Azure App Service
Deploy & Run on Azure App ServiceAndrea Dottor
 
L'evoluzione del web
L'evoluzione del webL'evoluzione del web
L'evoluzione del webAndrea Dottor
 
Introduzione ad ASP.NET Core
Introduzione ad ASP.NET CoreIntroduzione ad ASP.NET Core
Introduzione ad ASP.NET CoreAndrea Dottor
 
Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniCreare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniAndrea Dottor
 
Crea servizi REST per la tua App con ASP.NET 5
Crea servizi REST per la tua App con ASP.NET 5Crea servizi REST per la tua App con ASP.NET 5
Crea servizi REST per la tua App con ASP.NET 5Andrea Dottor
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsAndrea Dottor
 

Más de Andrea Dottor (17)

Blazor ♥️ JavaScript
Blazor ♥️ JavaScriptBlazor ♥️ JavaScript
Blazor ♥️ JavaScript
 
Blazor, lo sapevi che...
Blazor, lo sapevi che...Blazor, lo sapevi che...
Blazor, lo sapevi che...
 
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check ...
 
Blazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi realiBlazor ha vinto? Storie di casi reali
Blazor ha vinto? Storie di casi reali
 
What's New in ASP.NET Core 3
What's New in ASP.NET Core 3What's New in ASP.NET Core 3
What's New in ASP.NET Core 3
 
Alla scoperta di gRPC
Alla scoperta di gRPCAlla scoperta di gRPC
Alla scoperta di gRPC
 
Real case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core graduallyReal case: migrate from Web Forms to ASP.NET Core gradually
Real case: migrate from Web Forms to ASP.NET Core gradually
 
Customize ASP.NET Core scaffolding
Customize ASP.NET Core scaffoldingCustomize ASP.NET Core scaffolding
Customize ASP.NET Core scaffolding
 
ASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cacheASP.NET, ottimizziamo con la cache
ASP.NET, ottimizziamo con la cache
 
Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0Cosa c'è di nuovo in asp.net core 2 0
Cosa c'è di nuovo in asp.net core 2 0
 
Creare API pubbliche, come evitare gli errori comuni
 Creare API pubbliche, come evitare gli errori comuni Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuni
 
Deploy & Run on Azure App Service
Deploy & Run on Azure App ServiceDeploy & Run on Azure App Service
Deploy & Run on Azure App Service
 
L'evoluzione del web
L'evoluzione del webL'evoluzione del web
L'evoluzione del web
 
Introduzione ad ASP.NET Core
Introduzione ad ASP.NET CoreIntroduzione ad ASP.NET Core
Introduzione ad ASP.NET Core
 
Creare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuniCreare API pubbliche, come evitare gli errori comuni
Creare API pubbliche, come evitare gli errori comuni
 
Crea servizi REST per la tua App con ASP.NET 5
Crea servizi REST per la tua App con ASP.NET 5Crea servizi REST per la tua App con ASP.NET 5
Crea servizi REST per la tua App con ASP.NET 5
 
Migliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.jsMigliora il tuo codice con knockout.js
Migliora il tuo codice con knockout.js
 

ASP.NET performance optimization

  • 1. ASP.NET Performance & Optimization Andrea Dottor – Microsoft MVP ASP.NET/IIS
  • 2. Perché questa sessione?  Da consulenze/sviluppo di soluzioni reali  Spesso si sviluppa non pensando alle prestazioni  "Tempo è denaro"  Spesso è il cliente/utente che fa notare la lentezza dell'applicazione  Dalla sessione "Architettura di Stackoverflow" di Marco Cecconi  Alcune note:  Metodo YAGNI  No Dependency Injection, no Providers, no…  Custom ORM (no Entity Framework, no NHibernate)  Soluzione composta da (soli) 8 progetti
  • 3. Da tenere sempre a mente  KISS  http://it.wikipedia.org/wiki/KISS_(informatica)  KISS è un acronimo usato nell'informatica, che sta per Keep It Simple, Stupid, ossia "rimani sul semplice, stupido  YAGNI  http://en.wikipedia.org/wiki/You_aren't_gonna_need_it  "You aren't gonna need it" (acronym: YAGNI) is a principle of extreme programming (XP) that states a programmer should not add functionality until deemed necessary
  • 4. Come capire dove intervenire?  Navigazione da browser  Test di carico  Performance counter  Profiler / Tracert / Logging  SQL Profiler
  • 6. Performance Counter  Esistono Performance Counter specifici per ASP.NET (e suoi componenti)  Permettono di monitorare lo stato dell'applicazione, e l'uso che viene fatto delle risorse (cache, session, …)  Possono venir messi a confronto con i performance counter di sistema per capire la causa di rallentamenti/blocchi  NOTE: attenzione che ogni counter ha una propria scala/range di valori
  • 7. Performance Counter ASP.NET  Requests Failed  The total number of failed requests. Any status codes greater than or equal to 400 will increment this counter.  Requests/Sec  The number of requests executed per second.  Requests Queued  The number of requests waiting for service from the queue.  Request Wait Time  The number of milliseconds that the most recent request waited in the queue for processing.  Pipeline Instance Count  The number of active request pipeline instances for the specified ASP.NET application. Since only one execution thread can run within a pipeline instance, this number gives the maximum number of concurrent requests that are being processed for a given application.
  • 8. Performance Counter ASP.NET  Errors During Execution  The total number of errors that occur during the execution of an HTTP request, excluding parser and compilation errors.  Errors Unhandled During Execution  The total number of unhandled errors that occur during the execution of HTTP requests.
  • 9. Performance Counter ASP.NET  Sessions Active  The number of sessions currently active. This counter is supported only with in-memory session state.  Sessions Total  The total number of sessions. This counter is supported only with in-memory session state.  Session SQL Server Connections Total  The total number of session-state connections made to the computer on which out-of-process session-state data is stored.  State Server Sessions Active  The number of currently active user sessions. This counter is available only on the computer where the state server service (aspnet_state) is running.
  • 10. Performance Counter ASP.NET  Cache Total Entries  The total number of entries in the cache. This counter includes both use of the cache by the ASP.NET page framework and use of the application cache through cache APIs.  Cache Total Turnover Rate  The number of additions and removals to the cache per second, which is useful in helping to determine how effectively the cache is being used. If the turnover rate is high, the cache is not being used efficiently.  Per monitorare solo la Cache API:  Cache API Entries  Cache API Turnover Rate
  • 11. Performance counter  Potete creare dei vostri Performance Counter  Utili per poter monitorare valori/dati che vi sono utili a capire l'utilizzo della vostra applicazione  Link: https://www.simple-talk.com/dotnet/performance/building-performance- metrics-into-asp.net-mvc-applications/  Potete salvare i dati recuperati dai counter:  Utile per analizzarli in un secono momento  http://technet.microsoft.com/en-us/library/cc722148.aspx
  • 12. demo
  • 14. Test di carico  Permettono di portare alla luce eventuali errori che compaiono "solamente" quando l'applicazione è sotto stress  Problemi di memory leak  Problemi di concorrenza/thread safety  Problemi dovuti ad un server sottodimensionato  CPU al 100%  Memoria RAM occupata  Problemi di connettività/banda  I Web Load & Performance Testing sono presenti sono nella versione Ultimate di Visual Studio
  • 15. Test di carico  Non eseguire i test di carico dalla stessa macchina che ospita l'applicazione  Utilizzare più Test Agents (distribuiti) per eseguire i test  Possibilità di sfruttare Microsoft Azure per automatizzare il tutto  Oppure sfruttare le Virtual Machine/WorkerRole per scalare i Test Agents  http://msdn.microsoft.com/en-us/library/ms182594.aspx
  • 16. demo
  • 18. SQL Profiler  Permette di monitorare l'uso che viene fatto del database  Di conseguenza anche il codice di accesso ai dati  Utile per scoprire chiamate non necessarie  Utile per scoprire chiamate duplicate
  • 19. MiniProfiler  Libreria che permette di profilare la chiamate verso il database, e gli eventi di ASP.NET  MVC, WCF  Entity Framework, Raven DB, Mongo DB,  DbConnection, DbCommand, …  …  Sviluppato dal team di StackOverflow e rilasciato come OpenSource  http://miniprofiler.com/  Nuget: Install-Package MiniProfiler  Possibilità di profilare codice custom
  • 20. demo
  • 22. Cache  Non esiste solo HttpContext.Cache  HttpContext.Items  Per eseguire cache di dati per la richiesta corrente  HttpContext.Application  Per dati che non cambiano durante il ciclo di vita dell'applicazione  Non thread-safe  System.Runtime.Caching  Non ha dipendenze da System.Web  http://msdn.microsoft.com/en-us/ library/system.runtime.caching(v=vs.110).aspx  Deriva dall'Enterprise Library Caching Application Block  Presente da .NET Framework 4.0
  • 23. Ma se più app accedono agli stessi dati?  La cache di ASP.NET diventa un limite  Ci si deve appoggiare ad una cache/servizio esterno alle applicazioni  Alcune soluzioni:  AppFabric  Redis  Memcached  In alcune realtà ci sono server dedicati a gestire solo la cache
  • 24. Windows Server AppFabric  Estende Windows Server in modo da poter genstire e monitorare una cache applicativa centralizzata  Servizio scalabile  Possibilità di gestire anche le Sessioni ASP.NET  Possibilità di taggare gli oggetti in cache  NOTE: non installabile in Windows Server Web Edition
  • 25. Redis  http://redis.io/  In-memory  Key-Value store  Scalabile  (è possibile attivare la persistenza)  Microsoft ha eseguito il porting per Windows  https://github.com/MSOpenTech/redis  Librerie clients disponibili per molti linguaggi  Altamente performante
  • 26. Memcached  http://memcached.org/  Key-Value store  In-memory  Scalabile  Memcached Users  LiveJournal, Wikipedia, Flickr  Bebo, Twitter, Typepad  Yellowbot, Youtube, WordPress.com, ...  Clients disponibili su NuGet:  Esempio: Install-Package EnyimMemcached
  • 27. NOTE:  Attenzione che gli oggetti che inserite in cache devono essere Serializzabili  Non inserite in cache oggetti compilati dinamicamente  Attenzione che gli oggetti non siano dei proxy (es con Lazy Loading)
  • 28. demo
  • 29. Second Level Cache for Entity Framework  https://efcache.codeplex.com/  Implementazione del CachingProvider di Entity Framework  Permette di mantenere in cache il risultato delle query  Viene gestita anche l'invalidazione dei dati in cache
  • 30. Output-cache  Permette di ritornare il rendering di una pagina/view/userControl/partialView senza doverla ricompilare ed eseguire  Possibilità di specificare quali chiavi/metodo utilizzare come chiavi per il riuso  Riduce notevolmente il carico di lavoro del server  Non utilizzarla in pagine con dati che variano di frequente
  • 31. demo
  • 32. CDN – Content Delivery Network  Utilizzare CDN o un secondo dominio per tutti i file statici  I browser hanno un limite per il numero di connessioni/richieste contemporanee verso lo stesso dominio  Includere immagini/file in un secondo dominio permette di aumentare il numero di download contemporanei del browser  Utilizzare librerie su CDN pubbliche aumenta la possibilità che queste siano già presenti nella cache del browser  Enabling CDN for Azure Websites  http://azure.microsoft.com/blog/2014/09/18/enabling-cdn- for-azure-websites/
  • 33. Cache static content  Tramite il web.config è possibile specificare dei parametri per forzare la cache (lato client) di file statici  Immagini  CSS  JavaScript  … <system.webServer> <staticContent> <clientCache cacheControlMaxAge="7.00:00:00" cacheControlMode="UseMaxAge" /> </staticContent> </system.webServer>
  • 34. demo
  • 35. ASP.NET App Suspend  Possibilità di sospendere un'applicazione (invece che terminarla) dopo un tempo di inattività  Da IIS8, Windows Server 2012 R2, Framework 4.5.1  Riduzione dei tempi di avvio  Parametro dell'ApplicationPool
  • 36. Links  Performance Counters for ASP.NET  http://msdn.microsoft.com/en-us/library/vstudio/fxk122b4(v=vs.100).aspx  Building Performance Metrics into ASP.NET MVC Applications  https://www.simple-talk.com/dotnet/performance/building-performance-metrics-into-asp.net-mvc-applications/  Introduzione a Windows Server AppFabric  http://msdn.microsoft.com/en-us/library/hh351318.aspx  Redis on Windows  https://github.com/MSOpenTech/redis  StackExchange.Redis  https://github.com/StackExchange/StackExchange.Redis  Conditional GET  http://optimizeasp.net/conditional-get  Enabling CDN for Azure Websites  http://azure.microsoft.com/blog/2014/09/18/enabling-cdn-for-azure-websites/  Plugin per Fiddler – Stress Stimulus  http://www.stresstimulus.com/  Architettura di Stackoverflow  Video: https://www.youtube.com/watch?v=t6kM2EM6so4  Slide: http://www.slideshare.net/howtoweb/marco-cecconi-stack-overflow-architecture
  • 37. feedback 10 • Materiale: – http://blog.dottor.net/files/xedotnet/20140919_Dottor. AspNetPerformance_code.zip – http://blog.dottor.net/files/xedotnet/20140919_Dottor. AspNetPerformance_slide.zip Email: andrea@dottor.net Website: http://www.dottor.net Blog: http://blog.dottor.net Twitter: http://twitter.com/dottor Contatti