Optimiza el rendimiento de discos persistentes


Los discos persistentes te proporcionan el rendimiento descrito en la tabla de tipos de disco si la VM genera un uso suficiente para alcanzar los límites de rendimiento. Una vez que dimensiones los volúmenes de discos persistentes para satisfacer tus necesidades de rendimiento, puede que tu app y tu sistema operativo necesiten algunos ajustes.

En las siguientes secciones, se describen algunos elementos clave que se pueden ajustar para obtener un mejor rendimiento y se explica cómo aplicar algunos de ellos a tipos específicos de cargas de trabajo.

Profundidad de la cola de E/S

  • Usa una profundidad de cola de E/S alta

    Los discos persistentes son dispositivos de almacenamiento conectado a la red, por lo que proporcionan IOPS y capacidad de procesamiento muy altos, pero la latencia es alta en comparación con los discos conectados de manera física, como los discos duros tradicionales y los SSD locales. A fin de alcanzar los límites máximos de IOPS y de capacidad de procesamiento del disco persistente, debes emitir solicitudes de E/S con suficiente paralelismo para que la latencia no genere un cuello de botella en la aplicación. Ajusta la configuración en tu sistema operativo o aplicación para usar una profundidad de cola de E/S de 32 o superior.

    Supongamos que la latencia del disco persistente SSD es de 800 microsegundos. Si emites operaciones de E/S de forma secuencial, puedes alcanzar un máximo de 1,250 IOPS:

    800 microsegundos por 1 E/S = 1 microsegundo por 0.00125 E/S = 1,250 E/S por segundo

    Esto está muy por debajo del límite máximo de 30,000 IOPS del disco.

Tamaño de E/S

  • Usa un tamaño de E/S grande

    Para garantizar que los límites y la latencia de IOPS no generen un cuello de botella en el rendimiento de tu aplicación, usa un tamaño mínimo de E/S de 256 KB o más.

    Usa tamaños de franjas grandes para las aplicaciones del sistema de archivos distribuido. Una carga de trabajo de E/S aleatoria que usa tamaños de franjas grandes (4 MB o más) logra un gran rendimiento en los discos persistentes estándar debido a la exactitud con que imita el acceso al disco con múltiples transmisiones secuenciales.

  • Asegúrate de que tu aplicación genere suficiente E/S

    Asegúrate de que la aplicación genere suficientes E/S para usar por completo los límites de IOPS y capacidad de procesamiento del disco. Para comprender mejor el patrón de E/S de la carga de trabajo, revisa las métricas de rendimiento y el uso del disco persistente en Cloud Monitoring.

  • Asegúrate de que haya suficiente CPU disponible en la instancia que genera la E/S

    Si tu instancia de VM consume mucha CPU, tu app no podrá administrar las IOPS descritas con anterioridad. Te recomendamos tener una CPU disponible por cada 2,000–2,500 IOPS de tráfico esperado.

Limita las cargas pesadas de E/S a un intervalo de 50 TB

Las cargas pesadas de E/S alcanzan el rendimiento máximo cuando se limitan a un intervalo de 50 TB. Los intervalos en discos persistentes distintos que agregan hasta 50 TB o menos pueden considerarse como un solo intervalo de 50 TB para fines de rendimiento. Un intervalo hace referencia a un rango contiguo de direcciones de bloque lógicas en un solo disco.

Inhabilita la inicialización diferida y habilita los comandos DISCARD

Los discos persistentes admiten los comandos DISCARD o TRIM, que permiten que los sistemas operativos informen a los discos cuando los bloques ya no están en uso. La compatibilidad con DISCARD permite que el sistema operativo marque los bloques de disco cuando ya no sean necesarios, sin incurrir en el costo de poner los bloques a cero.

En la mayoría de los sistemas operativos Linux, puedes habilitar DISCARD cuando activas un disco persistente en tu instancia. Las instancias de Windows Server 2012 R2 habilitan DISCARD de forma predeterminada cuando activas un disco persistente.

Habilitar DISCARD puede aumentar el rendimiento general del entorno de ejecución y, también, puede acelerar el rendimiento del disco cuando se activa por primera vez. Formatear el volumen completo del disco puede llevar mucho tiempo, por lo que el “formateo diferido” es una práctica común. La desventaja del formateo diferido es que el costo se suele pagar la primera vez que se activa el volumen. Si inhabilitas la inicialización diferida y habilitas los comandos DISCARD, se puede dar formato y activar con rapidez.

  • Para inhabilitar la inicialización diferida y habilitar DISCARD durante el formateo, pasa los siguientes parámetros a mkfs.ext4:

    -E lazy_itable_init=0,lazy_journal_init=0,discard
    

    El parámetro lazy_journal_init=0 no funciona en instancias con imágenes de CentOS 6 o RHEL 6. Para esas instancias, formatea los discos persistentes sin ese parámetro.

    -E lazy_itable_init=0,discard
    
  • Para habilitar los comandos DISCARD durante la activación, pasa la marca siguiente al comando de activación:

    -o discard
    

Los discos persistentes funcionan bien con la opción discard habilitada. Sin embargo, puedes ejecutar fstrim de manera periódica junto con la opción discard o sin ella. Si no usas la opción discard, ejecuta fstrim antes de crear una instantánea de tu disco. Reducir el sistema de archivos te permite crear imágenes de instantáneas más pequeñas, lo que disminuye el costo de almacenamiento de instantáneas.

Caché de lectura anticipada

Para mejorar el rendimiento de E/S, los sistemas operativos emplean técnicas como la lectura anticipada, que consiste en leer en la memoria más archivos de los solicitados en el supuesto de que las operaciones de lectura posteriores necesitarán esos datos. Una lectura anticipada mayor aumenta la capacidad de procesamiento a expensas de la memoria y las IOPS. Una lectura anticipada menor aumenta las IOPS a expensas de la capacidad de procesamiento.

En los sistemas Linux, puedes obtener y establecer el valor de lectura anticipada con el comando blockdev:

$ sudo blockdev --getra /dev/[DEVICE_ID]
$ sudo blockdev --setra [VALUE] /dev/[DEVICE_ID]

El valor de lectura anticipada es <desired_readahead_bytes> / 512 bytes.

Por ejemplo, para una lectura anticipada de 8 MB, 8 MB es 8,388,608 bytes (8 * 1,024 * 1,024).

8388608 bytes / 512 bytes = 16384

Establece blockdev en 16384:

$ sudo blockdev --setra 16384 /dev/[DEVICE_ID]

CPU libres

Realizar operaciones de lectura y escritura en un disco persistente requiere ciclos de CPU de tu VM. Si quieres alcanzar niveles de IOPS muy altos y coherentes, debes tener CPU libres para procesar E/S.

Cargas de trabajo orientadas a IOPS

Las bases de datos, ya sean SQL o NoSQL, tienen patrones de uso de acceso aleatorio a los datos. Google recomienda los siguientes valores para las cargas de trabajo orientadas a IOPS:

  • Valores de profundidad de la cola de E/S de 1 por cada 400–800 IOPS, hasta un límite de 64 para volúmenes grandes

  • Una CPU libre por cada 2,000 IOPS de lectura aleatoria y 1 CPU libre por cada 2,500 IOPS de escritura aleatoria

Por lo general, en los documentos de prácticas recomendadas, se sugieren valores de lectura anticipada menores para MongoDB, Apache Cassandra y otras aplicaciones de bases de datos.

Cargas de trabajo orientadas a la capacidad de procesamiento

Las operaciones de transmisión, como un trabajo de Hadoop, se benefician de las operaciones de lectura secuenciales rápidas; los tamaños más grandes de E/S pueden aumentar el rendimiento de la transmisión.

  • Usa un tamaño de E/S de 256 KB o más.

  • En los discos persistentes estándar, usa 8 o más transmisiones secuenciales de E/S paralelas cuando sea posible. Los discos persistentes estándar están diseñados para optimizar el rendimiento de E/S con el acceso al disco secuencial, similar a un disco duro HDD.

  • Asegúrate de que tu app esté optimizada para una localidad de datos temporales razonable en discos grandes

    Si tu app accede a datos que se distribuyen en diferentes partes de un disco durante un período corto (cientos de GB por CPU virtual), no obtendrás IOPS óptimas. Si quieres obtener un mejor rendimiento, optimiza para una localidad de datos temporales y ten en cuenta factores como la fragmentación del disco y la aleatoriedad de las partes accedidas del disco.

  • En los discos persistentes SSD, asegúrate de que el programador de E/S en el SO esté configurado para satisfacer tus necesidades específicas

    En los sistemas basados en Linux, puedes establecer el programador de E/S en noop para alcanzar la mayor cantidad de IOPS en dispositivos respaldados por SSD.

Revisa las métricas de rendimiento del disco persistente

Puedes revisar las métricas de rendimiento del disco persistente en Cloud Monitoring, la solución de supervisión integrada de Google Cloud.

Varias de estas métricas son útiles para comprender si se limitan tus discos. La limitación está diseñada para atenuar las E/S poco estables. Con la limitación, las E/S poco estables pueden distribuirse durante un período para que los límites de rendimiento de tu disco se puedan alcanzar, pero no exceder un instante determinado.

Para obtener más información, consulta Revisa las métricas de rendimiento del disco persistente.

Próximos pasos