Risolvere i problemi relativi agli errori di scadenza di Spanner superata

Questa pagina fornisce una panoramica degli errori di superamento della scadenza di Spanner: cosa sono, perché si verificano e come risolverli.

Quando si accede alle API Spanner, le richieste potrebbero non riuscire a causa di errori DEADLINE_EXCEEDED. Questo errore indica che non è stata ricevuta una risposta entro il periodo di timeout configurato.

Un errore di superamento della scadenza potrebbe verificarsi per diversi motivi, ad esempio istanze Spanner sovraccariche, schemi non ottimizzati o query non ottimizzate. Questa pagina descrive gli scenari comuni in cui si verifica un errore di scadenza superata e fornisce una guida su come esaminare e risolvere questi problemi.

Filosofia di Spanner relativa a scadenza e tentativi

La filosofia di Spanner relativa a scadenza e nuovi tentativi è diversa da quella di molti altri sistemi. In Spanner, devi specificare una scadenza del timeout come periodo di tempo massimo in cui una risposta è utile. L'impostazione di una scadenza artificialmente breve solo per riprovare immediatamente la stessa operazione non è consigliata, in quanto ciò porterà a situazioni in cui le operazioni non vengono mai completate. In questo contesto, le seguenti strategie e operazioni non sono consigliate; sono controproducenti e vanificano il comportamento di ripetizione interna di Spanner:

  • Impostare una scadenza troppo breve. Ciò significa che l'operazione non è resiliente agli aumenti occasionali della latenza finale e non può essere completata prima che scada il timeout. Imposta invece una scadenza che corrisponda al periodo di tempo massimo in cui una risposta è utile.

  • Impostazione di una scadenza troppo lunga e annullamento dell'operazione prima che la scadenza venga superata. Ciò comporta nuovi tentativi e spreco di lavoro a ogni tentativo. Nel complesso, ciò può creare un carico aggiuntivo significativo sulla tua istanza.

Che cos'è un errore di superamento della scadenza?

Quando utilizzi una delle librerie client Spanner, il livello gRPC sottostante si occupa della comunicazione, del marshalling, dell'unmarshalling e dell'applicazione delle scadenze. Le scadenze consentono all'applicazione di specificare per quanto tempo è disposta ad attendere il completamento di una richiesta prima che venga terminata con l'errore di scadenza superata.

La guida alla configurazione del timeout mostra come specificare scadenze (o timeout) in ciascuna delle librerie client Spanner supportate. Le librerie client Spanner utilizzano impostazioni predefinite di timeout e criteri di riprova definite nei seguenti file di configurazione:

Per scoprire di più sulle scadenze gRPC, consulta gRPC e scadenze.

Come esaminare e risolvere gli errori comuni di superamento della scadenza

Potresti riscontrare errori DEADLINE_EXCEEDED per i seguenti tipi di problemi:

Problemi con l'API di accesso ai dati

Un'istanza Spanner deve essere configurata in modo appropriato per i tuoi carichi di lavoro specifici per evitare problemi con l'API di accesso ai dati. Le sezioni seguenti descrivono come esaminare e risolvere diversi problemi relativi all'API di accesso ai dati.

Controlla il carico della CPU dell'istanza Spanner

La latenza delle richieste può aumentare in modo significativo quando l'utilizzo della CPU supera la soglia consigliata. Puoi controllare l'utilizzo della CPU di Spanner nella console di monitoraggio fornita nella console Google Cloud . Puoi anche creare avvisi in base all'utilizzo della CPU dell'istanza.

Risoluzione

Per i passaggi per ridurre l'utilizzo della CPU dell'istanza, consulta Riduzione dell'utilizzo della CPU.

Controlla la suddivisione della latenza end-to-end della richiesta

Quando una richiesta viene inviata dal client ai server Spanner e viceversa, devono essere eseguiti diversi hop di rete: dalla libreria client a Google Front End (GFE), dal GFE al frontend dell'API Spanner e infine dal frontend dell'API Spanner al database Spanner. Se si verificano problemi di rete in una di queste fasi, potresti visualizzare errori di scadenza superata.

È possibile acquisire la latenza in ogni fase. Per scoprire di più, vedi Punti di latenza in una richiesta Spanner. Per scoprire dove si verifica la latenza in Spanner, vedi Identificare dove si verifica la latenza in Spanner.

Risoluzione

Una volta ottenuta la suddivisione della latenza, puoi utilizzare le metriche per diagnosticare la latenza, capire perché si verifica e trovare soluzioni.

Problemi con l'API di dati

Alcuni pattern di utilizzo non ottimali dell'API Data di Spanner potrebbero causare errori di superamento della scadenza. Questa sezione fornisce linee guida su come verificare la presenza di questi pattern di utilizzo non ottimali.

Controllare la presenza di query costose

Il tentativo di eseguire query costose che non vengono eseguite entro il termine di timeout configurato nelle librerie client potrebbe generare un errore di scadenza superata. Alcuni esempi di query costose includono, a titolo esemplificativo, scansioni complete di una tabella di grandi dimensioni, cross-join su più tabelle di grandi dimensioni o un'esecuzione di query con un predicato su una colonna non chiave (anche una scansione completa della tabella).

Puoi esaminare le query costose utilizzando la tabella delle statistiche delle query e la tabella delle statistiche delle transazioni. Queste tabelle mostrano informazioni su query e transazioni a esecuzione lenta, ad esempio il numero medio di righe lette, i byte letti medi, il numero medio di righe analizzate e altro ancora. Inoltre, puoi generare piani di esecuzione delle query per esaminare ulteriormente come vengono eseguite le query.

Risoluzione

Per ottimizzare le query, utilizza la guida alle best practice per le query SQL. Puoi anche utilizzare i dati ottenuti tramite le tabelle delle statistiche menzionate in precedenza e i piani di esecuzione per ottimizzare le query e apportare modifiche allo schema dei tuoi database. Queste best practice possono contribuire a ridurre il tempo di esecuzione delle istruzioni, contribuendo potenzialmente a eliminare gli errori di scadenza del termine.

Verifica la presenza di conflitti blocco

Le transazioni Spanner devono acquisire blocchi per il commit. Le applicazioni in esecuzione con un throughput elevato potrebbero causare la competizione delle transazioni per le stesse risorse, aumentando l'attesa per ottenere i blocchi e influendo sulle prestazioni complessive. Ciò potrebbe comportare il superamento delle scadenze per qualsiasi richiesta di lettura o scrittura.

Puoi trovare la causa principale delle transazioni di lettura/scrittura con latenza elevata utilizzando la tabella delle statistiche sui blocchi e consultando questo post del blog. Nella tabella delle statistiche di blocco, puoi trovare le chiavi di riga con i tempi di attesa di blocco più elevati.

Questa guida alla risoluzione dei problemi relativi ai conflitti di blocco spiega come trovare le transazioni che accedono alle colonne coinvolte nel conflitto di blocco. Puoi anche scoprire quali transazioni sono coinvolte in un conflitto di blocco utilizzando la guida alla risoluzione dei problemi con i tag di transazione.

Risoluzione

Applica queste best practice per ridurre le contese di blocco. Inoltre, utilizza le transazioni di sola lettura per i casi d'uso di lettura semplice per evitare conflitti di blocco con le scritture. L'utilizzo di transazioni di lettura/scrittura deve essere riservato a scritture o flussi di lavoro di lettura/scrittura misti. Seguendo questi passaggi dovresti migliorare la latenza complessiva del tempo di esecuzione della transazione e ridurre gli errori di scadenza superata.

Verificare la presenza di schemi non ottimizzati

Prima di progettare uno schema di database ottimale per il tuo database Spanner, devi considerare i tipi di query che verranno eseguiti nel tuo database. Gli schemi non ottimali possono causare problemi di prestazioni durante l'esecuzione di alcune query. Questi problemi di prestazioni potrebbero impedire il completamento delle richieste entro la scadenza configurata.

Risoluzione

La progettazione dello schema più ottimale dipende dalle letture e dalle scritture effettuate nel database. Le guide alle best practice di progettazione dello schema e alle best practice SQL devono essere seguite indipendentemente dalle specifiche dello schema. Seguendo queste guide, eviterai i problemi di progettazione dello schema più comuni. Altre cause principali di prestazioni scadenti sono attribuite a scelta delle chiavi primarie, layout della tabella (vedi utilizzo di tabelle interleaved per un accesso più rapido), progettazione dello schema (vedi ottimizzazione dello schema per le prestazioni), e alle prestazioni del nodo configurato all'interno dell'istanza Spanner (vedi Panoramica delle prestazioni di Spanner).

Controllare la presenza di hotspot

Poiché Spanner è un database distribuito, la progettazione dello schema deve tenere conto della prevenzione degli hotspot. Ad esempio, la creazione di colonne con valori in aumento monotonico limiterà il numero di suddivisioni con cui Spanner può lavorare per distribuire il carico di lavoro in modo uniforme. Questi colli di bottiglia potrebbero causare timeout. Inoltre, puoi utilizzare lo strumento di visualizzazione delle chiavi per risolvere i problemi di rendimento causati dagli hotspot.

Risoluzione

Fai riferimento alle soluzioni identificate nella sezione precedente Verifica la presenza di schemi non ottimizzati come primo passo per risolvere il problema. Riprogetta lo schema del database e utilizza indici intercalati per evitare indici che potrebbero causare hotspot. Se questi passaggi non risolvono il problema, consulta la guida alla scelta di una chiave primaria per evitare gli hotspot. Infine, evita pattern di traffico non ottimali, come letture di intervalli di grandi dimensioni, che potrebbero impedire la suddivisione basata sul carico.

Verificare la presenza di timeout configurati in modo errato

Le librerie client forniscono timeout predefiniti ragionevoli per tutte le richieste in Spanner. Tuttavia, queste configurazioni predefinite potrebbero dover essere modificate per il tuo workload specifico. Ti consigliamo di osservare il costo delle tue query e di modificare le scadenze in modo che siano adatte al tuo caso d'uso specifico.

Risoluzione

Le impostazioni predefinite per i timeout sono adatte alla maggior parte dei casi d'uso. Gli utenti possono ignorare queste configurazioni (consulta la guida personalizzata a timeout e tentativi), ma non è consigliabile utilizzare timeout più aggressivi di quelli predefiniti. Se decidi di modificare il timeout, impostalo sulla quantità effettiva di tempo che l'applicazione è disposta ad attendere per il risultato. Puoi sperimentare timeout configurati più lunghi, ma non impostare mai un timeout più breve del tempo effettivo che l'applicazione è disposta ad attendere, in quanto ciò causerebbe un numero maggiore di tentativi per l'operazione.

Problemi con l'API Admin

Le richieste dell'API Admin sono operazioni costose rispetto alle richieste dell'API di dati. Le richieste di amministrazione come CreateInstance, CreateDatabase o CreateBackups possono richiedere molti secondi prima di restituire una risposta. Le librerie client Spanner impostano scadenze di 60 minuti sia per le richieste dell'amministratore dell'istanza che del database. In questo modo, il server ha la possibilità di completare la richiesta prima che il client riprovi o non riesca.

Risoluzione

Se utilizzi la libreria client Spanner di Google per accedere all'API amministratore, assicurati che la libreria client sia aggiornata e utilizzi l'ultima versione. Se accedi all'API Spanner direttamente tramite una libreria client che hai creato, assicurati di non avere impostazioni di scadenza più aggressive rispetto a quelle predefinite (60 minuti) per le richieste di amministratore di istanza e database.

Google Cloud problemi della console

Le query inviate dalla pagina Spanner Studio della console Google Cloud non possono superare i cinque minuti. Se crei una query costosa che richiede più di cinque minuti per essere eseguita, visualizzerai il seguente messaggio di errore:

Screenshot del messaggio di errore relativo al superamento della scadenza della console Google Cloud

Il backend annullerà la query non riuscita e la transazione potrebbe essere rollback se necessario.

Risoluzione

Puoi riscrivere la query utilizzando la guida alle best practice per le query SQL.

Problemi di Dataflow

In Apache Beam, la configurazione predefinita del timeout è due ore per le operazioni di lettura e 15 secondi per le operazioni di commit. Queste configurazioni consentono operazioni più lunghe rispetto ai timeout dei termini per le librerie client autonome. Tuttavia, è ancora possibile ricevere un errore di timeout e scadenza superata quando gli elementi di lavoro sono troppo grandi. Se necessario, puoi personalizzare la configurazione del timeout del commit di Apache Beam.

Risoluzione

Se si verifica un errore di scadenza superata nei passaggi ReadFromSpanner / Execute query / Read from Spanner / Read from Partitions, controlla la tabella delle statistiche delle query per scoprire quale query ha analizzato un numero elevato di righe. Poi, modifica queste query per cercare di ridurre il tempo di esecuzione.

Un altro esempio di errore di superamento della scadenza di Dataflow è mostrato nel seguente messaggio di eccezione:

exception:
     org.apache.beam.sdk.util.UserCodeException:
     com.google.cloud.spanner.SpannerException: DEADLINE_EXCEEDED:
     io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED: deadline exceeded after
     3599.999905380s.
     [remote_addr=batch-spanner.googleapis.com/172.217.5.234:443] at
 org.apache.beam.runners.dataflow.worker.GroupAlsoByWindowsParDoFn$1.output(GroupAlsoByWindowsParDoFn.java:184)

Questo timeout si è verificato perché gli elementi di lavoro sono troppo grandi. Nell'esempio precedente, potrebbero essere utili i due consigli seguenti. Innanzitutto, puoi provare ad attivare il servizio di riproduzione casuale, se non è ancora attivo. In secondo luogo, puoi provare a modificare le configurazioni nella lettura del database, ad esempio maxPartitions e partitionSizeBytes. Per ulteriori informazioni, consulta PartitionOptions per provare a ridurre le dimensioni dell'elemento di lavoro. Un esempio di come farlo è disponibile in questo modello Dataflow.

Ulteriori risorse per la risoluzione dei problemi relativi al superamento del termine

Se continui a visualizzare l'errore DEADLINE_EXCEEDED dopo aver completato i passaggi per la risoluzione dei problemi, apri una richiesta di assistenza se si verificano i seguenti scenari:

  • Una latenza elevata di Google Front End (GFE), ma una bassa latenza delle richieste dell'API Spanner
  • Latenza elevata delle richieste API Spanner, ma bassa latenza delle query

Puoi anche consultare le seguenti risorse per la risoluzione dei problemi: