ASP.NET Core – Exceeds 1.15 Million request/s, 12.6 Gbps

See update For ASP.NET Core 2.2: ASP.NET Core: Saturating 10GbE at 7+ million request/s

Congratulations to ASP.NET Core and .NET Core teams and the Open Source .NET community for quite a milestone in performance!

2300% More Requests Served Per Second

1.15 Million represents a 2300% gain from ASP.NET 4.6!

Why 2 decimal places? I’m not sure why Scott Hunter chose that level of precision, but to me it’s quite significant…

The third decimal place 0.05 Million (e.g. 50,000) is around the total number of requests per second that ASP.NET 4.6 could perform of the same type, on the same hardware – as shown in the below graph:

ASP.NET 4.6 and NodeJs are bottom left. You can see the rapid strides in performance the leaner, more agile and componentized stack has taken (blue Windows, orange Linux) in just a few short months.

ASP.NET Core and .NET Core come with the great advantage of only including the libraries and functions you explicitly want to use in your application rather than bringing in the entire framework. So you only “pay”, programmatically speaking, for what you use.

This ethos is being repeated around Microsoft: Nano Server (Windows Server 2016) is so slim it only has 21 processes running – including your application! In a similar vein, Azure has ‘to the nearest minute’ billing on VMs.

This also allows easy side by side installation of different versions of the .NET framework on the same machine without version collision – or the fear of “What will happen to all the other apps on the same machine when I upgrade the framework for this app”. While .NET has always had a great version compatibility story, the upgrade fear is real.

More than 12.6 Gbps of Throughput

1,150,000+ requests served per second is for small fine-grained requests; but how does it perform for serving larger requests e.g. video, images, js, fonts and css files?

Running on an Azure G4 VM you can see we can hit 12.6 Gbps while only using 36% CPU. This is around the network cap for this type of machine – or we’d be going even faster!

Why is this important?

At a business level it means we can do more with less – which directly effects our bottom line.

I often hear the defeatist argument that performance like this doesn’t matter because (eg) “my database is slow”. That’s like saying I might as well use php in interpreted mode because “my database is slow” (has any one ever said that? I hope not). There is so much more potential, and it’s not just about raw throughput!

Looking at the simplistic case; I’d hope you aren’t serving your assets from a slow database… If you are, maybe you should reexamine your architecture choices or at least revisit what you are doing in the caching space. Everyone caches, even your CPU.

Moving to the cloud with on-demand scaling will also save you money. Or you can spend the same amount of money – but do a lot more.

Customer Delight

If you can leverage it, the question you should ask is whether the hugely improved response times of ASP.NET Core will delight your users.

Steve Desmond in his post Performance is Paramount; saw his page response times from upgrading from Beta8 (Oct 2015) to RC1 (Nov 2015) decrease from 20ms to 4ms.

Upgraded stevedesmond.ca to @aspnet 5 RC (from b8), response time went from 20ms to 4ms. Not a typo. @DamianEdwards @shanselman @jongalloway — Steve Desmond (@stevedesmond_ca) November 22, 2015

Bear in mind ASP.NET Core beta8 was already 800% faster than ASP.NET 4.6, which itself was pretty nippy compared to many web frameworks and languages. RC2 is shaping up to be even faster – throw in some caching and you’ll be going back in time! 😉

Microsoft, Open Source & the .NET Foundation

Parts of ASP.NET have been open source awhile and the .NET source has been viewable also, but at the Build 2014 conference Microsoft announced the creation of the .NET Foundation as an independent forum to provide stewardship and to foster open development and collaboration for the growing collection of open source technologies of .NET.

In November 2014, they then announced that .NET Core was Open Source under the .NET Foundation and accepting contributions. It rapidly became cross-platform, running on Windows, Mac and Linux – with Mono and Xamarin providing even wider platform support – including Android and iOS.

Is open source good for .NET? Has it changed anything? As an example of what is different is myself, Ben Adams at Illyriad Games and Stephen Halter at Microsoft jostling for the top spot on contributions to Kestrel, ASP.NET’s Web Server. This wouldn’t have happened previously!

Contributing to .NET OSS

We like open source because it gives us the best of both worlds: a great diversity of minds from all around the world with wider viewpoints than our own – including specialists in their field – with the ability to contribute if we need changes or fixes to suit our more particular needs.

Generally the community will build (and often improve) upon our contribution; enriching it for better code for all. Much like life; diversity is a good thing!

It also has the fringe bonus that Microsoft checks and reviews our code and – once it gets into a release build – they offer an Enterprise support agreement for it if anything goes wrong 😉.

Why Is a High Performance ASP.NET Important to Illyriad Games?

We are building Age Of Ascent – an ultra-MMO; a new scale of game. Born in the cloud, it enables tens of thousands of pilots to be in the same battle; and millions of players to be in the same single-sharded universe – which can be accessed anywhere at any time, on any device.

It has real-time twitch combat, and yet is playable in a browser using HTML5 and WebGL.

We are live for 30 mins - Pilot, will you achieve Space dogfighting glory! Go, go, go!https://t.co/75gA6i4Gjs https://t.co/8uiQ4HbIif — Age of Ascent (@ageofascent) February 6, 2016

So we need a high performance, high throughput, low latency web server. This might be a bit of a niche case and the world of a high speed real-time web may not be applicable to everyone.

However, this is not our only use case, and not the only reason we contribute back to improve ASP.NET and .NET Core’s performance. Age of Ascent is a lot more than a twitch space combat game.

Our other main component is likely more applicable to a wider audience.

Micro-services

Age Of Ascent is composed of multiple independent, dynamically scalable, stateful and stateless micro-services hosted and orchestrated with Service Fabric on Microsoft Azure. Service Fabric allows us to have a high density micro-service cluster which both scales to unexpected demands and grows as we grow.

Our communication mechanism between these micro-services is entirely ASP.NET Core based on David Zhao’s excellent Service Fabric ASP.NET Core Hosting example.

This means our entire system’s responsiveness and performance hinges on the performance of ASP.NET Core. This is why it is important; and why we strive for performance. The more we can do; the richer an experience we can create for our players – at a lower cost.

Its important also because the days of Moore’s law performance improvements for single CPU cores are long gone; yet we also need to do more, and we are going big – really big. We need to get smarter, more efficient, cut the unnecessary, and scale across cores, sockets, containers and clusters of machines better.

.NET Core and ASP.NET Core are really shaping up to be the frameworks that we not only want, but also need.

Congratulations to the team!

And some of the team who worked on performance. pic.twitter.com/o0aoTlY2GF — Scott Hunter (@coolcsh) February 18, 2016

And thank you for the nod in absentia 😁

Ben (Adams) CTO & Co-founder Illyriad Games

Addendum