-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Description
Description
The use of SslStream in dotnet9 leads to a significant increase in memory consumption under Linux and results in OOM.
Reproduction Steps
I have written a small test application that creates and disposes SslStreams. The code leads to following memory increase when executed multiple times.
void StartTest(int testRunCount)
{
for (int i = 0; i < testRunCount; i++)
{
var server = RunServerUnitMessageOrTimeout();
var client = RunClientAndSendMessageToServer();
Task.WaitAll(server, client);
}
}
async Task RunServerUnitMessageOrTimeout()
{
var listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, 9999));
listener.Start();
using var client = await listener.AcceptTcpClientAsync();
using var networkStream = client.GetStream();
using var secureStream = new SslStream(networkStream);
await secureStream.AuthenticateAsServerAsync(cert, false, false);
using var reader = new StreamReader(secureStream);
var line = await reader.ReadLineAsync();
listener.Stop();
}
async Task RunClientAndSendMessageToServer()
{
using var client = new TcpClient();
await client.ConnectAsync(new IPEndPoint(IPAddress.Loopback, 9999));
using var networkStream = client.GetStream();
using var secureStream = new SslStream(networkStream);
await secureStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions
{
TargetHost = "localhost",
RemoteCertificateValidationCallback = (object sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors) => true
});
using var writer = new StreamWriter(secureStream);
await writer.WriteLineAsync("This is a test");
}
This is the output of the RAM after every 1000 runs
2024-12-18 07:35:02 Current memory usage: 60.76MB
2024-12-18 07:35:06 Current memory usage: 86.65MB
2024-12-18 07:35:07 Current memory usage: 87.02MB
2024-12-18 07:35:11 Current memory usage: 105.05MB
2024-12-18 07:35:12 Current memory usage: 105.06MB
2024-12-18 07:35:16 Current memory usage: 117.52MB
2024-12-18 07:35:17 Current memory usage: 117.54MB
2024-12-18 07:35:21 Current memory usage: 129.53MB
2024-12-18 07:35:22 Current memory usage: 129.53MB
2024-12-18 07:35:26 Current memory usage: 142.07MB
2024-12-18 07:35:27 Current memory usage: 142.07MB
2024-12-18 07:35:31 Current memory usage: 155.43MB
2024-12-18 07:35:32 Current memory usage: 155.43MB
2024-12-18 07:35:35 Current memory usage: 167.96MB
2024-12-18 07:35:36 Current memory usage: 167.95MB
2024-12-18 07:35:40 Current memory usage: 181.02MB
2024-12-18 07:35:41 Current memory usage: 181.04MB
2024-12-18 07:35:45 Current memory usage: 194.40MB
Expected behavior
Since all resources are cleaned up properly, it is expected that the memory usage does not increase.
Actual behavior
Massive increase in memory usage under Linux
Regression?
With dotnet 6 the memory consumption is stable:
Current memory usage: 45.82MB
Current memory usage: 50.00MB
Current memory usage: 50.00MB
Current memory usage: 50.00MB
Current memory usage: 50.00MB
Current memory usage: 50.58MB
Current memory usage: 50.58MB
With dotnet8, memory consumption increases much more slowly then dotnet9.
Known Workarounds
No response
Configuration
- dotnet version: 9.0.0
- os: linux default docker image:
mcr.microsoft.com/dotnet/runtime:9.0
- architecture: x64
The problem is not reproducible under Windows.
Changing the Linux distribution (e.g. alpine) makes no difference
Other information
Entire test application:
SslStreamMemoryLeak.zip