SlideShare a Scribd company logo
1 of 35
Scaling ASP.NET websites
from thousands to millions
of users
Lessons learnt from scaling Web 2.0 apps to millions of
users


Omar AL Zabir
Chief Architect, SaaS Platform, BT
omaralzabir.com
omaralzabir@gmail.com
Twitter.com/omaralzabir


Book “Building Web 2.0 portal using ASP.NET 3.5” from O‟Reilly
How to blow up a website

     Get some super fast fiber broadband connection.
     Run this on couple of quad core desktops:


for (int j = 0; j < 100; j ++)
{
  for (int i = 0; i < 100; i ++)
  {
    var client = new WebClient();
    client.DownloadStringAsync(
        new Uri("http://www.microsoft.com/MISReport.aspx");
  }
  Thread.Sleep(500);
}
Prevent App Level DOS attack

 Application Level DOS attacks are attempts to hit
  your expensive pages too frequently so that you
  have 100% CPU and your site goes down. For ex,
  hitting some expensive Report page continuously.
 You can run out of ASP.NET Threads and stop
  responding completely to any request.
 I‟m not talking about Network level DOS attacks
  like TCP SYN flood or DDOS attacks that hardware
  firewalls can prevent.
 Firewalls don‟t block legitimate requests.
Prevent App level DOS attacks
 Protect only expensive pages. Pages that are unlikely to
  get hit too many times within a short duration.
 Build a HttpModule and hook on OnInit event.
 Store which IP is making how many number of hits in
  last 10 minutes. Store the table in some in-memory
  cache.
 If the threshold has exceeded, stop responding to that
  IP. Call Response.End()
 Solution is here:
  http://tinyurl.com/omarDOS

   IP         Hits in last 10 mins
   128.0.0.1 500
   128.0.0.2 345
ASP.NET ProcessModel Optimization
 ASP.NET ProcessModel Defaults
    maxWorkerThreads = 20
    maxIOThreads = 20
    memoryLimit = 60
 Nowadays, servers are way too
  powerful. You don‟t need to be
  conservative.
 Change default process model
  setting in machine.config to make
  best use of CPU power.
ASP.NET Pipeline Optimization

 Default ASP.NET Pipeline has several components that intercept
  each and every request. Thus they add extra processing overhead
  on every request.
 Multiply the overhead by hundreds of requests per second – you
  get a significant overhead.
ASP.NET Pipeline Optimization
 Remove what you don‟t need.
 If you are using Forms Authentication, SQL Server
  storage, no web.config based role based permission then
  you can remove most of them:
Prevent large ASP.NET cookies on
static content
 Each and every request, even static files, get the
  ASP.NET cookies sent.
 517 bytes of worthless data per request.
 Avg pages have 40 resources. 40 x 517 = 20 KB.
 1M page view = 20 GB of data upload to server.

Cookie:
.DBANON=w3kYczsH8Wvzs6MgryS4JYEF0N-8ZR6aLRSTU9KwVaGa
ydD6WwUHD7X9tN8vBgjgzKf3r3SJHusTYFjU85yYfnunyCeuExcZs8
95JK9Fk1HS68ksGwm3QpxnRZvpDBAfJKEUKee2OTlND0gi43qwwtI
PLeY1; ASP.NET_SessionId=bmnbp155wilotk45gjhitoqg; .DBAUTH
12=2A848A8C200CB0E8E05C6EBA8059A0DBA228FC5F6EDD2940
1C249D237812344C15B3C5C57D6B776037FAA8F14017880E57B
DC14A7963C58B0A0B30229AF0123A6DF56601D814E75525E7DC
A9AD4A0EF200832B39A1F35A5111092F0805B0A8CD3D2FD5E3A
B6176893D86AFBEB68F7EA42BE61E89537DEAA3279F3B576D0C
44BA00B9FA1D9DD3EE985F37B0A5A134ADC0EA9C548D
Prevent ASP.NET cookies on static
content
 Setup a new website in IIS, map to the same code folder.
 Map static.yoursite.com host header to that website.
 Prefix all css, js, image links with http://static.yoursite.com/
 Add a Global.asax‟s EndResponse event on the new website.
 HttpContext context = HttpContext.Current;
 if (context.Request.Url.Host == “static.yoursite.com”)
 {
       List<string> cookiesToClear = new List<string>();
       foreach (string cookieName in context.Request.Cookies)
       {
         HttpCookie cookie =
       context.Request.Cookies[cookieName];
         cookiesToClear.Add(cookie.Name);
       }
       foreach (string name in cookiesToClear)
       {
         HttpCookie cookie = new HttpCookie(name,
       string.Empty);
         cookie.Expires = DateTime.Today.AddYears(-1);
         context.Response.Cookies.Set(cookie);
System.net optimization

 If you are using HttpWebRequest or WebClient or any
  other TCP/IP operation, increase the max connection
  limit.
 Default is 2 per IP.
 WCF service calls are limited by this setting.
 Unless you suspect rogue clients, set some reasonably
  high number on webservers, but moderate number on
  desktop clients.
System.net default setting is
suboptimal




                          Bottleneck




      Max 2 concurrent calls
ASP.NET Profile Provider

 Anonymous Provider creates one anonymous user in
  database on every first hit to Profile object‟s Custom
  properties:




 The SP aspnet_Profile_GetProperties gets called when
  you access Profile object for first time in a request. And
  this SP is slooooooooow!
ASP.NET Profile Provider
 The slow SP that gets fired when you access custom Profile
  properties:


CREATE PROCEDURE [dbo].[    aspnet_Profile_GetProperties]
        @ApplicationName      nvarchar(256), @UserId …
AS
BEGIN

      DECLARE @ApplicationId uniqueidentifier
      SELECT @ApplicationId = NULL
      SELECT @ApplicationId = ApplicationId
             FROM dbo.aspnet_Applications
                 WHERE LOWER(@ApplicationName) = LoweredApplicationName

…
…
…
      IF (@@ROWCOUNT > 0)
      BEGIN
          UPDATE dbo.aspnet_Users
         SET LastActivityDate=@CurrentTimeUtc
         WHERE UserId = @UserId
      END
END
ASP.NET Profile Provider

 The slow SP‟s execution plan
ASP.NET Profile Provider
 Don‟t update LastActivityDate when Profile object is
  loaded. Do it only when Profile object is updated.
 Update once every hour or so. If LastActivityDate <
  DateTime.Now.AddHours(-1) then update. No need to do
  per request or too frequently.
 Hard code the Application ID to avoid one lookup inside
  the SP.
 tinyurl.com/omarGetProp
ASP.NET Membership
   ASP.NET Membership Provider Stored Procs use default
    transaction isolation level, which is Serializable.

   Transaction (Process ID ##) was deadlocked on lock resources
   with another process and has been chosen as the deadlock
   victim. Rerun the transaction.
   Timeout Expired. The Timeout Period Elapsed Prior To
   Completion Of The Operation Or The Server Is Not Responding.


ALTER PROCEDURE [dbo].[aspnet_Profile_GetProperties]
@ApplicationName nvarchar(256),
@UserName nvarchar(256),
@CurrentTimeUtc datetime
AS
BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
ASP.NET Membership Query
 Common queries that brings down hell:
    Select * from aspnet_users where UserName = „blabla‟
    Select * from aspnet_membership where Email =
     “someone@somewhere.com”
 What‟s wrong with these queries?
ASP.NET Membership Queries

 Let's look at the indexes:
 Table: aspnet_users
     Clustered Index = ApplicationID, LoweredUserName
     NonClustered Index = ApplicationID, LastActivityDate
     Primary Key = UserID
 Table: aspnet_membership
     Clustered Index = ApplicationID, LoweredEmail
     NonClustered = UserID
 Table: aspnet_Profile
     Clustered Index = UserID


 DO NOT use Email or UserName fields in WHERE clause. They are not
  part of the index instead LoweredUserName and LoweredEmail fields
  are in conjunction with ApplicationID field. All queries must have
  ApplicationID in the WHERE clause.
A love story

 .NET 3.0 was released, woohoo!
WCF!
Lambda Expressions!!
Linq to SQL!!!
 Upgraded to .NET 3.0, top to bottom.
 Major deployment over the weekend.
 Monday 9 AM, peak traffic.
 No response from site.
~100% on all web servers
Linq to SQL is not suitable for high
volume web applications
 Linq to SQL is not optimized for web application.
 No disconnected entity support.
 Entities are not serializable.
 Linq to sql expressions consume high CPU when
  compiled to SQL.

var query = from widget in dc.Widgets
where widget.ID == id && widget.PageID == pageId
select widget;

var widget = query.SingleOrDefault();
How bad Linq to SQL is?




Source: JD Conley‟s blog
Fixing Linq to SQL
 Convert all queries to Compiled Queries.
 tinyurl.com/omarLINQ
Linq to SQL transaction deadlocks
       Large table, high read and medium write, causes query
        timeouts, high locks, transaction deadlock because of
        SERIALIZATION isolation level.

        Transaction (Process ID ##) was deadlocked on lock resources
        with another process and has been chosen as the deadlock
        victim. Rerun the transaction.
        Timeout Expired. The Timeout Period Elapsed Prior To
        Completion Of The Operation Or The Server Is Not Responding.
using (var db = new YourDataContext2())
{
  db.Connection.Open();
  db.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ
UNCOMMITTED;");

    var user = db.aspnet_Users.First();
    var pages = user.Pages.ToList();
}
Linq to SQL transaction deadlocks
  Connection does not close!
  Bug in Data Context code.
  Solution is to override the Dispose.

class YourDataContext2 : YourDataContext, IDisposable {
 public new void Dispose() {
   if (base.Connection != null)
    if (base.Connection.State != System.Data.ConnectionState.Closed) {
       base.Connection.Close();
       base.Connection.Dispose();
    }
   base.Dispose();
 }
}
Content Delivery Network (CDN)
 CDN cache and deliver content from their servers that
  are closest to users‟ computers. The closer servers are
  to end user, the shorter roundtrip time for every request.
  For ex, Akamai has servers almost every city in the
  world.
 Content from CDN nodes get served faster with lower
  latency than coming from your servers.
 CDN Nodes have better caching and compression
  algorithms.
 CDN nodes can offload your server and network from
  delivering static files. Thus better throughput for
  dynamic content.
Content Delivery Network


              0.7
              sec


 Washington, DC

                       2.2
                       sec

                           Australia
Without CDN




              www.yoursite.com
How CDN works

 static.yoursite.com




                       www.yoursite.com
Two types of CDN

 Static – you upload the files to CDN and
  they give you an URL. E.g.
  yoursite.cachefly.net/logo.gif
 Dynamic – Host your dynamic application
  behind the CDN. For ex, Edgecast and
  Panther Express.
   Very cheap - $0.2/GB
How Dynamic CDN works




                        www.yoursite.com
How Dynamic CDN works




                          www.yoursite.com




                        Static content
                        cached,
                        Compressed
                        automatically
How Dynamic CDN works




                          www.yoursite.com




                        Static content
                        cached,
                        Compressed
                        automatically
13 disasters for production websites
1.    Faulty hard drive supplied by supplier, data corruption within weeks.
2.    Controller malfunctions and corrupts all disks in the same controller.
3.    RAID malfunction.
4.    CPU overheated and burned out.
5.    Firewall went down.
6.    Remote Desktop stopped working after a patch installation.
7.    Remote Desktop max connection exceeded. Cannot login anymore to
      servers.
8.    Database got corrupted while we were moving the production
      database from one server to another over the network.
9.    One developer deleted the production database accidentally while
      doing routine work.
10.   Support crew at hosting service formatted our running production
      server instead of a corrupted server that we asked to format.
11.   Windows got corrupted and was not working until we reinstalled.
12.   DNS goes down. Don’t get domain from GoDaddy.
13.   Internet backbone goes down in different part of the world.

                                 http://tinyurl.com/omar13
Conclusion

 ASP.NET out of the box, does not scale for millions of
  hits.
 Must make the hacks at code, database and
  configuration level to get it to scale.
 That‟s reality for any technology, not ASP.NET specific.

More Related Content

What's hot

Asp.net mvc 基礎
Asp.net mvc 基礎Asp.net mvc 基礎
Asp.net mvc 基礎Gelis Wu
 
KSQL Performance Tuning for Fun and Profit ( Nick Dearden, Confluent) Kafka S...
KSQL Performance Tuning for Fun and Profit ( Nick Dearden, Confluent) Kafka S...KSQL Performance Tuning for Fun and Profit ( Nick Dearden, Confluent) Kafka S...
KSQL Performance Tuning for Fun and Profit ( Nick Dearden, Confluent) Kafka S...confluent
 
Real Time Streaming Architecture at Ford
Real Time Streaming Architecture at FordReal Time Streaming Architecture at Ford
Real Time Streaming Architecture at FordDataWorks Summit
 
Tame the small files problem and optimize data layout for streaming ingestion...
Tame the small files problem and optimize data layout for streaming ingestion...Tame the small files problem and optimize data layout for streaming ingestion...
Tame the small files problem and optimize data layout for streaming ingestion...Flink Forward
 
Northwestern Mutual Journey – Transform BI Space to Cloud
Northwestern Mutual Journey – Transform BI Space to CloudNorthwestern Mutual Journey – Transform BI Space to Cloud
Northwestern Mutual Journey – Transform BI Space to CloudDatabricks
 
The Play Framework at LinkedIn
The Play Framework at LinkedInThe Play Framework at LinkedIn
The Play Framework at LinkedInYevgeniy Brikman
 
알리바바 클라우드 PAI (machine learning Platform for AI)
알리바바 클라우드 PAI (machine learning Platform for AI)알리바바 클라우드 PAI (machine learning Platform for AI)
알리바바 클라우드 PAI (machine learning Platform for AI)Alibaba Cloud Korea
 
Extreme Apache Spark: how in 3 months we created a pipeline that can process ...
Extreme Apache Spark: how in 3 months we created a pipeline that can process ...Extreme Apache Spark: how in 3 months we created a pipeline that can process ...
Extreme Apache Spark: how in 3 months we created a pipeline that can process ...Josef A. Habdank
 
Skills Set the Stage for the Latest Innovations in Workday HCM
Skills Set the Stage for the Latest Innovations in Workday HCMSkills Set the Stage for the Latest Innovations in Workday HCM
Skills Set the Stage for the Latest Innovations in Workday HCMWorkday, Inc.
 
2019-02-20-ddd taiwan-community-iddd-studygroup-1st
2019-02-20-ddd taiwan-community-iddd-studygroup-1st2019-02-20-ddd taiwan-community-iddd-studygroup-1st
2019-02-20-ddd taiwan-community-iddd-studygroup-1stKim Kao
 
Virtual Flink Forward 2020: Netflix Data Mesh: Composable Data Processing - J...
Virtual Flink Forward 2020: Netflix Data Mesh: Composable Data Processing - J...Virtual Flink Forward 2020: Netflix Data Mesh: Composable Data Processing - J...
Virtual Flink Forward 2020: Netflix Data Mesh: Composable Data Processing - J...Flink Forward
 
Optimizing Apache Spark SQL Joins
Optimizing Apache Spark SQL JoinsOptimizing Apache Spark SQL Joins
Optimizing Apache Spark SQL JoinsDatabricks
 
Building robust CDC pipeline with Apache Hudi and Debezium
Building robust CDC pipeline with Apache Hudi and DebeziumBuilding robust CDC pipeline with Apache Hudi and Debezium
Building robust CDC pipeline with Apache Hudi and DebeziumTathastu.ai
 
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...confluent
 
Power of the Log: LSM & Append Only Data Structures
Power of the Log: LSM & Append Only Data StructuresPower of the Log: LSM & Append Only Data Structures
Power of the Log: LSM & Append Only Data Structuresconfluent
 
Microservices Design Patterns
Microservices Design PatternsMicroservices Design Patterns
Microservices Design PatternsHaim Michael
 
Five Connectivity and Security Use Cases for Azure VNets
Five Connectivity and Security Use Cases for Azure VNetsFive Connectivity and Security Use Cases for Azure VNets
Five Connectivity and Security Use Cases for Azure VNetsKhash Nakhostin
 
Etsy Activity Feeds Architecture
Etsy Activity Feeds ArchitectureEtsy Activity Feeds Architecture
Etsy Activity Feeds ArchitectureDan McKinley
 
Best Practices for Streaming IoT Data with MQTT and Apache Kafka
Best Practices for Streaming IoT Data with MQTT and Apache KafkaBest Practices for Streaming IoT Data with MQTT and Apache Kafka
Best Practices for Streaming IoT Data with MQTT and Apache KafkaKai Wähner
 

What's hot (20)

Asp.net mvc 基礎
Asp.net mvc 基礎Asp.net mvc 基礎
Asp.net mvc 基礎
 
KSQL Performance Tuning for Fun and Profit ( Nick Dearden, Confluent) Kafka S...
KSQL Performance Tuning for Fun and Profit ( Nick Dearden, Confluent) Kafka S...KSQL Performance Tuning for Fun and Profit ( Nick Dearden, Confluent) Kafka S...
KSQL Performance Tuning for Fun and Profit ( Nick Dearden, Confluent) Kafka S...
 
Real Time Streaming Architecture at Ford
Real Time Streaming Architecture at FordReal Time Streaming Architecture at Ford
Real Time Streaming Architecture at Ford
 
Tame the small files problem and optimize data layout for streaming ingestion...
Tame the small files problem and optimize data layout for streaming ingestion...Tame the small files problem and optimize data layout for streaming ingestion...
Tame the small files problem and optimize data layout for streaming ingestion...
 
Northwestern Mutual Journey – Transform BI Space to Cloud
Northwestern Mutual Journey – Transform BI Space to CloudNorthwestern Mutual Journey – Transform BI Space to Cloud
Northwestern Mutual Journey – Transform BI Space to Cloud
 
The Play Framework at LinkedIn
The Play Framework at LinkedInThe Play Framework at LinkedIn
The Play Framework at LinkedIn
 
알리바바 클라우드 PAI (machine learning Platform for AI)
알리바바 클라우드 PAI (machine learning Platform for AI)알리바바 클라우드 PAI (machine learning Platform for AI)
알리바바 클라우드 PAI (machine learning Platform for AI)
 
Extreme Apache Spark: how in 3 months we created a pipeline that can process ...
Extreme Apache Spark: how in 3 months we created a pipeline that can process ...Extreme Apache Spark: how in 3 months we created a pipeline that can process ...
Extreme Apache Spark: how in 3 months we created a pipeline that can process ...
 
Skills Set the Stage for the Latest Innovations in Workday HCM
Skills Set the Stage for the Latest Innovations in Workday HCMSkills Set the Stage for the Latest Innovations in Workday HCM
Skills Set the Stage for the Latest Innovations in Workday HCM
 
2019-02-20-ddd taiwan-community-iddd-studygroup-1st
2019-02-20-ddd taiwan-community-iddd-studygroup-1st2019-02-20-ddd taiwan-community-iddd-studygroup-1st
2019-02-20-ddd taiwan-community-iddd-studygroup-1st
 
Virtual Flink Forward 2020: Netflix Data Mesh: Composable Data Processing - J...
Virtual Flink Forward 2020: Netflix Data Mesh: Composable Data Processing - J...Virtual Flink Forward 2020: Netflix Data Mesh: Composable Data Processing - J...
Virtual Flink Forward 2020: Netflix Data Mesh: Composable Data Processing - J...
 
Optimizing Apache Spark SQL Joins
Optimizing Apache Spark SQL JoinsOptimizing Apache Spark SQL Joins
Optimizing Apache Spark SQL Joins
 
Building robust CDC pipeline with Apache Hudi and Debezium
Building robust CDC pipeline with Apache Hudi and DebeziumBuilding robust CDC pipeline with Apache Hudi and Debezium
Building robust CDC pipeline with Apache Hudi and Debezium
 
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
The Migration to Event-Driven Microservices (Adam Bellemare, Flipp) Kafka Sum...
 
Power of the Log: LSM & Append Only Data Structures
Power of the Log: LSM & Append Only Data StructuresPower of the Log: LSM & Append Only Data Structures
Power of the Log: LSM & Append Only Data Structures
 
Introduction to Apache Beam
Introduction to Apache BeamIntroduction to Apache Beam
Introduction to Apache Beam
 
Microservices Design Patterns
Microservices Design PatternsMicroservices Design Patterns
Microservices Design Patterns
 
Five Connectivity and Security Use Cases for Azure VNets
Five Connectivity and Security Use Cases for Azure VNetsFive Connectivity and Security Use Cases for Azure VNets
Five Connectivity and Security Use Cases for Azure VNets
 
Etsy Activity Feeds Architecture
Etsy Activity Feeds ArchitectureEtsy Activity Feeds Architecture
Etsy Activity Feeds Architecture
 
Best Practices for Streaming IoT Data with MQTT and Apache Kafka
Best Practices for Streaming IoT Data with MQTT and Apache KafkaBest Practices for Streaming IoT Data with MQTT and Apache Kafka
Best Practices for Streaming IoT Data with MQTT and Apache Kafka
 

Similar to Scaling asp.net websites to millions of users

10 performance and scalability secrets of ASP.NET websites
10 performance and scalability secrets of ASP.NET websites10 performance and scalability secrets of ASP.NET websites
10 performance and scalability secrets of ASP.NET websitesoazabir
 
Play Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaPlay Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaYevgeniy Brikman
 
ASP.NET MVC Performance
ASP.NET MVC PerformanceASP.NET MVC Performance
ASP.NET MVC Performancerudib
 
How to build a Citrix infrastructure on AWS
How to build a Citrix infrastructure on AWSHow to build a Citrix infrastructure on AWS
How to build a Citrix infrastructure on AWSDenis Gundarev
 
Clug 2011 March web server optimisation
Clug 2011 March  web server optimisationClug 2011 March  web server optimisation
Clug 2011 March web server optimisationgrooverdan
 
Introduce about Nodejs - duyetdev.com
Introduce about Nodejs - duyetdev.comIntroduce about Nodejs - duyetdev.com
Introduce about Nodejs - duyetdev.comVan-Duyet Le
 
Apache Samza 1.0 - What's New, What's Next
Apache Samza 1.0 - What's New, What's NextApache Samza 1.0 - What's New, What's Next
Apache Samza 1.0 - What's New, What's NextPrateek Maheshwari
 
Sherlock Homepage (Maarten Balliauw)
Sherlock Homepage (Maarten Balliauw)Sherlock Homepage (Maarten Balliauw)
Sherlock Homepage (Maarten Balliauw)Visug
 
Sherlock Homepage - A detective story about running large web services (VISUG...
Sherlock Homepage - A detective story about running large web services (VISUG...Sherlock Homepage - A detective story about running large web services (VISUG...
Sherlock Homepage - A detective story about running large web services (VISUG...Maarten Balliauw
 
Sherlock Homepage - A detective story about running large web services - WebN...
Sherlock Homepage - A detective story about running large web services - WebN...Sherlock Homepage - A detective story about running large web services - WebN...
Sherlock Homepage - A detective story about running large web services - WebN...Maarten Balliauw
 
Bt0083 server side programing
Bt0083 server side programing Bt0083 server side programing
Bt0083 server side programing Techglyphs
 
6 tips for improving ruby performance
6 tips for improving ruby performance6 tips for improving ruby performance
6 tips for improving ruby performanceEngine Yard
 
Sherlock Homepage - A detective story about running large web services - NDC ...
Sherlock Homepage - A detective story about running large web services - NDC ...Sherlock Homepage - A detective story about running large web services - NDC ...
Sherlock Homepage - A detective story about running large web services - NDC ...Maarten Balliauw
 
C sharp and asp.net interview questions
C sharp and asp.net interview questionsC sharp and asp.net interview questions
C sharp and asp.net interview questionsAkhil Mittal
 
Deploying windows containers with kubernetes
Deploying windows containers with kubernetesDeploying windows containers with kubernetes
Deploying windows containers with kubernetesBen Hall
 

Similar to Scaling asp.net websites to millions of users (20)

10 performance and scalability secrets of ASP.NET websites
10 performance and scalability secrets of ASP.NET websites10 performance and scalability secrets of ASP.NET websites
10 performance and scalability secrets of ASP.NET websites
 
Play Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaPlay Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and Scala
 
PPT
PPTPPT
PPT
 
ASP.NET MVC Performance
ASP.NET MVC PerformanceASP.NET MVC Performance
ASP.NET MVC Performance
 
SQL Injection
SQL InjectionSQL Injection
SQL Injection
 
How to build a Citrix infrastructure on AWS
How to build a Citrix infrastructure on AWSHow to build a Citrix infrastructure on AWS
How to build a Citrix infrastructure on AWS
 
Practical OData
Practical ODataPractical OData
Practical OData
 
Clug 2011 March web server optimisation
Clug 2011 March  web server optimisationClug 2011 March  web server optimisation
Clug 2011 March web server optimisation
 
Web Security
Web SecurityWeb Security
Web Security
 
Introduce about Nodejs - duyetdev.com
Introduce about Nodejs - duyetdev.comIntroduce about Nodejs - duyetdev.com
Introduce about Nodejs - duyetdev.com
 
Apache Samza 1.0 - What's New, What's Next
Apache Samza 1.0 - What's New, What's NextApache Samza 1.0 - What's New, What's Next
Apache Samza 1.0 - What's New, What's Next
 
Sherlock Homepage (Maarten Balliauw)
Sherlock Homepage (Maarten Balliauw)Sherlock Homepage (Maarten Balliauw)
Sherlock Homepage (Maarten Balliauw)
 
Sherlock Homepage - A detective story about running large web services (VISUG...
Sherlock Homepage - A detective story about running large web services (VISUG...Sherlock Homepage - A detective story about running large web services (VISUG...
Sherlock Homepage - A detective story about running large web services (VISUG...
 
AD102 - Break out of the Box
AD102 - Break out of the BoxAD102 - Break out of the Box
AD102 - Break out of the Box
 
Sherlock Homepage - A detective story about running large web services - WebN...
Sherlock Homepage - A detective story about running large web services - WebN...Sherlock Homepage - A detective story about running large web services - WebN...
Sherlock Homepage - A detective story about running large web services - WebN...
 
Bt0083 server side programing
Bt0083 server side programing Bt0083 server side programing
Bt0083 server side programing
 
6 tips for improving ruby performance
6 tips for improving ruby performance6 tips for improving ruby performance
6 tips for improving ruby performance
 
Sherlock Homepage - A detective story about running large web services - NDC ...
Sherlock Homepage - A detective story about running large web services - NDC ...Sherlock Homepage - A detective story about running large web services - NDC ...
Sherlock Homepage - A detective story about running large web services - NDC ...
 
C sharp and asp.net interview questions
C sharp and asp.net interview questionsC sharp and asp.net interview questions
C sharp and asp.net interview questions
 
Deploying windows containers with kubernetes
Deploying windows containers with kubernetesDeploying windows containers with kubernetes
Deploying windows containers with kubernetes
 

Recently uploaded

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 

Recently uploaded (20)

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 

Scaling asp.net websites to millions of users

  • 1. Scaling ASP.NET websites from thousands to millions of users Lessons learnt from scaling Web 2.0 apps to millions of users Omar AL Zabir Chief Architect, SaaS Platform, BT omaralzabir.com omaralzabir@gmail.com Twitter.com/omaralzabir Book “Building Web 2.0 portal using ASP.NET 3.5” from O‟Reilly
  • 2. How to blow up a website  Get some super fast fiber broadband connection.  Run this on couple of quad core desktops: for (int j = 0; j < 100; j ++) { for (int i = 0; i < 100; i ++) { var client = new WebClient(); client.DownloadStringAsync( new Uri("http://www.microsoft.com/MISReport.aspx"); } Thread.Sleep(500); }
  • 3. Prevent App Level DOS attack  Application Level DOS attacks are attempts to hit your expensive pages too frequently so that you have 100% CPU and your site goes down. For ex, hitting some expensive Report page continuously.  You can run out of ASP.NET Threads and stop responding completely to any request.  I‟m not talking about Network level DOS attacks like TCP SYN flood or DDOS attacks that hardware firewalls can prevent.  Firewalls don‟t block legitimate requests.
  • 4. Prevent App level DOS attacks  Protect only expensive pages. Pages that are unlikely to get hit too many times within a short duration.  Build a HttpModule and hook on OnInit event.  Store which IP is making how many number of hits in last 10 minutes. Store the table in some in-memory cache.  If the threshold has exceeded, stop responding to that IP. Call Response.End()  Solution is here: http://tinyurl.com/omarDOS IP Hits in last 10 mins 128.0.0.1 500 128.0.0.2 345
  • 5. ASP.NET ProcessModel Optimization  ASP.NET ProcessModel Defaults  maxWorkerThreads = 20  maxIOThreads = 20  memoryLimit = 60  Nowadays, servers are way too powerful. You don‟t need to be conservative.  Change default process model setting in machine.config to make best use of CPU power.
  • 6. ASP.NET Pipeline Optimization  Default ASP.NET Pipeline has several components that intercept each and every request. Thus they add extra processing overhead on every request.  Multiply the overhead by hundreds of requests per second – you get a significant overhead.
  • 7. ASP.NET Pipeline Optimization  Remove what you don‟t need.  If you are using Forms Authentication, SQL Server storage, no web.config based role based permission then you can remove most of them:
  • 8. Prevent large ASP.NET cookies on static content  Each and every request, even static files, get the ASP.NET cookies sent.  517 bytes of worthless data per request.  Avg pages have 40 resources. 40 x 517 = 20 KB.  1M page view = 20 GB of data upload to server. Cookie: .DBANON=w3kYczsH8Wvzs6MgryS4JYEF0N-8ZR6aLRSTU9KwVaGa ydD6WwUHD7X9tN8vBgjgzKf3r3SJHusTYFjU85yYfnunyCeuExcZs8 95JK9Fk1HS68ksGwm3QpxnRZvpDBAfJKEUKee2OTlND0gi43qwwtI PLeY1; ASP.NET_SessionId=bmnbp155wilotk45gjhitoqg; .DBAUTH 12=2A848A8C200CB0E8E05C6EBA8059A0DBA228FC5F6EDD2940 1C249D237812344C15B3C5C57D6B776037FAA8F14017880E57B DC14A7963C58B0A0B30229AF0123A6DF56601D814E75525E7DC A9AD4A0EF200832B39A1F35A5111092F0805B0A8CD3D2FD5E3A B6176893D86AFBEB68F7EA42BE61E89537DEAA3279F3B576D0C 44BA00B9FA1D9DD3EE985F37B0A5A134ADC0EA9C548D
  • 9. Prevent ASP.NET cookies on static content  Setup a new website in IIS, map to the same code folder.  Map static.yoursite.com host header to that website.  Prefix all css, js, image links with http://static.yoursite.com/  Add a Global.asax‟s EndResponse event on the new website. HttpContext context = HttpContext.Current; if (context.Request.Url.Host == “static.yoursite.com”) { List<string> cookiesToClear = new List<string>(); foreach (string cookieName in context.Request.Cookies) { HttpCookie cookie = context.Request.Cookies[cookieName]; cookiesToClear.Add(cookie.Name); } foreach (string name in cookiesToClear) { HttpCookie cookie = new HttpCookie(name, string.Empty); cookie.Expires = DateTime.Today.AddYears(-1); context.Response.Cookies.Set(cookie);
  • 10. System.net optimization  If you are using HttpWebRequest or WebClient or any other TCP/IP operation, increase the max connection limit.  Default is 2 per IP.  WCF service calls are limited by this setting.  Unless you suspect rogue clients, set some reasonably high number on webservers, but moderate number on desktop clients.
  • 11. System.net default setting is suboptimal Bottleneck Max 2 concurrent calls
  • 12. ASP.NET Profile Provider  Anonymous Provider creates one anonymous user in database on every first hit to Profile object‟s Custom properties:  The SP aspnet_Profile_GetProperties gets called when you access Profile object for first time in a request. And this SP is slooooooooow!
  • 13. ASP.NET Profile Provider  The slow SP that gets fired when you access custom Profile properties: CREATE PROCEDURE [dbo].[ aspnet_Profile_GetProperties] @ApplicationName nvarchar(256), @UserId … AS BEGIN DECLARE @ApplicationId uniqueidentifier SELECT @ApplicationId = NULL SELECT @ApplicationId = ApplicationId FROM dbo.aspnet_Applications WHERE LOWER(@ApplicationName) = LoweredApplicationName … … … IF (@@ROWCOUNT > 0) BEGIN UPDATE dbo.aspnet_Users SET LastActivityDate=@CurrentTimeUtc WHERE UserId = @UserId END END
  • 14. ASP.NET Profile Provider  The slow SP‟s execution plan
  • 15. ASP.NET Profile Provider  Don‟t update LastActivityDate when Profile object is loaded. Do it only when Profile object is updated.  Update once every hour or so. If LastActivityDate < DateTime.Now.AddHours(-1) then update. No need to do per request or too frequently.  Hard code the Application ID to avoid one lookup inside the SP.  tinyurl.com/omarGetProp
  • 16. ASP.NET Membership  ASP.NET Membership Provider Stored Procs use default transaction isolation level, which is Serializable. Transaction (Process ID ##) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. Timeout Expired. The Timeout Period Elapsed Prior To Completion Of The Operation Or The Server Is Not Responding. ALTER PROCEDURE [dbo].[aspnet_Profile_GetProperties] @ApplicationName nvarchar(256), @UserName nvarchar(256), @CurrentTimeUtc datetime AS BEGIN SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  • 17. ASP.NET Membership Query  Common queries that brings down hell:  Select * from aspnet_users where UserName = „blabla‟  Select * from aspnet_membership where Email = “someone@somewhere.com”  What‟s wrong with these queries?
  • 18. ASP.NET Membership Queries  Let's look at the indexes:  Table: aspnet_users  Clustered Index = ApplicationID, LoweredUserName  NonClustered Index = ApplicationID, LastActivityDate  Primary Key = UserID  Table: aspnet_membership  Clustered Index = ApplicationID, LoweredEmail  NonClustered = UserID  Table: aspnet_Profile  Clustered Index = UserID  DO NOT use Email or UserName fields in WHERE clause. They are not part of the index instead LoweredUserName and LoweredEmail fields are in conjunction with ApplicationID field. All queries must have ApplicationID in the WHERE clause.
  • 19. A love story  .NET 3.0 was released, woohoo! WCF! Lambda Expressions!! Linq to SQL!!!  Upgraded to .NET 3.0, top to bottom.  Major deployment over the weekend.  Monday 9 AM, peak traffic.  No response from site.
  • 20. ~100% on all web servers
  • 21. Linq to SQL is not suitable for high volume web applications  Linq to SQL is not optimized for web application.  No disconnected entity support.  Entities are not serializable.  Linq to sql expressions consume high CPU when compiled to SQL. var query = from widget in dc.Widgets where widget.ID == id && widget.PageID == pageId select widget; var widget = query.SingleOrDefault();
  • 22. How bad Linq to SQL is? Source: JD Conley‟s blog
  • 23. Fixing Linq to SQL  Convert all queries to Compiled Queries.  tinyurl.com/omarLINQ
  • 24. Linq to SQL transaction deadlocks  Large table, high read and medium write, causes query timeouts, high locks, transaction deadlock because of SERIALIZATION isolation level. Transaction (Process ID ##) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. Timeout Expired. The Timeout Period Elapsed Prior To Completion Of The Operation Or The Server Is Not Responding. using (var db = new YourDataContext2()) { db.Connection.Open(); db.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); var user = db.aspnet_Users.First(); var pages = user.Pages.ToList(); }
  • 25. Linq to SQL transaction deadlocks  Connection does not close!  Bug in Data Context code.  Solution is to override the Dispose. class YourDataContext2 : YourDataContext, IDisposable { public new void Dispose() { if (base.Connection != null) if (base.Connection.State != System.Data.ConnectionState.Closed) { base.Connection.Close(); base.Connection.Dispose(); } base.Dispose(); } }
  • 26. Content Delivery Network (CDN)  CDN cache and deliver content from their servers that are closest to users‟ computers. The closer servers are to end user, the shorter roundtrip time for every request. For ex, Akamai has servers almost every city in the world.  Content from CDN nodes get served faster with lower latency than coming from your servers.  CDN Nodes have better caching and compression algorithms.  CDN nodes can offload your server and network from delivering static files. Thus better throughput for dynamic content.
  • 27. Content Delivery Network 0.7 sec Washington, DC 2.2 sec Australia
  • 28. Without CDN www.yoursite.com
  • 29. How CDN works static.yoursite.com www.yoursite.com
  • 30. Two types of CDN  Static – you upload the files to CDN and they give you an URL. E.g. yoursite.cachefly.net/logo.gif  Dynamic – Host your dynamic application behind the CDN. For ex, Edgecast and Panther Express.  Very cheap - $0.2/GB
  • 31. How Dynamic CDN works www.yoursite.com
  • 32. How Dynamic CDN works www.yoursite.com Static content cached, Compressed automatically
  • 33. How Dynamic CDN works www.yoursite.com Static content cached, Compressed automatically
  • 34. 13 disasters for production websites 1. Faulty hard drive supplied by supplier, data corruption within weeks. 2. Controller malfunctions and corrupts all disks in the same controller. 3. RAID malfunction. 4. CPU overheated and burned out. 5. Firewall went down. 6. Remote Desktop stopped working after a patch installation. 7. Remote Desktop max connection exceeded. Cannot login anymore to servers. 8. Database got corrupted while we were moving the production database from one server to another over the network. 9. One developer deleted the production database accidentally while doing routine work. 10. Support crew at hosting service formatted our running production server instead of a corrupted server that we asked to format. 11. Windows got corrupted and was not working until we reinstalled. 12. DNS goes down. Don’t get domain from GoDaddy. 13. Internet backbone goes down in different part of the world. http://tinyurl.com/omar13
  • 35. Conclusion  ASP.NET out of the box, does not scale for millions of hits.  Must make the hacks at code, database and configuration level to get it to scale.  That‟s reality for any technology, not ASP.NET specific.