Un collo di bottiglia si verifica quando un passaggio, una fase o un worker rallenta il job complessivo. I colli di bottiglia possono portare a lavoratori inattivi e a un aumento della latenza.
Se Dataflow rileva un collo di bottiglia, il grafico del job mostra un avviso e il riquadro Informazioni passaggio elenca il tipo di collo di bottiglia e la causa, se nota. Dataflow esporta anche le informazioni sul rilevamento dei colli di bottiglia in una metrica Stackdriver, che presenta i dati come serie temporale. In questo modo puoi visualizzare i colli di bottiglia nel tempo o in passato.
Informazioni sui colli di bottiglia
Quando Dataflow esegue una pipeline di streaming, il job è costituito da una serie di componenti, come shuffling di streaming, thread di elaborazione funzione definita dall'utente'utente (DoFn
) e checkpointing dello stato permanente. Per facilitare il flusso di dati, Dataflow utilizza
le code per connettere questi componenti. I dati vengono inviati dall'upstream al downstream.
In molte pipeline, la capacità di velocità effettiva complessiva è limitata da un singolo componente, creando un collo di bottiglia nella pipeline. La velocità con cui i dati possono attraversare un collo di bottiglia limita la velocità con cui la pipeline può accettare ed elaborare i dati di input.
Ad esempio, considera una pipeline in cui l'elaborazione DoFn
avviene a valle di un
rimescolamento in streaming. Una coda tra loro memorizza i dati mischiati ma non elaborati. Se l'elaborazione DoFn
non riesce a consumare i dati alla stessa velocità con cui lo shuffle
in streaming li produce, la coda aumenta. Un collo di bottiglia prolungato può causare il raggiungimento della capacità della coda. A quel punto, l'ulteriore rimescolamento viene messo in pausa e il
backlog si propaga a monte. Anche le code più a monte accumulano backlog,
causando infine un rallentamento che si estende all'origine dati, il che significa che l'intera
pipeline non riesce a tenere il passo con l'input.
Quando si verifica un collo di bottiglia, una parte sostanziale della pipeline potrebbe sembrare non integra, anche se è un singolo punto della pipeline a causare l'arretrato. Questo comportamento può rendere difficile il debug dei colli di bottiglia. L'obiettivo del rilevamento dei colli di bottiglia è identificare la posizione e la causa esatte, eliminando le congetture, in modo da poter risolvere la causa principale.
Dataflow rileva un collo di bottiglia quando un ritardo supera la soglia di cinque minuti. Se il ritardo non supera questa soglia, Dataflow non rileva un collo di bottiglia.
Il rilevamento dei colli di bottiglia non richiede sempre un intervento e dipende dal tuo caso d'uso. Una pipeline può funzionare normalmente con ritardi temporanei superiori a cinque minuti. Se questo è accettabile per il tuo caso d'uso, potresti non dover risolvere i colli di bottiglia indicati.
Tipi di colli di bottiglia
Quando Dataflow rileva un collo di bottiglia, l'interfaccia di monitoraggio indica la gravità del problema. I colli di bottiglia rientrano nelle seguenti categorie:
- L'elaborazione è bloccata e non procede
- L'avanzamento della pipeline viene completamente interrotto in questo passaggio.
- L'elaborazione è in corso, ma è in ritardo.
- La pipeline non riesce a elaborare i dati in arrivo alla stessa velocità con cui arrivano. Di conseguenza, la coda è in aumento.
- L'elaborazione è in corso, ma il backlog è stabile
- La pipeline sta facendo progressi e la velocità di elaborazione è paragonabile alla velocità di input. L'elaborazione è abbastanza veloce da impedire la crescita del backlog, ma il backlog accumulato non diminuisce in modo significativo.
- L'elaborazione è in corso e sta recuperando da un backlog
- Il backlog sta diminuendo, ma l'attuale collo di bottiglia impedisce alla pipeline di recuperare più velocemente. Se avvii una pipeline con un backlog, questo stato potrebbe essere normale e non richiedere alcun intervento. Monitora l'avanzamento per vedere se il backlog continua a diminuire.
Cause dei colli di bottiglia
L'interfaccia di monitoraggio mostra la causa del collo di bottiglia, se nota. Utilizza queste informazioni per risolvere il problema.
- Operazioni con tempi di elaborazione lunghi
Il calcolo ha un tempo di elaborazione lungo. Ciò si verifica ogni volta che un bundle di input viene inviato al worker che esegue
DoFn
e dopo un periodo di tempo significativo senza che siano disponibili risultati.Il più delle volte, questo è il risultato di una singola operazione a lunga esecuzione nel codice utente. Altri problemi possono manifestarsi come operazioni con tempi di elaborazione lunghi. Ad esempio, gli errori generati e riprovati all'interno di
DoFn
, i nuovi tentativi per lunghi periodi di tempo o gli arresti anomali del worker harness dovuti a fattori quali gli errori di esaurimento della memoria possono causare questi lunghi tempi di elaborazione.Se il calcolo interessato si trova nel codice utente, cerca modi per ottimizzare il codice o limitare il tempo di esecuzione. Per facilitare il debug, i log del worker mostrano le analisi dello stack per le operazioni bloccate da più di 5 minuti.
- Lettura lenta dello stato persistente
Il calcolo impiega una quantità significativa di tempo per leggere lo stato persistente nell'ambito dell'esecuzione di
DoFn
. Ciò potrebbe essere il risultato di uno stato persistente eccessivamente grande o di troppe letture. Valuta la possibilità di ridurre le dimensioni dello stato persistente o la frequenza delle letture. Potrebbe anche trattarsi di un problema temporaneo dovuto alla lentezza dello stato permanente sottostante.- Scrittura lenta dello stato persistente
Il calcolo richiede molto tempo per scrivere lo stato persistente durante il commit dei risultati dell'elaborazione. Ciò potrebbe essere il risultato di uno stato persistente eccessivamente grande. Valuta la possibilità di ridurre le dimensioni dello stato persistente. Potrebbe anche trattarsi di un problema temporaneo dovuto alla lentezza dello stato persistente sottostante.
- Commit rifiutato
L'elaborazione dei dati non può essere eseguita in modo permanente perché non è valida. Di solito, questo accade perché è stato superato uno dei limiti operativi. Controlla i log per maggiori dettagli o contatta l'assistenza.
- Numero insufficiente di partizioni dell'origine Apache Kafka
Il calcolo dell'origine Apache Kafka ha partizioni insufficienti. Per risolvere il problema, prova quanto segue:
- Aumenta il numero di partizioni Kafka.
- Utilizza una trasformazione
Redistribute
per ridistribuire e parallelizzare i dati in modo più efficiente.
Per saperne di più, consulta la sezione Parallelismo nella pagina Lettura da Apache Kafka a Dataflow.
- Parallelismo origine insufficiente
Un calcolo dell'origine ha un parallelismo insufficiente. Se possibile, aumenta il parallelismo all'interno dell'origine. Se non riesci ad aumentare il parallelismo e il job utilizza la modalità almeno una volta, prova ad aggiungere una trasformazione
Redistribute
alla pipeline.- Chiavi utilizzate di frequente o parallelismo insufficiente delle chiavi
Il job ha tasti di scelta rapida o parallelismo insufficiente delle chiavi.
Per ogni chiave di partizionamento, Dataflow elabora i messaggi in serie. Mentre Dataflow elabora un batch di messaggi per una determinata chiave, gli altri messaggi in arrivo per quella chiave vengono messi in coda fino al completamento del batch corrente.
Se Dataflow non riesce a elaborare in parallelo un numero sufficiente di chiavi distinte, può causare un collo di bottiglia. Ad esempio, i dati potrebbero avere un numero insufficiente di chiavi distinte o alcune chiavi potrebbero essere sovra rappresentate nei dati ("hot keys"). Per saperne di più, vedi Risolvere i problemi relativi ai job di streaming lenti o bloccati.
- Provisioning insufficiente delle vCPU
Il job non ha un numero sufficiente di vCPU worker. Questa situazione si verifica quando il job è già scalato al massimo, l'utilizzo di vCPU è elevato e c'è ancora un arretrato. Potresti dover aumentare il numero massimo di worker di cui è stato eseguito il provisioning per questo job. Ad esempio, puoi aumentare questo numero con un aggiornamento dell'intervallo di scalabilità automatica. In alternativa, cerca modi per ridurre l'utilizzo delle vCPU modificando il codice della pipeline o il workload. Puoi utilizzare Cloud Profiler per cercare opportunità di ottimizzazione.
- Utilizzo elevato della vCPU, in attesa di scale up
Il job ha un utilizzo elevato della vCPU, ma c'è spazio per lo scale up. Questa condizione è probabilmente transitoria finché non è possibile eseguire l'upscaling. Puoi monitorare la scalabilità automatica per visualizzare le decisioni di scalabilità automatica. Se questa condizione persiste a lungo o si verifica di frequente, potrebbe essere necessario modificare la configurazione della scalabilità automatica impostando un diverso suggerimento sull'utilizzo dei worker per consentire al job di aumentare le risorse in modo più proattivo.
- Problema di comunicazione con i worker
Dataflow non può comunicare con tutte le VM worker. Controlla lo stato delle VM worker del job. Tra le possibili cause rientrano:
- Si è verificato un problema durante il provisioning delle VM worker.
- Il pool di VM worker viene eliminato durante l'esecuzione del job.
- Problemi di Networking.
- L'origine Pub/Sub ha errori di pull.
Si sono verificati errori durante il pull dall'origine Pub/Sub. Verifica che esistano l'argomento e gli abbonamenti richiesti e controlla la quota e la configurazione. Puoi anche controllare la presenza di errori nei log.
- Origine Pub/Sub con parallelismo insufficiente
Il calcolo dell'origine Pub/Sub ha un numero insufficiente di chiavi Pub/Sub. Se visualizzi questo avviso, contatta l'assistenza.
- Origine Pub/Sub limitata per motivi sconosciuti
Il calcolo dell'origine Pub/Sub viene limitato durante la lettura da Pub/Sub per un motivo sconosciuto. Questo problema potrebbe essere temporaneo. Verifica la presenza di problemi di configurazione di Pub/Sub, autorizzazioni IAM mancanti o limiti di quota. Tuttavia, se nessuna delle aree precedenti è la causa principale e il problema persiste, contatta l'assistenza.
- Pubblicazione del sink Pub/Sub lenta o bloccata
Il calcolo del sink Pub/Sub è lento o bloccato. Questo problema potrebbe essere causato da un problema di configurazione o da un limite di quota.
- Tempo di coda di lavoro elevato
L'età di lavoro idonea più vecchia è elevata a causa del numero elevato di chiavi e della velocità con cui vengono elaborate. In questa situazione, ogni operazione potrebbe non essere anormalmente lunga, ma il ritardo complessivo della coda è elevato.
Dataflow utilizza un singolo thread di elaborazione per chiave di sharding e il numero di thread di elaborazione è limitato. Il ritardo di accodamento è approssimativamente uguale al rapporto tra chiavi e thread, moltiplicato per la latenza on-thread per ogni bundle di elaborazione per una chiave:
(key count / total harness threads) * latency per bundle
Prova le seguenti soluzioni:
- Aumenta il numero di worker. Vedi Scalabilità automatica dello streaming.
- Aumenta il numero di thread worker harness. Imposta l'opzione pipeline
numberOfWorkerHarnessThreads
/number_of_worker_harness_threads
. - Diminuisci il numero di chiavi.
- Ridurre la latenza dell'operazione.
- Un problema temporaneo con il backend di Streaming Engine
Si è verificato un problema di configurazione o operativo con il backend di Streaming Engine. Questo problema potrebbe essere temporaneo. Se il problema persiste, contatta l'assistenza.
Passaggi successivi
- Risolvere i problemi relativi a job lenti o bloccati
- Monitorare il rendimento della pipeline utilizzando Profiler