Friday, November 10, 2017

Kestrel error: The connection was closed because the response was not read by the client at the specified minimum data rate.

While running some performance tests on our ASP.NET Core application, after increasing the load to a certain level, we saw the following error messages appear on the server:

The connection was closed because the response was not read by the client at the specified minimum data rate.

This error is related to the Minimum request body data rate specified by Kestrel.

From the documentation:

Kestrel checks every second if data is coming in at the specified rate in bytes/second. If the rate drops below the minimum, the connection is timed out. The grace period is the amount of time that Kestrel gives the client to increase its send rate up to the minimum; the rate is not checked during that time. The grace period helps avoid dropping connections that are initially sending data at a slow rate due to TCP slow-start.

The default minimum rate is 240 bytes/second, with a 5 second grace period.

A minimum rate also applies to the response. The code to set the request limit and the response limit is the same except for having RequestBody or Response in the property and interface names.

The problem was that we were simulating our load from one machine which was not capable of sending enough data at the expected request rate. After scaling out our load tests to multiple test agents on different machines, the problem disappeared…

No comments: