ver tuning rendimiento procedimientos optimizar mejorar limpiar lentas ejecucion datos consultas cache almacenados sql-server asp.net-mvc nhibernate second-level-cache distributed-caching

sql server - tuning - ¿Cuáles son los pros y los contras de una memoria caché de segundo nivel distribuida en lugar de centrarse en la base de datos de ajuste



tuning base de datos sql server (6)

Dos palabras: mídelo.

Como ya tiene implementado el caché, probablemente pueda medir el impacto de apagarlo para fines de referencia.

tenemos un sitio web que usa nhibernate y caché de segundo nivel. Estamos teniendo un debate ya que una persona quiere desactivar la memoria caché de segundo nivel, ya que nos estamos moviendo a un entorno de servidor web múltiple (con un equilibrador de carga al frente).

Un argumento es deshacerse de la memoria caché de segundo nivel y centrarse en optimizar y ajustar el Db. el otro argumento es desplegar un caché distribuido como el caché de segundo nivel.

Tengo curiosidad por escuchar gente pro y contra de la sintonización de DB frente a la caché distribuida (teniendo en cuenta el esfuerzo involucrado, el costo, la complejidad, etc.)


En el caso de un escenario de equilibrio de carga, debe usar un proveedor de caché distribuida para obtener el mejor rendimiento y consistencia, que no tiene nada que ver con la optimización de su base de datos. En cualquier escenario, debe optimizar su base de datos.


Ambos. Debería tener un caché distribuido para evitar llamadas innecesarias a la base de datos y una base de datos ajustada para que las llamadas iniciales se devuelvan rápidamente. Como ejemplo, Facebook requirió una gran cantidad de almacenamiento en caché para escalar, pero estoy seguro de que no sería muy útil si las consultas iniciales tardaran 10 minutos. :)


Ese es un tema muy difícil. En cualquier caso, necesitas competencia. Ya sea un DBA muy competente o un administrador de NHibernate / Cache muy competente.

Personalmente, prefiero tener un control total sobre mi SQL y ajustar la base de datos. Como solo tiene múltiples servidores web (y no necesariamente múltiples instancias de base de datos), también podría estar mejor así. Las bases de datos modernas tienen cachés muy eficientes, por lo que generalmente crea más daños con cachés de segundo nivel mal configurados en la aplicación, en lugar de simplemente dejar caché en la base de datos declaraciones, cursores, datos, búferes, etc. He experimentado que esto funciona muy bien para alrededor de 15 servidores weblogic y solo una base de datos con mucha memoria.

Sin embargo, como ya tienes NHibernate, alejándote de él, regresar a SQL (¿quizás con LINQ?) Podría ser una tarea bastante costosa, eso no vale la pena el esfuerzo.


Creo que un servidor multi-web y un caché distribuido de segundo nivel pueden, y probablemente deberían, coexistir.

En primer lugar, si tomamos como ejemplo memcached, admite el almacenamiento de objetos distribuidos, de modo que si no está utilizando eso, puede cambiar a eso. funciona.

En segundo lugar, supongo que está presentando la granja de servidores web para responder al aumento de las solicitudes web, lo que a su vez aumentará las solicitudes de datos. Si matas tu almacenamiento en caché, no importará cuánto optimices tu base de datos, vas a agotarla con consultas. Por lo tanto, mejorará el tiempo de ejecución, pero mientras espera que la base de datos devuelva sus datos.

Esto es especialmente cierto para el caso en que el nodo web 1 solicite el conjunto de datos A y el nodo de la web 2 solicite el conjunto de datos A -> va a hacer la misma consulta dos veces, mientras que con el segundo nivel de almacenamiento en caché solo lo hará una vez.

Entonces mi recomendación es:

No mates tu caché de segundo nivel. Ya ha gastado recursos para implementarlo y al deshabilitarlo NO va a mejorar el rendimiento de su aplicación. Incluso un solo nodo de memcached va a ser más rápido que no tener ninguno.

Optimiza tus operaciones de base de datos. Esto significa tanto desde el lado de la base de datos (índices, vistas, sp''s, funciones, tal vez un clúster con nodos de solo lectura y de solo escritura) como desde la aplicación (optimice sus consultas, perfil de carga flojo / ansioso, no busque datos que use no es necesario, combina múltiples consultas en viajes de ida y vuelta a través de Future, MutliQuery, MultiCriteria)

Optimice su implementación de caché de segundo nivel. Hay conjuntos de datos que tienen una fecha de vencimiento infinita, y por lo tanto consulta el db para ellos solo una vez, y hay conjuntos de datos que tienen fechas de vencimiento cortas, y por lo tanto, probablemente las consultas más costosas se ejecuten con mayor frecuencia. Al optimizar sus consultas y su base de datos, mejorará el rendimiento de las consultas, pero la memoria caché de segundo nivel guardará su máscara en la carga máxima, en la que la memoria caché buscará con más frecuencia datos de fecha de caducidad.

Si el uso de consultas textuales es una operación cotidiana, utilice las capacidades de texto completo de la base de datos o, mejor aún, utilice un servicio independiente como Lucene.NET (que se puede integrar con NHibernate a través de NHibernate.Search)


Usamos la memoria caché de segundo nivel de NHibernate en nuestro entorno de servidores múltiples utilizando el marco de caché distribuida de Microsoft AppFabric ( NHibernate Velocity Provider ) con gran éxito.

Una vez dicho esto, usar el caché de segundo nivel requiere una comprensión más profunda del marco para evitar resultados inesperados. Además, antes de usar cachés distribuidos, es importante medir su sobrecarga.

Así que mi respuesta es básicamente: antes de usar el caché de segundo nivel, realmente debes probar y ver si realmente es necesario.