es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Alto consumo de CPU en Add-SaveChangesAsync.

Estamos experimentando hilos descontrolados bajo un aumento en el uso de nuestro sistema. La solución es .Net Framework 6; EF 6.4.4, ASP.NET Web API.

En el filtro de acción, realizamos un registro de la solicitud:

ActionFilter:

public async Task<httpresponsemessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<><httpresponsemessage>> continuation)
{
    //....

    _logsRepository.AddAsync(logRecord);
}

LogsRepository:

public class LogsRepository : ILogsRepository
{
    private readonly IContext _context;

    public LogsRepository(IContext context)
    {
        _context = context;
    }

    public async Task AddAsync(LogModel log)
    {
        context.Logs.Add(logsRepositoryModel);
        await context.SaveChangesAsync();
    }
}

Después de algún tiempo, la CPU aumenta y se mantiene en números altos con hilos bloqueados. Todos los hilos congelados tienen la siguiente traza de pila:

mscorlib.dll!System.Collections.Generic.Dictionary2.Insert+0xb9
EntityFramework.dll!System.Data.Entity.Core.Objects.Internal.EntityWrapperFactory.WrapEntityUsingStateManagerGettingEntry+0x1c0
EntityFramework.dll!System.Data.Entity.Core.Objects.ObjectContext.AddObject+0x8f
EntityFramework.dll!System.Data.Entity.Internal.Linq.InternalSet
1.ActOnSet+0xd0
EntityFramework.dll!System.Data.Entity.Internal.Linq.InternalSet1.Add+0xab
EntityFramework.dll!System.Data.Entity.DbSet
1.Add+0x70
PROJECT.dll!<…AddAsync>d__0.MoveNext+0x4d

Esto parece indicar que EF está intentando realizar un seguimiento de los cambios y como la tabla de la base de datos/EF DbSet puede ser bastante grande (no estoy seguro de la segunda parte ya que guardamos los cambios después de cada inserción), se bloquea en algún lugar.

El modelo EF tiene propiedades marcadas como virtuales. También intentamos deshabilitar “AutoDetectChangesEnabled” y “ProxyCreationEnabled”, pero los fallos continúan ocurriendo de manera consistente.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con el mecanismo de seguimiento de cambios de Entity Framework, probablemente debido a la gran cantidad de entidades que se están rastreando en el DbContext. Una solución potencial es deshabilitar por completo el seguimiento de cambios utilizando la siguiente línea de código:

    _context.Configuration.AutoDetectChangesEnabled = false;

    Esto se puede colocar en el constructor del DbContext o en el repositorio de registros antes de llamar al método AddAsync.

    Otra solución potencial es utilizar Carga Explícita para recuperar las entidades relacionadas solo cuando sea necesario, en lugar de cargar todas las entidades relacionadas cuando se recupere la entidad original.

    Además, si la tabla de registros sigue creciendo y nunca se limpia o se particiona, esto también puede causar problemas de rendimiento. Considere la posibilidad de particionar o archivar registros antiguos para ayudar con el rendimiento.

Comments are closed.