Cuando nos planteamos el diseño de nuestro almacenamiento para OLTP de alto rendimiento tenemos que plantearnos muchas más variables que simplemente el volumen total de la información a almacenar. En los últimos años la capacidad de los discos duros ha crecido de forma muy significativa mientras que las revoluciones por minuto de los discos se han mantenido en un máximo de 15.000. Las razones de esto es que incrementar el número de revoluciones de un disco duro implica importantes retos tecnológicos debido al calor, las vibraciones, calibración, etc. mientras que el aumento en el rendimiento no sería tan alto como esperaríamos.
El coste de una operación aleatoria en función del número de revoluciones sería la suma del coste del posicionamiento del cabezal, la espera hasta que la parte del disco apropiada pase por debajo del cabezal y la lectura de datos en sí misma. En un disco empresarial típico de 10K, de 15K y un SSD los costes serían los siguientes:
RPM |
Posicionamiento |
Latencia |
Lectura |
Total |
10K |
4.6 ms |
3 ms |
0.1 ms |
7.7 ms |
15K |
3.3 ms |
2 ms |
0.1 ms |
5.4 ms |
SSD |
– |
– |
0.075 ms |
< 0.1 ms |
Como podemos ver, la diferencia en aumentar un 50% la velocidad de rotación respecto al disco de 10K disminuye en un 50% la latencia pero esto únicamente repercute en 2.3ms en el tiempo total de lectura aleatoria (~30% de mejora). Un hipotético disco de 30K disminuiría el tiempo total respecto a uno de 15K (si no mejoramos el posicionamiento) únicamente en 1 ms (~18% de mejora) pese a haber duplicado las revoluciones. Si la latencia de acceso aleatoria es crítica en nuestro sistema los SSDs son la vía a seguir sin lugar a duda.
El tradicional uso de discos pequeños para mejorar el rendimiento se basa en el mayor número de IOPS por GB que podemos obtener con discos pequeños. A efectos prácticos es como si dispusiéramos de más de un brazo actuador por cada uno de los discos de mayor capacidad. El inconveniente de esta aproximación es que los fabricantes están eliminando estas unidades de pequeño tamaño de sus catálogos quedando únicamente unidades de alta capacidad. Por otra parte el uso de unidades dedicadas para tempdb, log de transacciones, etc. se hace más y más complicado debido al fuerte desaprovechamiento que se hace de las unidades de disco de gran tamaño. En un entorno SAN el impacto de las operaciones aleatorias (especialmente escrituras) puede ser fuertemente atenuado con el uso de una caché de generoso tamaño. Con dicha caché se consigue evitar parcialmente las interferencias que ocurren principalmente entre lecturas sobre ficheros de datos y las escrituras en el log de transacciones sin olvidarnos tampoco de los picos de escrituras que producen los checkpoint. Desgraciadamente el tamaño de las cachés de muchas cabinas es escaso o incluso ridículo para los tiempos que corren. Pese a ello a continuación veremos que existen alternativas para optimizar el uso del disco en función de las necesidades particulares de rendimiento que tengamos.
Por tanto la situación en la que nos encontramos habitualmente es que disponemos de discos de gran capacidad y un número menor del que desearíamos de éstos. En estos escenarios es donde podemos obtener ventajas mediante el uso de short-stroking. El short-stroking es una técnica que consiste básicamente en utilizar únicamente una pequeña parte de los discos (la parte exterior) de forma que los tiempos de posicionamiento se reduzcan muy considerable a la vez que aprovechamos la zona de máximo rendimiento de lectura/escritura secuencial del disco. La zona de alto rendimiento utilizable sería un anillo del disco donde los desplazamientos del cabezal serían muy cortos:
El uso del resto del disco tendrá que quedar relegado a un uso muy secundario (almacenamiento de datos históricos) o bien a cargas que no se ejecuten simultáneamente con la carga OLTP sobre la que intentamos mejorar su latencia. La preparación de los discos para short-stroking puede realizarse de forma manual mediante particionado o bien mediante utilidades especializadas de los fabricantes. Utilizando IOMeter y un perfil de pruebas de lecturas pequeñas aleatorias sobre dichas particiones podemos realizar mediciones para analizar la mejora en los IOPS obtenida:
Como podemos apreciar en las gráficas desde profundidades de cola muy bajas hasta profundidades altas el número de IOPS mejora de forma muy considerable tanto en discos de 10K como de 15K. Si comparamos el disco de 15K en full-stroke (todo el disco utilizado) y el 10K con un stroke de un 5% vemos como el número de IOPS alcanzados con el disco de 10K es superior al 15K hasta una profundidad de cola de 8.
La siguiente gráfica muestra los IOPS medios para cada una de las alternativas:
La mejora media en porcentaje se muestra en la siguiente tabla:
Disco | Average of 10% stroke IOPS | Average of 5% stroke IOPS |
10K | +55,91% | +77,54% |
15K | +62,44% | +81,57% |
La conclusión de este post es que no tenemos que atender únicamente al número de revoluciones de nuestros discos sino también al grado de utilización de éstos. El uso de short-stroking es una alternativa válida para reducir los tiempos de respuesta y aumentar el número de operaciones por segundo que nuestro disco es capaz de ofrecernos.