Solucionar problemas de cuello de botella en Dataflow

Se produce un cuello de botella cuando un paso, una fase o un trabajador ralentiza el trabajo en general. Los cuellos de botella pueden provocar que los trabajadores estén inactivos y que aumente la latencia.

Si Dataflow detecta un cuello de botella, el gráfico de trabajo muestra una alerta y el panel Información del paso indica el tipo de cuello de botella y la causa, si se conoce. Dataflow también exporta información de detección de cuellos de botella a una métrica de Stackdriver, que presenta los datos como una serie temporal. De esta forma, puede ver los cuellos de botella a lo largo del tiempo o en el pasado.

Identificar los cuellos de botella

Cuando Dataflow ejecuta una canalización de streaming, la tarea consta de una serie de componentes, como reorganizaciones de streaming, hilos de procesamiento de funciones definidas por el usuario (DoFn) y creación de puntos de control de estado persistente. Para facilitar el flujo de datos, Dataflow usa colas para conectar estos componentes. Los datos se envían de la fuente a los receptores.

En muchas canalizaciones, la capacidad de rendimiento general está limitada por un solo componente, lo que crea un cuello de botella en la canalización. La velocidad a la que los datos pueden pasar por un cuello de botella limita la rapidez con la que la canalización puede aceptar y procesar los datos de entrada.

Por ejemplo, considera una canalización en la que el procesamiento de DoFn se produce después de una aleatorización de streaming. Una cola entre ellos almacena en búfer los datos aleatorios, pero sin procesar. Si el procesamiento de DoFn no puede consumir datos tan rápido como los produce el shuffle de streaming, la cola aumenta. Un cuello de botella prolongado puede provocar que la cola alcance su capacidad. En ese momento, se detiene la aleatorización y el registro se propaga hacia arriba. Las colas situadas más arriba también acumulan trabajo pendiente, lo que provoca una ralentización que se extiende a la fuente de datos, lo que significa que toda la canalización no puede seguir el ritmo de la entrada.

Cuando se produce un cuello de botella, puede parecer que una parte importante de la canalización no funciona correctamente, aunque solo haya un punto de la canalización que esté provocando el retraso. Este comportamiento puede dificultar la depuración de los cuellos de botella. El objetivo de la detección de cuellos de botella es identificar la ubicación y la causa exactas, lo que elimina las conjeturas, para que puedas solucionar la causa principal.

Dataflow detecta un cuello de botella cuando un retraso supera el umbral de cinco minutos. Si el retraso no supera este umbral, Dataflow no detecta ningún cuello de botella.

La detección de cuellos de botella no siempre requiere que hagas algo y depende de tu caso de uso. Una canalización puede funcionar con normalidad con retrasos transitorios de más de cinco minutos. Si esta situación es aceptable en tu caso práctico, puede que no tengas que resolver los cuellos de botella indicados.

Tipos de cuellos de botella

Cuando Dataflow detecta un cuello de botella, la interfaz de monitorización indica la gravedad del problema. Los cuellos de botella se clasifican en las siguientes categorías:

El procesamiento se ha bloqueado y no avanza
El progreso de la canalización se detiene por completo en este paso.
El procesamiento está en curso, pero va con retraso.
La canalización no puede procesar los datos entrantes tan rápido como llegan. Como resultado, la lista de tareas pendientes está creciendo.
El procesamiento está en curso, pero la acumulación es constante
La canalización está avanzando y la tasa de procesamiento es comparable a la tasa de entrada. El procesamiento es lo suficientemente rápido como para que el trabajo pendiente no aumente, pero tampoco disminuye significativamente.
El procesamiento está en curso y se está poniendo al día con un backlog
La cartera de pedidos está disminuyendo, pero el cuello de botella actual impide que la canalización se ponga al día más rápido. Si inicias una canalización con un registro pendiente, este estado puede ser normal y no requerir ninguna intervención. Monitoriza el progreso para ver si el trabajo pendiente sigue disminuyendo.

Causas de los cuellos de botella

En esta sección se enumeran las causas de los cuellos de botella que se pueden detectar. Utiliza esta información para solucionar el problema. En algunos casos, puede haber varias causas, que pueden estar relacionadas entre sí. Por ejemplo, si los trabajadores no tienen suficientes recursos asignados, el uso de vCPU puede ser alto. Un uso elevado de la vCPU puede provocar que las operaciones se ralenticen, lo que a su vez puede generar un retraso elevado en la cola. El análisis de las causas probables puede mostrar todos estos elementos como causas del cuello de botella.

Operaciones con tiempos de procesamiento largos

El cálculo tiene un tiempo de procesamiento largo. Esto ocurre cuando se envía un paquete de entrada al trabajador que ejecuta DoFn y ha transcurrido un tiempo considerable sin que haya resultados disponibles.

Esto suele deberse a una única operación de larga duración en el código de usuario. Otros problemas pueden manifestarse como operaciones de procesamiento prolongadas. Por ejemplo, los errores que se producen y se vuelven a intentar dentro de DoFn, los reintentos durante largos periodos o los fallos del arnés de trabajador debido a factores como los errores de falta de memoria pueden provocar estos largos tiempos de procesamiento.

Si el cálculo afectado está en el código de usuario, busca formas de optimizar el código o de limitar el tiempo de ejecución. Para ayudar con la depuración, los registros del trabajador muestran seguimientos de pila de las operaciones que se han quedado bloqueadas durante más de 5 minutos.

Lectura lenta del estado persistente

El cálculo dedica una cantidad de tiempo considerable a leer el estado persistente como parte de la ejecución de DoFn. Esto puede deberse a un estado persistente excesivamente grande o a demasiadas lecturas. Prueba a reducir el tamaño del estado persistente o la frecuencia de las lecturas. También puede tratarse de un problema temporal debido a la lentitud del estado persistente subyacente.

Escritura de estado persistente lenta

El cálculo dedica una cantidad de tiempo considerable a escribir el estado persistente durante la confirmación de los resultados del procesamiento. Puede que se deba a un estado persistente excesivamente grande. Considera la opción de reducir el tamaño del estado persistente. También puede tratarse de un problema temporal debido a la lentitud del estado persistente subyacente.

Confirmación rechazada

No se puede confirmar el procesamiento de datos en el estado persistente porque no es válido. Esto suele deberse a que se ha superado uno de los límites operativos. Consulta los registros para obtener más información o ponte en contacto con el equipo de Asistencia.

Particiones de origen de Apache Kafka insuficientes

El cálculo de la fuente de Apache Kafka no tiene suficientes particiones. Para resolver este problema, prueba lo siguiente:

  • Aumenta el número de particiones de Kafka.
  • Usa una transformación Redistribute para redistribuir y paralelizar los datos de forma más eficiente.

Para obtener más información, consulta la sección Paralelismo de la página Leer de Apache Kafka a Dataflow.

Paralelismo de origen insuficiente

Un cálculo de origen no tiene suficiente paralelismo. Si es posible, aumenta la paralelización en la fuente. Si no puedes aumentar la paralelización y el trabajo usa el modo al menos una vez, prueba a añadir una transformación Redistribute a la canalización.

Claves activas o paralelismo de claves insuficiente

El trabajo tiene claves activas o un paralelismo de claves insuficiente.

Dataflow procesa los mensajes de forma secuencial para cada clave de partición. Mientras Dataflow procesa un lote de mensajes de una clave determinada, los demás mensajes entrantes de esa clave se ponen en cola hasta que se completa el lote actual.

Si Dataflow no puede procesar suficientes claves distintas en paralelo, puede provocar un cuello de botella. Por ejemplo, los datos pueden tener muy pocas claves distintas o algunas claves pueden estar sobrerrepresentadas en los datos ("claves activas"). Para obtener más información, consulta el artículo Solucionar problemas de tareas de streaming lentas o bloqueadas.

vCPUs con aprovisionamiento insuficiente

La tarea no tiene suficientes vCPUs de trabajador. Esta situación se produce cuando el trabajo ya se ha escalado al máximo, la utilización de la vCPU es alta y sigue habiendo un trabajo pendiente. Es posible que tengas que aumentar el número máximo de trabajadores aprovisionados para esta tarea. Por ejemplo, puedes aumentar este número actualizando el intervalo de escalado automático. También puedes buscar formas de reducir el uso de la CPU virtual haciendo cambios en el código de la canalización o en la carga de trabajo. Puedes usar el profiler de Cloud para buscar oportunidades de optimización.

Uso elevado de vCPUs, esperando un aumento de escala

El trabajo tiene un uso de vCPU elevado, pero se puede aumentar la escala. Es probable que esta condición sea temporal hasta que se pueda aumentar la resolución. Puedes monitorizar el autoescalado para ver las decisiones que toma. Si esta condición persiste durante mucho tiempo o se produce con frecuencia, es posible que tengas que cambiar la configuración del autoescalado asignando un valor de uso de los trabajadores diferente para que la tarea pueda aumentar la escala de forma más proactiva.

Problema de comunicación con los trabajadores

Dataflow no puede comunicarse con todas las VMs de trabajador. Comprueba el estado de las VMs de los trabajadores de la tarea. Estos son algunos de los posibles motivos:

  • Hay un problema al aprovisionar las VMs de los trabajadores.
  • El grupo de VMs de trabajador se elimina mientras se ejecuta el trabajo.
  • Problemas de red.
La fuente de Pub/Sub tiene errores de extracción.

Hay errores al extraer datos de la fuente de Pub/Sub. Comprueba que el tema y las suscripciones necesarios existen y verifica la cuota y la configuración. También puedes consultar los registros para ver si hay errores.

La fuente de Pub/Sub no tiene suficiente paralelismo

El cálculo de la fuente de Pub/Sub no tiene suficientes claves de Pub/Sub. Si ves esta advertencia, ponte en contacto con el equipo de Asistencia.

Se ha limitado la velocidad de la fuente de Pub/Sub por un motivo desconocido

El cálculo de la fuente de Pub/Sub se limita al leer datos de Pub/Sub por un motivo desconocido. Este problema puede ser temporal. Comprueba si hay problemas de configuración de Pub/Sub, si faltan permisos de gestión de identidades y accesos o si se han alcanzado los límites de cuota. Sin embargo, si el problema persiste y no se debe a ninguna de las causas anteriores, ponte en contacto con el equipo de Asistencia.

La publicación de un receptor de Pub/Sub es lenta o se bloquea

El cálculo del receptor de Pub/Sub es lento o se bloquea. Este problema puede deberse a un error de configuración o a un límite de cuota.

Tiempo de cola de trabajo alto

La antigüedad de trabajo más antigua apta es alta debido a la gran cantidad de claves y a la velocidad a la que se procesan. En esta situación, puede que cada operación no sea anormalmente larga, pero el retraso general de la cola es alto.

Dataflow usa un solo subproceso de procesamiento por clave de fragmentación y el número de subprocesos de procesamiento es limitado. El retraso de la cola es aproximadamente igual a la proporción de claves y de subprocesos, multiplicada por la latencia en el subproceso de cada paquete de procesamiento de una clave:

(key count / total harness threads) * latency per bundle

Prueba las siguientes soluciones:

  • Aumenta el número de trabajadores. Consulta Autoescalado de streaming.
  • Aumenta el número de hilos de la harness de trabajador. Define la opción de la canalización numberOfWorkerHarnessThreads / number_of_worker_harness_threads.
  • Reduce el número de teclas.
  • Disminuir la latencia de la operación.
Un problema transitorio con el backend de Streaming Engine

Hay un problema de configuración o de funcionamiento con el backend de Streaming Engine. Este problema puede ser temporal. Si el problema persiste, ponte en contacto con el equipo de Asistencia.

Una causa indeterminable

No se puede determinar con certeza la causa del retraso. Este problema puede ser temporal. Si el problema persiste, ponte en contacto con el equipo de Asistencia.

Siguientes pasos