¿A más procesadores consulta más lenta?
Que paradojas tiene la informática... tendemos a suponer que tener más procesadores tiende ha hacer que nuestros procesos se realicen más rápido, pero esto no es cierto. Un proceso expandido entre varios procesadores, siempre tardará más en realizarse que si se realiza en un único procesador. Esto no quiere decir que tener muchos procesadores no sea ventajoso, pues lo que permite es realizar muchas tareas a la vez, cada una será un poco más lenta, debido al tiempo que los cambios de contexto consumiran, pero sin embargo transcurrido un tiempo tendremos muchas más tareas completadas lo que hará que la velocidad percibida sea mucho mayor.
Hay una situación en la que este problema se puede hacer patente de una manera cuando menos sorprendente: al migrar nuestro servidor de bases de datos a un servidor con muchos más procesadores. Es relativamente habitual que, una consulta, que en una máquina de dos procesadores tarda un tiempo razonable, al migrar nuesto Sql Server a una máquina con más procesadores tarda mucho más en completarse. ¡Lo peor es que esta situación es principio es un sinsentido!, tengo más máquina y mi aplicación va más lenta...
Javier Loria, me explicaba en el Summit la situación de una manera muy gráfica: que es más facil, que una persona cante una canción o que lo hagan ocho. Evidentemente ocho se tendrán que poner de acuerdo en que parte cantar cada uno, y tendrán que poner atención en no pisarse. A Sql Server le pasa exactamente lo mismo. Cuando ocho procesadores intentan ejecutar la misma consulta puede ser que se molesten entre ellos, estas 'molestias' tienen su origen, habitualmente en que los diferentes hilos 'pelean' entre si por bloqueos, en esencia es un problema de bloqueos.
La solución simple, pero un poco chapucera es usar el hint MAXDOP en la consulta para limitar el número de procesadores que como máximo se utilizarán para ejecutar un consulta. Teneís más información sobre cómo usar MAXDOP en esta entrada del Knowledge Base.
La solución que debemos buscar es evitar que los diferentes hilos se molesten entre si y eso pasa por reducir la cantidad de bloqueos y la manera más simple de lograrlo es establecer los índices adecuados para la consulta. Como siempre vuelve a aparece aquí la importancia que los índices tienen para que nuestras bases de datos rindan perfectamente.
Otra moraleja clara de este asunto es que existen errores en diseño de base de datos (y en general en el diseño de aplicaciones) que no se arreglan poniendo más máquina.