How to configure concurrency in .NET Core Web API?

ASP.NET Core application concurrency is handled by its web server. For example:

Kestrel

var host = new WebHostBuilder()
    .UseKestrel(options => options.ThreadCount = 8)

It is not recommended to set Kestrel thread count to a large value like 1K due to Kestrel async-based implementation.

More info: Is Kestrel using a single thread for processing requests like Node.js?

New Limits property has been introduced in ASP.NET Core 2.0 Preview 2.

You can now add limits for the following:

  1. Maximum Client Connections
  2. Maximum Request Body Size
  3. Maximum Request Body Data Rate

For example:

.UseKestrel(options =>
{
    options.Limits.MaxConcurrentConnections = 100;
}

IIS

When Kestrel runs behind a reverse proxy you could tune the proxy itself. For example, you could configure IIS application pool in web.config or in aspnet.config:

<configuration>
  <system.web>
    <applicationPool
        maxConcurrentRequestsPerCPU="5000"
        maxConcurrentThreadsPerCPU="0"
        requestQueueLimit="5000" />
  </system.web>
</configuration>

Of course Nginx and Apache have their own concurrency settings.

Leave a Comment