GuilleSQL :: Microsoft SQL Server, SSIS, y más !!

Problemas de Rendimiento: ¿Tenemos un cuello de botella en el acceso a disco?


Una tarea típica que nos tocará realizar en más de una ocasión es lidiar con problemas de rendimiento en Windows, lo que en muchas ocasiones se limita a problemas de rendimiento en el acceso a disco (I/O). El presente artículo describe cómo identificar si tenemos o no un cuello de botella en el acceso a disco, de tal modo que ya sabiéndolo, podamos continuar con nuestro debugging particular, sea una Aplicación Web, de SQL Server, o de lo que fuere.

Siempre que alguien se me queja de problemas de rendimiento, lo primero que hago es comprobar si existe un problema de rendimiento en el acceso a disco, quizás la principal lacra a la que nos solemos enfrentar. Por muy sobrado que estemos de CPU y RAM, si tenemos una alta latencia de acceso a disco y las operaciones de entrada/salida tardan demasiado en realizarse, el rendimiento general caerá en picado, y todo absolutamente todo degenerará. Simplemente, desplegar el botón de Inicio en Windows, será una tarea que requerirá de grandes dosis de paciencia. Y tu teléfono arderá.

Afortunadamente, disponemos de varios Contadores de Rendimiento que nos pueden ayudar en esta tarea:

  • \LogicalDisk(*)\Avg. Disk Queue Length y \PhysicalDisk(*)\Avg. Disk Queue Length. Ojo, porque este contado realmente NO mide el tamaño de la cola, sino que multiplica la velocidad de transferencia por el número de transferencias. Sin embargo, aún así se trata de un contador primordial para identificar problemas de rendimiento relacionados con el acceso a disco. El valor de este contador debe ser cero (ojo con la Escala). A partir de mesetas de 5 empieza a preocuparte. Mesetas superiores a cinco, tienes un problema serio. Importante: debemos fijarnos en las mesetas y no en los picos. Muy importante: primero revisar este contador a nivel de disco lógico; si identificamos un problema, lo revisamos en el disco físico (y resto de discos lógicos del mismo disco físico); Seguidamente, si el disco físico pertenece a una LUN compartida, deberíamos de identificar si el problema es nuestro o de alguna de las máquinas que comparten la LUN, por ejemplo, revisando dichas máquinas.
  • \LogicalDisk(*)\Current Disk Queue Length y \PhysicalDisk(*)\Current Disk Queue Length. Este contador mide el valor actual de la longitud de cola, o lo que es lo mismo, las operaciones de acceso a disco que están encoladas en el Sistema Operativo esperando poder ser realizadas. Sin embargo, en algunos entornos con Almacenamiento SAN, podemos tener un cuello de botella en el acceso a disco, sin que este contador llegue a dispararse. Es decir, un proceso (ej: SQL Server) realiza una operación de acceso a disco, dicha operación pasa por la cola del Sistema Operativo, y seguidamente sale de dicha cola. Por lo tanto, la cola del Sistema Operativo está vacía, y nuestro contador favorito a cero, como Dios manda. Pero, el ciclo de vida de dicha operación de acceso a disco no ha finalizado. Podría ocurrir que al ejecutarse esta operación de acceso a disco, llegase a una Cabina, y quedase encolada en la cola de la Cabina de Almacenamiento, en cuyo caso, tenemos un cuello de botella en el acceso a disco aunque la cola del Sistema Operativo este vacía y el contador Current Disk Queue Length esté a cero. Este es el problema de dicho contador: que tan sólo mira la cola de acceso a disco del Sistema Operativo, y nada más, lo cual, no siempre es suficiente. ¿Qué hacemos? ¿Cómo podemos identificar un cuello de botella en el acceso a disco en un escenario como este? Tenemos que mirar más contador, para poder asegurarnos. Ah, y como con el contador anterior, como costumbre miraremos primero el contador a nivel de Disco Lógico, y después a nivel de Disco Físico.
  • \LogicalDisk(*)\Avg. Disk sec/Read, \LogicalDisk(*)\Avg. Disk sec/Write, \PhysicalDisk(*)\Avg. Disk sec/Read y \PhysicalDisk(*)\Avg. Disk sec/Write. Estos contadores indican el tiempo total que tarda en realizarse una operación de acceso disco, indiferentemente de que el tiempo que pierda en el Sistema Operativo, o fuera de él (ej: en la Cabina de Almacenamiento o quizás en la Controladora). Dicho esto, sólo nos queda tener un valor de referencia, un umbral que nos sirva para que podamos identificar si tenemos o no un problema. Como referencia, las operaciones de acceso a disco deben realizarse en menos de 15ms, a partir de 15ms debemos empezar a vigilar qué ocurre, y por encima de 25ms tenemos un problema, especialmente si tenemos mesetas. Lo de siempre: evaluar primero el Disco Lógico, y luego el Disco Físico. Si se trata de un Disco sobre una LUN compartida, averiguar si es mi problema (mi máquina es la que mete caña) o es problema del vecino (otra máquina que comparte la LUN mete caña, el rendimiento de la LUN degenera, y como efecto colateral mi máquina experimenta un rendimiento pobre... pero no es mi problema, es del vecino).

Otros contadores que podemos revisar serían los siguientes:

  • \PhysicalDisk(*)\% Disk Time. No es más que el contador Avg. Disk Queue Length multiplicado por 100.
  • \PhysicalDisk(*)\% Idle Time. Mide con preción el tiempo que el disco permanece desocupado, lo que significa que todas las operaciones de acceso a disco han sido completadas, y que no hay operaciones pendientes. Es decir, mide el % del tiempo que la cola esta vacía.

Apuntes de un amigo

Algunas notas que tome de una charla con un amiguete que sabe mucho de estos temas:

  • Como regla general, si hay encolamiento investigaremos en el SO, mientras que cuando no hay encolamiento deberemos investigar fuera (ej: en la cabina).
  • Si hay latencia, deberemos analizar su correlación con la carga (transferencias por segundo o bytes por segundo), de tal modo que:
    • Si aumenta la latencia y la carga a la vez, soy yo: hay mucha carga, la máquina no da más.
    • En caso contrario ¿serán discos compartidos?

Contadores Primarios, Contadores Secundarios y Conclusiones

Dicho todo esto, ahora llega la hora de darle la vuelta a la tortilla.

Un Contador Primario, es un contador que debemos comprobar en primer lugar para la identificación de un problema. Si no tenemos ningún problema, genial. Si tenemos un problema, entonces deberemos analizar los Contadores Secundarios para obtener mayor información del problema que tenemos.

La conclusión de todo esto, es que los contadores Avg. Disk sec/Read y Avg. Disk sec/Read son Contadores Primarios para la comprobación de cuellos de botella en el acceso a disco, mientras que el contador Avg. Disk Queue Length es un Contador Secundario que nos indica una información más específica del problema que hemos encontrado, en particular, si tenemos o no operaciones encoladas a nivel del Sistema Operativo.

Despedida y Cierre

Los problemas de rendimiento, son quizás unos de los problemas más interesantes (tecnológicamente hablando) de los que nos podemos encontrar, lo cual no quita, que en ocasiones encierran cierta complejidad que puede hacernos sufrir un pequeño infierno.

Dentro de los problemas de rendimiento, quizás uno de los problemas estrella son los problemas de rendimiento en el acceso a disco (AKA latencia de acceso a disco). A través de este artículo, he intentado mostrar una de las formas típicas de identificar si estamos sufriendo este tipo de problemas de rendimiento.

Por último, antes de acabar, aprovecho para incluir algún enlace de interés para quién desee ampliar más información:

Poco más por hoy, como siempre confío que la lectura resulte de interés.

 



Comentarios

djuvet - 20/05/2014 (UTC)
Interesante articulo Guille. Nos vemos Dani J. :-)



Miembros de
Miembros de GITCA (Global IT Community Association)

Menu de Usuario
  Iniciar Sesión
  Registrarse
  Restablecer Contraseña
  Ventajas de Registrarse

Acerca de
  Contigo desde Oct 2007
  771 usuarios registrados
  86146 pageloads/mes
  Ranking Alexa 498160

Social Networks
Sigue a Portal GuilleSQL en Linkedin !!
Sigue a Portal GuilleSQL en Twitter !!



Archivo

Marzo de 2019 (1)
Octubre de 2018 (1)
Julio de 2018 (1)
Junio de 2018 (4)
Mayo de 2018 (5)
Abril de 2018 (3)
Marzo de 2018 (2)
Febrero de 2018 (7)
Enero de 2018 (1)
Diciembre de 2017 (15)
Noviembre de 2017 (7)
Junio de 2017 (3)
Mayo de 2017 (1)
Marzo de 2017 (3)
Enero de 2017 (4)
Junio de 2016 (1)
Mayo de 2016 (2)
Abril de 2016 (2)
Septiembre de 2015 (2)
Agosto de 2015 (2)
Junio de 2015 (10)
Mayo de 2015 (4)
Abril de 2015 (8)
Marzo de 2015 (11)
Octubre de 2014 (3)
Septiembre de 2014 (7)
Agosto de 2014 (5)
Julio de 2014 (2)
Mayo de 2014 (4)
Abril de 2014 (4)
Marzo de 2014 (4)
Febrero de 2014 (1)
Enero de 2014 (5)
Diciembre de 2013 (8)
Noviembre de 2013 (2)
Octubre de 2013 (7)
Septiembre de 2013 (6)
Agosto de 2013 (1)
Julio de 2013 (6)
Junio de 2013 (11)
Mayo de 2013 (7)
Abril de 2013 (6)
Febrero de 2013 (5)
Enero de 2013 (7)
Diciembre de 2012 (12)
Noviembre de 2012 (13)
Octubre de 2012 (5)
Septiembre de 2012 (3)
Agosto de 2012 (6)
Julio de 2012 (4)
Junio de 2012 (1)
Mayo de 2012 (2)
Abril de 2012 (7)
Marzo de 2012 (16)
Febrero de 2012 (9)
Enero de 2012 (5)
Diciembre de 2011 (10)
Noviembre de 2011 (10)
Octubre de 2011 (4)
Septiembre de 2011 (5)
Agosto de 2011 (2)
Julio de 2011 (2)
Junio de 2011 (4)
Mayo de 2011 (2)
Abril de 2011 (6)
Marzo de 2011 (4)
Febrero de 2011 (10)
Enero de 2011 (5)
Diciembre de 2010 (6)
Noviembre de 2010 (4)
Octubre de 2010 (8)
Septiembre de 2010 (4)
Agosto de 2010 (1)
Julio de 2010 (3)
Mayo de 2010 (5)
Abril de 2010 (6)
Marzo de 2010 (8)
Febrero de 2010 (3)
Enero de 2010 (1)
Diciembre de 2009 (9)
Noviembre de 2009 (14)
Octubre de 2009 (2)
Septiembre de 2009 (8)
Agosto de 2009 (2)
Julio de 2009 (10)
Junio de 2009 (9)
Mayo de 2009 (10)
Abril de 2009 (9)
Marzo de 2009 (3)
Febrero de 2009 (2)
Enero de 2009 (3)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (2)
Agosto de 2008 (5)
Julio de 2008 (5)
Junio de 2008 (1)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (2)
Febrero de 2008 (2)
Enero de 2008 (5)
Noviembre de 2007 (2)
Octubre de 2007 (2)






Copyright © 2007 GuilleSQL, todos los derechos reservados.