net framework first example code asp entity-framework iis entity-framework-6 asp.net-web-api2 iis-8

entity-framework - first - web api entity framework



Rendimiento de inicialización de la primera llamada ASP.NET Web Api 2/EF6 (1)

No estoy seguro de si alguien ha abordado esto todavía, pero he aprendido sobre algunos problemas de rendimiento que surgen en el inicio inicial de Entity Framework. Julie Lerman discutió esto en su curso Pluralsight sobre Entity Framework, y también se menciona en el siguiente extracto del artículo de Microsoft:

Uno de los mayores retrasos en el rendimiento es el tiempo de inicio involucrado con el primer uso de un contexto en un proceso de solicitud. Sin embargo, puedes hacer mucho para mejorar ese tiempo de inicio. Espero que ya haya aprendido estos trucos de mi propia escritura u otros recursos, como el documento de MSDN sobre consideraciones de rendimiento en bit.ly/3D6AiC.

Un paso de inicio que a menudo obstaculiza el rendimiento es la generación de vista de vistas de mapeo, donde EF crea el SQL relevante para consultar contra cada uno de los conjuntos de entidades en el modelo. Estas vistas se aprovechan a medida que se ejecuta su aplicación, de modo que para ciertas consultas, EF no tiene que resolver el SQL sobre la marcha. La generación de vista ocurre tanto si creó su modelo con el Diseñador de EF o con Code First. Puede pregenerar estas vistas y compilarlas en la aplicación para ahorrar tiempo. http://msdn.microsoft.com/en-us/magazine/dn532202.aspx

Aquí parece que ella no solo está hablando de la "carga inicial", sino del primer uso real de un contexto. Hice una búsqueda rápida de problemas de rendimiento de Julie Lerman y Entity Framework. Noté una lentitud similar al hacer las llamadas iniciales a mi API web. Cada llamada después de la primera fue significativamente más rápida. Personalmente no he encontrado que sea demasiado horrible, así que lo ignoro (por ahora). Sin embargo, me parece interesante que no ocurra en modo de depuración. Lo siento si ya has explorado estas opciones, pero espero que esto ayude un poco.

La primera llamada a nuestra API siempre es extremadamente lenta. Por ejemplo, a continuación se muestra el uso de la CPU y el tiempo que tarda en completarse la primera llamada:

La primera llamada puede tomar hasta 30 segundos y consume casi 100% de CPU. Las llamadas 2 y 3 tardan 200 ms (como deberían). Después de reciclar el grupo de aplicaciones, hará lo mismo con la primera llamada.

He leído un poco sobre el "calentamiento" de IIS y he hecho lo siguiente, pero nada ha cambiado:

La inicialización de la aplicación IIS 8 está instalada:

Tengo el siguiente conjunto en IIS:

  • Establecer el modo de inicio a AlwaysRunning :
  • Establezca el tiempo de espera de reciclaje en 0:
  • Establezca el tiempo de inactividad en 0:
  • Establecer precarga habilitada en verdadero en el sitio:

De hecho, estoy configurando estos en código en RoleEntryPoint.OnStart() .

using (var serverManager = new ServerManager()) { serverManager.ApplicationPoolDefaults.ProcessModel.IdleTimeout = TimeSpan.Zero; foreach (var application in serverManager.Sites.SelectMany(x => x.Applications)) { application["preloadEnabled"] = true; } foreach (var applicationPool in serverManager.ApplicationPools) { applicationPool.AutoStart = true; applicationPool["startMode"] = "AlwaysRunning"; applicationPool.ProcessModel.IdleTimeout = TimeSpan.Zero; applicationPool.Recycling.PeriodicRestart.Time = TimeSpan.Zero; } serverManager.CommitChanges(); }

Estoy casi seguro de que Entity Framework podría ser el culpable:

  • Estamos generando modelos de alrededor de 100 tablas en un modelo de EDMX "diseñador".

  • Estamos generando vistas precompiladas generadas por EF Power Tools.

  • La siguiente inicialización se está ejecutando en Application_Start() :

    using (var context = new MyContext()) { context.Database.Initialize(false); }

No tengo estos problemas de "inicialización" cuando se depura.

La siguiente tecnología está siendo utilizada:

  • .NET 4.5.1
  • ASP.NET Web Api 2
  • Entidad Marco 6.1.1
  • IIS 8 (rol web azul)
  • Unidad 3.5

¿Alguien puede proporcionarme otras ideas o sugerencias?