Высокое использование памяти и исключение OutOfMemoryException в приложениях .NET 8 в IIS с ядром EF [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 Высокое использование памяти и исключение OutOfMemoryException в приложениях .NET 8 в IIS с ядром EF [закрыто]

Сообщение Anonymous »

У меня возникла проблема с управлением памятью в моих приложениях API, размещенных в IIS. На сервере запущено 40 приложений — смесь .NET Framework 4.8 и .NET 8. Проблема в том, что приложения .NET 8 потребляют память и не возвращают ее обратно операционной системе эффективно.
Хотя сборщик мусора (GC) работает, память часто остается выделенной внутри процесса как свободная память, но не возвращается в ОС. Такое поведение приводит к интенсивному использованию памяти процессами, и некоторые приложения в конечном итоге выдают исключение OutOfMemoryException.
Кроме того, перед запуском GC поколение 0 часто вырастает до значительных размеров, иногда достигая сотен мегабайт или даже несколько гигабайт. Чрезмерное использование памяти вызывает серьезные проблемы с производительностью, и мне нужно решение, позволяющее оптимизировать использование памяти, заставить приложения .NET 8 более эффективно освобождать неиспользуемую память и смягчить эти проблемы.
Приложения используют EF Core 8.0.11 (только чтение). DbContext зарегистрирован как ограниченный.
Я тестировал его с новым приложением .NET 8 с одним контроллером

Код: Выделить всё

[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:

Код: Выделить всё

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();
Пакеты:

Код: Выделить всё

net8.0
enable
enable
TestApi
GD0001





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




У меня было 200 элементов в таблице динамиков, я много раз вызывал конечную точку и наблюдал за использованием памяти в точечной памяти.

Код: Выделить всё

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; }
}
Изображение

Делать У вас есть какие-либо рекомендации по улучшению управления памятью или настройке GC для лучшей обработки этого сценария? Или, возможно, какой-то код в моем приложении неправильный.

Подробнее здесь: https://stackoverflow.com/questions/793 ... is-with-ef
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»