Description
While investigating a large increase in memory usage in one of our services running on .NET 6.0.2, I investigated a memory dump and found an HttpConnectionPool containing a RequestQueue object with a very large number of items (>10k). This was problematic because those items were hanging on to HttpRequestMessage objects which in turn had large header payloads, and ultimately led to large memory consumption for this process.
Interestingly, looking at telemetry, I see no evidence of ever having more than ~500 concurrent outstanding requests in total in the entire process, across all of our connection pools. So it seems odd, to say the least, that a single connection pool would be keeping track of this many queued requests.
I haven't figured out why these requests are in the queue and/or why they aren't draining. We can share the memory dump internally if that would help.
0:000> !do 00000166497AA310
Name: System.Collections.Generic.Queue`1[[System.Net.Http.HttpConnectionPool+RequestQueue`1+QueueItem[[System.Net.Http.Http2Connection, System.Net.Http]], System.Net.Http]]
MethodTable: 00007ff8a9336fe0
EEClass: 00007ff8a8c8b4e0
Tracked Type: false
Size: 40(0x28) bytes
File: D:\SvcFab\_App\CoreServices.IslandGatewayAppType_App42\IslandGatewayPkg.Code.1.53.01880.147-release-217a0a55-net6\System.Private.CoreLib.dll
Fields:
MT Field Offset Type VT Attr Value Name
00007ff8a8ca8238 400209c 8 ...ivate.CoreLib]][] 0 instance 00000166579f3410 _array
00007ff8a7b69480 400209d 10 System.Int32 1 instance 0 _head
00007ff8a7b69480 400209e 14 System.Int32 1 instance 11233 _tail
00007ff8a7b69480 400209f 18 System.Int32 1 instance 11233 _size
00007ff8a7b69480 40020a0 1c System.Int32 1 instance 11842 _version
Reproduction Steps
Unclear
Expected behavior
HttpConnectionPool shouldn't be holding on to queued requests that aren't in flight.
Actual behavior
HttpConnectionPool seems hold on to requests that aren't in flight, leading to excessive memory usage.
Regression?
We did not notice this specifically with .NET Core 3.1, but it is possible it had been there too.
Known Workarounds
N/A
Configuration
- .NET 6.0.2
- Microsoft Windows 10.0.17763
- RuntimeIdentifier: win10-x64
Other information
No response
Description
While investigating a large increase in memory usage in one of our services running on .NET 6.0.2, I investigated a memory dump and found an HttpConnectionPool containing a RequestQueue object with a very large number of items (>10k). This was problematic because those items were hanging on to HttpRequestMessage objects which in turn had large header payloads, and ultimately led to large memory consumption for this process.
Interestingly, looking at telemetry, I see no evidence of ever having more than ~500 concurrent outstanding requests in total in the entire process, across all of our connection pools. So it seems odd, to say the least, that a single connection pool would be keeping track of this many queued requests.
I haven't figured out why these requests are in the queue and/or why they aren't draining. We can share the memory dump internally if that would help.
Reproduction Steps
Unclear
Expected behavior
HttpConnectionPool shouldn't be holding on to queued requests that aren't in flight.
Actual behavior
HttpConnectionPool seems hold on to requests that aren't in flight, leading to excessive memory usage.
Regression?
We did not notice this specifically with .NET Core 3.1, but it is possible it had been there too.
Known Workarounds
N/A
Configuration
Other information
No response