Risolvere i problemi relativi al superamento della scadenza di Spanner

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

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

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

La filosofia della scadenza e dei tentativi di Spanner

La filosofia delle scadenze e dei tentativi di Spanner differisce da molti altri sistemi. In Spanner, devi specificare una scadenza di timeout come periodo di tempo massimo in cui una risposta è utile. Non è consigliabile impostare una scadenza artificialmente breve solo per ritentare immediatamente la stessa operazione, in quanto ciò causerebbe situazioni in cui le operazioni non vengono mai completate. In questo contesto, le strategie e le operazioni seguenti non sono consigliate; sono controproduttive e non consentono il comportamento dei nuovi tentativi interni di Spanner:

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

  • L'impostazione di una scadenza troppo lunga e l'annullamento dell'operazione prima della scadenza. Questo comporta nuovi tentativi e sprechi di lavoro a ogni tentativo. Nell'aggregato, ciò può creare un carico aggiuntivo significativo sull'istanza.

Che cos'è un errore di superamento della scadenza?

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

La guida alla configurazione del timeout mostra come specificare scadenze (o timeout) in ciascuna delle librerie client di Spanner supportate. Le librerie client di Spanner utilizzano il timeout predefinito e le impostazioni dei criteri per i nuovi tentativi, definite nei seguenti file di configurazione:

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

Come indagare e risolvere gli errori comuni relativi al superamento delle scadenze

Potresti riscontrare DEADLINE_EXCEEDED errori per i seguenti tipi di problemi:

Problemi relativi all'API Data Access

Un'istanza Spanner deve essere configurata in modo appropriato per i tuoi carichi di lavoro specifici al fine di evitare problemi dell'API di accesso ai dati. Le seguenti sezioni descrivono come indagare 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 notevolmente poiché l'utilizzo della CPU supera la soglia di integrità 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 istruzioni su come ridurre l'utilizzo della CPU dell'istanza, consulta Ridurre l'utilizzo della CPU.

Controlla l'analisi della latenza end-to-end della richiesta

Mentre una richiesta passa dal client ai server Spanner e viceversa, è necessario effettuare diversi hop di rete: dalla libreria client al 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 relativi al superamento della scadenza.

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

Risoluzione

Una volta ottenuta l'analisi della latenza, puoi utilizzare le metriche per diagnosticare la latenza, capire il motivo del problema e trovare soluzioni.

Problemi relativi all'API di dati

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

Cercare query costose

L'esecuzione di query costose che non vengono eseguite entro la scadenza di timeout configurata nelle librerie client potrebbe comportare un errore di superamento della scadenza. Alcuni esempi di query costose includono, a titolo esemplificativo, analisi complete di una tabella di grandi dimensioni, cross-join su diverse 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 query costose utilizzando la tabella delle statistiche sulle query e la tabella delle statistiche sulle transazioni. Queste tabelle mostrano informazioni su query e transazioni con esecuzione lenta, ad esempio il numero medio di righe lette, la media di byte letti, il numero medio di righe analizzate e altro ancora. Inoltre, puoi generare piani di esecuzione delle query per esaminare ulteriormente il modo in cui vengono eseguite le query.

Risoluzione

Per ottimizzare le query, consulta 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 ai tuoi database. Queste best practice possono aiutare a ridurre il tempo di esecuzione delle istruzioni, contribuendo potenzialmente a eliminare gli errori di superamento della scadenza.

Verifica la contesa del blocco

Le transazioni Spanner devono acquisire blocchi per eseguire il commit. Le applicazioni eseguite con velocità effettiva elevata possono causare la competizione delle transazioni per le stesse risorse, causando un aumento dell'attesa per l'ottenimento dei blocchi e con un impatto sulle prestazioni generali. Ciò potrebbe comportare il superamento delle scadenze per eventuali richieste di lettura o scrittura.

Puoi trovare la causa principale delle transazioni di lettura/scrittura ad alta latenza utilizzando la tabella delle statistiche di blocco e consultando il seguente post del blog. Nella tabella delle statistiche di blocco puoi trovare le chiavi di riga con i tempi di attesa del blocco più elevati.

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

Risoluzione

Applica queste best practice per ridurre i conflitti dei blocchi. Inoltre, utilizza le transazioni di sola lettura per i casi d'uso di lettura normale al fine di evitare conflitti di blocco con le scritture. L'utilizzo delle transazioni di lettura-scrittura deve essere riservato alle operazioni di scrittura o a flussi di lavoro misti di lettura-scrittura. Seguendo questi passaggi, dovresti migliorare la latenza complessiva del tempo di esecuzione delle transazioni e ridurre gli errori di superamento della scadenza.

Verifica la presenza di schemi non ottimizzati

Prima di progettare uno schema ottimale per il tuo database Spanner, considera i tipi di query che verranno eseguite 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 ottimale dello schema dipenderà dalle letture e le scritture effettuate sul database. È consigliabile seguire le guide alle best practice per la progettazione dello schema e alle best practice SQL indipendentemente dalle specifiche dello schema. Seguendo queste guide, eviterai i problemi di progettazione dello schema più comuni. Alcune altre cause principali delle scarse prestazioni sono attribuite alla scelta delle chiavi primarie, al layout della tabella (consulta Utilizzo delle tabelle con interleaving), alla progettazione dello schema (consulta l'articolo sull'ottimizzazione dello schema per le prestazioni) e alle prestazioni del nodo configurato all'interno dell'istanza Spanner (consulta la Panoramica delle prestazioni di Spanner).

Verifica 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 monotonicamente crescenti limiterà il numero di suddivisioni con cui Spanner può lavorare per distribuire il carico di lavoro in modo uniforme. Questi colli di bottiglia potrebbero dar luogo a timeout. Inoltre, puoi usare Key Visualizer per risolvere i problemi di prestazioni causati dagli hotspot.

Risoluzione

Come primo passaggio per risolvere il problema, fai riferimento alle risoluzioni identificate nella sezione precedente Verificare la presenza di schemi non ottimizzati. Riprogetta lo schema del database e utilizza indici con interleaving per evitare indici che potrebbero causare l'hotspotting. Se questi passaggi non attenuano il problema, consulta la guida Scegliere una chiave primaria per impedire gli hotspot. Infine, evita pattern di traffico non ottimali come letture su grandi intervalli che potrebbero impedire la suddivisione basata sul carico.

Controllare se sono presenti timeout configurati in modo errato

Le librerie client forniscono valori predefiniti di timeout ragionevoli per tutte le richieste in Spanner. Tuttavia, potrebbe essere necessario regolare queste configurazioni predefinite in base al carico di lavoro specifico. Vale la pena osservare il costo delle query e modificare le scadenze in base 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 eseguire l'override di queste configurazioni (consulta la guida al timeout personalizzato e ai nuovi tentativi), ma è sconsigliato utilizzare timeout più restrittivi rispetto a quelli predefiniti. Se decidi di modificare il timeout, impostalo sul tempo effettivo che l'applicazione è disposta ad attendere per il risultato. Puoi sperimentare con 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 tentativo più frequente dell'operazione.

Problemi relativi all'API Admin

Le richieste API Admin sono operazioni più costose rispetto alle richieste API di dati. Le richieste amministratore come CreateInstance, CreateDatabase o CreateBackups possono richiedere molti secondi prima di restituire una risposta. Le librerie client di Spanner impostano scadenze di 60 minuti per le richieste dell'amministratore di istanza e database. Questo serve a garantire che il server abbia l'opportunità di completare la richiesta prima che il client riprovi o abbia esito negativo.

Risoluzione

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

Problemi relativi alla console Google Cloud

Le query eseguite 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, verrà visualizzato 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, se necessario, la transazione potrebbe eseguire il rollback.

Risoluzione

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

Problemi relativi a Dataflow

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

Risoluzione

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

Un altro esempio di errore di superamento della scadenza di Dataflow viene 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 è dovuto al fatto che gli elementi di lavoro sono troppo grandi. Nell'esempio precedente, i due consigli seguenti potrebbero esserti d'aiuto. Innanzitutto, puoi provare ad abilitare il servizio shuffling, se non è ancora abilitato. In secondo luogo, puoi provare a modificare le configurazioni nella lettura del database, ad esempio maxPartitions e partitionSizeBytes. Per maggiori informazioni, vedi PartitionOptions per provare a ridurre le dimensioni dell'elemento di lavoro. Un esempio di come eseguire questa operazione è disponibile in questo modello Dataflow.

Scadenza aggiuntiva superata per risorse per la risoluzione dei problemi

Se visualizzi ancora un errore DEADLINE_EXCEEDED dopo aver completato i passaggi per la risoluzione dei problemi, apri una richiesta di assistenza se riscontri i seguenti scenari:

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

Puoi anche fare riferimento alle seguenti risorse per la risoluzione dei problemi: