ServiceStack SelfHosted Performance Boost

ServiceStack is doing a great work in the REST API world with the plus given by mono support.

The basic way of Self Hosting uses the .NET HttpListener to power up a single thread serving requests, this quickly show up as the performance blottle neck (Basic Self Hosted).

Digging a little I found the extended (concurrent model on self hosted) that uses a thread pool to increase the overall performance.
(Thread Pool Self Hosted).

From my little experience with async in C#, I had the idea that maybe the awesome “smartthreadpool” library can be used to handle the async part of the self hosted application, so I give it a try.

The test bed, the ultra simple Hello service, with a little artificial work. (hard work I think).

 [Route("/sayHello/{Name}")]
    public class HelloRequest : IReturn<HelloResponse> {
        public string Name { get; set; }
    }

    public class HelloResponse {
        public string Message { get; set; }
        public string Status { get; set; }
    }

    public class HelloService : Service, IGet<HelloRequest> {
        private static Random r = new Random();

        public object Get(HelloRequest request) {
            var timer = new Stopwatch();

            timer.Start();

            while(timer.ElapsedMilliseconds < 100) 
                Thread.SpinWait(1000000);

            timer.Stop();

            return new HelloResponse() {
                                           Message = "hello " + request.Name,
                                           Status = "OK -> " + timer.ElapsedMilliseconds
                                       };
        }
    }

The use of the “SpinWait” aim to simulate real scenarios where work is actually performed, and the thread is not available until finished (unlike the Thread.Sleep() that release the thread to be used).

The test machine has the following specs.

Core i5 3570K
8GB DDR3 1866MHZ @ 1666MHZ
ASUS P8Z77 VLK
OCZ VERTEX 4 128GB
WIN 8 x64

the load test is performed using JMeter, all the applications tested were build on release mode with visual studio 2012, targeting .NET 3.5 and monitored by sysinternal process explorer.

First Scenario: AppHostHttpListenerBase

JMeter Results for AppHostHttpListenerBase

 

 

Second Scenario: AppHostHttpListenerLongRunningBase

 

 

Third Scenario: SmartThreadPool AppHostHttpListener (better response time average)

 

 

Fourth Scenario: SmarthThreadPool Build targeting Framework 4 (better response time and better throughput)

 

The Others, not really impressive but can be used.  Task Library and ThreadPool.

Task Library

 

ThreadPool

 

the full code of this test  CODE

 

About these ads

One thought on “ServiceStack SelfHosted Performance Boost

  1. Pingback: My Latest Shared Bookmarksfboiton's blog | fboiton's blog

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s