Iops, latencia y performance


El otro día dando una conferencia me sorprendí porque algunas cosas que uno asume como conocidas no lo son tanto Sad smile , por tal motivo me decidí a escribir este post Smile

Sin ninguna duda que para nosotros los Dba’s el subsistema de disco es nuestro principal cuello de botella en lo que respecta a performance. Por lo tanto es bueno tratar de entender como se mide y funciona.

Sabemos que nuestro motor SQL Server lee y escribe sobre los archivos, esto lo hace con distintos patrones (Random, Secuencial) y con distintos tamaños de bloque (8k, 64k, etc).

Latencia

Nuestro sistema se puede empezar a poner lento si los discos responden lento, esto que quiere decir: Yo SQL Server te envió operaciones de I/O y vos disco tardas mas de lo que yo espero con lo cual empiezo a sentir algunos problemas de performance.

A este fenómeno lo llamamos latencia, que en otras palabras es: La unidad de medida en tiempo que tardara el disco desde el momento que se crea una solicitud de IO hasta el momento que esa solicitud se completa , este tiempo se lo suele medir en ms (milisegundos).

Para poder medir la latencia de nuestro servidor, deberíamos usar alguno de los siguientes contadores de performance (logical disk o del physical disk)

Average Disk sec / read: Latencia en ms de lectura

Average Disk sec / write: Latencia en ms de escritura.

El siguiente cuadro muestra los valores deseados para una base de datos OLTP

1 – 5 ms: para el transaction log (idealmente 1ms)

5 – 20ms: para el Data (Idealmente 10ms).

Arquitectura de discos en el SO

El siguiente dibujo nos muestra como es la arquitectura de las capas en el SO

0508_image_thumb_3A473A55

 

IOPS: (Entradas y salidas por segundo)

Esta es la unidad de medida principal sobre la performance que nos dan los fabricantes de los discos. La misma es una métrica que representa el promedio de la cantidad de operaciones de entrada y salida por segundo que el disco puede hacer.

Como se calculan los iops?

Iops = 1 / (Average latency + Average Seek Time)

Veamos un ejemplo:

Disco X:

Average Latency : 2ms

Average Seek Time: 3ms

Iops = 1 / (0,002 + 0,003) = 200

Calcular los IOPS:

Es muy importante poder calcular los IOPS que nuestro sistema va a necesitar, si por ejemplo calculamos un sistema para 1000 iops y luego le enviamos 2000 lo que sucederá es que el sistema de discos se saturara y empezara a encolar operaciones, con lo cual veremos que los tiempos de latencia aumentaran.

Para poder hacer un calculo es bueno poder medir lo que tenemos , para ello podemos usar los contadores:

Disk Reads / Second: Iops de lectura

Disk Writes / Second: Iops de escritura

Capturando estos valores y luego haciendo alguna formula estadística (ver picos, por ejemplo) podremos usar alguna calculadora que nos ayude a dimensionar cuantos discos necesitaríamos, aquí les paso una de las mas populares

Herramientas para hacer stress test:

Hay distintas herramientas que nos ayudaran a hacer un stress test del disco y obtener resultados de IOPS, Latencias, mb/s etc.

Microsoft para SQL Server tiene estas dos:

SQLIO

SQLSIM