OutOfMemoryException in .NET 8-Anwendungen auf IIS mit EF-Kern [geschlossen]C#

Ein Treffpunkt für C#-Programmierer
Guest
 OutOfMemoryException in .NET 8-Anwendungen auf IIS mit EF-Kern [geschlossen]

Post by Guest »

Ich habe ein Problem mit der Speicherverwaltung in meinen auf IIS gehosteten API-Anwendungen. Auf dem Server werden 40 Anwendungen ausgeführt, eine Mischung aus .NET Framework 4.8 und .NET 8. Das Problem besteht darin, dass .NET 8-Anwendungen Speicher verbrauchen und ihn nicht effektiv an das Betriebssystem zurückgeben.
Obwohl der Garbage Collector (GC) läuft, bleibt der Speicher oft innerhalb des Prozesses als freier Speicher zugewiesen, wird aber nicht an das Betriebssystem zurückgegeben. Dieses Verhalten führt zu einer hohen Speichernutzung in allen Prozessen und einige Anwendungen lösen schließlich eine OutOfMemoryException aus.
Außerdem erreicht die Generation 0 vor der Ausführung des GC häufig erhebliche Größen, manchmal sogar Hunderte von Megabyte mehrere Gigabyte. Diese übermäßige Speichernutzung führt zu großen Leistungsproblemen, und ich brauche eine Lösung, um die Speichernutzung zu optimieren, .NET 8-Anwendungen zu zwingen, ungenutzten Speicher effektiver freizugeben, und diese Probleme zu entschärfen.
Die Anwendungen verwenden EF Core 8.0.11 (nur lesend). DbContext ist als bereichsgebunden registriert.
Ich habe es mit einer neuen .NET 8-Anwendung mit einem einzigen Controller getestet

Code: Select all

[Route("/api/test")]
public class TestController(IDbContextFactory dbContextFactory) : ControllerBase
{
[HttpGet]
[Route("GetSpeakers")]
public List GetSpeakers()
{
using var dbContext = dbContextFactory.CreateDbContext();
return dbContext.Speakers.AsNoTracking().OrderBy(s => s.Name).ThenBy(s => s.Id).ToList();
}
}
Program.cs:

Code: Select all

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();
builder.Services
.AddDbContextPool(
options => options.UseSqlServer("Server=localhost;Database=TestDb;Trusted_Connection=True;TrustServerCertificate=True;"))
.AddPooledDbContextFactory(
options => options.UseSqlServer("Server=localhost;Database=TestDb;Trusted_Connection=True;TrustServerCertificate=True;"));

var app = builder.Build();

app.UseRouting();
app.MapControllers();

app.Run();
Pakete:

Code: Select all

net8.0
enable
enable
TestApi
GD0001





runtime; build; native; contentfiles; analyzers; buildtransitive
all




Ich hatte 200 Elemente in der Speakers-Tabelle, ich rufe den Endpunkt viele Male auf und beobachte die Speichernutzung im Punktspeicher.

Code: Select all

public sealed class Speaker
{
public int Id { get; init; }

[StringLength(200)]
public required string Name { get; init; }

[StringLength(4000)]
public string? Bio { get; init; }

[StringLength(1000)]
public string? Website { get; init; }
}
Nach GC:
Image

Haben Sie Empfehlungen zur Verbesserung der Speicherverwaltung oder zur Konfiguration des GC, um dieses Szenario besser zu bewältigen? Oder vielleicht ist ein Code in meiner App falsch.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post