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

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

Post by Guest »

Ich habe Probleme 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 über alle Prozesse hinweg 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 mildern.
Die Anwendungen verwenden EF Core 8.0.11 (nur Lesen). 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 Lautsprechertabelle, die ich oft als Endpunkt aufrufe und die Speichernutzung im Punktspeicher beobachte

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; }
}
Image

Do 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