Quick tip for concurrency when using Entity Framework

Entity Framework does a great job at simplifying the way we interact with storage. Sometimes we need to use parallelism to speed up the completion of a task. This is usually done by means of multithreading (note: always prefer to use a new context per request, instead of a context per thread) or with async. In both cases we are attempting to scale our application, and in both cases Entity Framework has been tuned to scale linearly. However, some users might experience resource contention that limits the parallelism they are expecting when the Garbage Collector is not properly configured.

Whenever EF is used in a multithreaded scenario, or in any application that resembles a server system, make sure to enable server garbage collection. This is done via a simple setting in your application config file:

<?xmlversion="1.0" encoding="utf-8" ?>

<configuration>

        <runtime>

               <gcServer enabled="true" />

        </runtime>

</configuration>

This should decrease your thread contention and increase your throughput by up to 30% in CPU saturated scenarios.

Comments

  • Anonymous
    August 28, 2014
    Maybe worth noting that gcServer is always enabled under asp.net

  • Anonymous
    August 28, 2014
    Thanks for the feedback Erik!

  • Anonymous
    August 31, 2014
    I didn't know server GC could improve performance that significantly. Will definitely have to test this on some of our products. Thanks for the tip!