Risolvere gli errori di scadenza di Cloud Spanner che hanno superato i limiti

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questa pagina fornisce una panoramica degli errori di superamento di Cloud Spanner: che 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 può verificarsi per diversi motivi, ad esempio istanze di Spanner sovraccariche, schemi non ottimizzati o query non ottimizzate. In questa pagina vengono descritti gli scenari comuni in cui si è verificato un errore e si è verificata una scadenza e viene fornita una guida su come analizzare e risolvere questi problemi.

Scadenza di Cloud Spanner e nuova filosofia

La scadenza di Spanner e la filosofia dei nuovi tentativi sono diverse da molte altre. In Spanner, devi specificare una scadenza per il timeout come periodo di tempo massimo in cui una risposta è utile. Non è consigliabile impostare una scadenza artificiale in modo artificiale per riprovare immediatamente la stessa operazione, perché le situazioni non saranno mai completate. In questo contesto, le strategie e le operazioni seguenti sono sconsigliate; si pongono in contrasto con il comportamento interno di Riprova di Spanner:

  • Definire una scadenza troppo breve. Ciò significa che l'operazione non è resiliente agli aumenti occasionali della latenza di coda e non può essere completata prima del timeout. Imposta invece una scadenza che corrisponde alla quantità massima di tempo in cui una risposta è utile.

  • Impostando una scadenza troppo lunga e annullando l'operazione prima della scadenza. Ciò genera nuovi tentativi e sprechi di lavoro per ogni tentativo. In modalità aggregata, questo può causare un carico aggiuntivo significativo sull'istanza.

Qual è un errore di superamento della scadenza?

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

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

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

Come esaminare e risolvere gli errori comuni relativi alla scadenza

Problemi relativi all'API Data Access

Un'istanza Spanner deve essere configurata correttamente per i carichi di lavoro specifici, per evitare problemi con l'API Accesso ai dati. Le seguenti sezioni descrivono come esaminare e risolvere i diversi problemi dell'API di accesso ai dati.

Controlla il carico CPU dell'istanza Spanner

La latenza delle richieste può aumentare notevolmente man mano che l'utilizzo della CPU supera la soglia di integrità consigliata. Puoi controllare l'utilizzo della CPU di Spanner nella console di monitoraggio fornita in Google Cloud Console. 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 la sezione Ridurre l'utilizzo della CPU.

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

Quando una richiesta passa dal client ai server Spanner e viceversa, sono necessari diversi hop di rete: dalla libreria client al Google Front End (GFE), dal GFE al front-end dell'API Spanner e infine dal front-end dell'API Spanner al database Spanner. Se si verificano problemi di rete in una di queste fasi, potresti notare degli errori di superamento della scadenza.

È possibile acquisire la latenza in ogni fase (consulta la guida alla latenza). Per ulteriori informazioni sull'utilizzo della guida di diagnostica, leggi l'articolo relativo alla diagnosi dei problemi di latenza.

Risoluzione

Dopo aver ottenuto l'analisi della latenza e diagnosticare il problema della latenza, puoi utilizzare questa guida alla risoluzione dei problemi di latenza per identificare l'origine della latenza e capirne il motivo.

Problemi relativi all'API di dati

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

Verificare la presenza di query costose

Se cerchi di eseguire query costose che non vengono eseguite entro la scadenza del timeout configurato nelle librerie client, potrebbe verificarsi un errore di superamento della scadenza. Alcuni esempi di query costose includono, a titolo esemplificativo, scansioni complete di una tabella di grandi dimensioni, cross-unione 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 le informazioni sulle query e le transazioni eseguite lentamente, ad esempio il numero medio di righe lette, il numero medio di byte letti, il numero medio di righe scansionate 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 tue query, consulta la best practice per le query SQL. Puoi anche utilizzare i dati ottenuti attraverso le tabelle delle statistiche e i piani di esecuzione sopra menzionati per ottimizzare le query e apportare modifiche allo schema dei database. Queste best practice possono aiutarti a ridurre i tempi di esecuzione degli estratti conto, aiutando potenzialmente a eliminare gli errori di superamento della scadenza.

Verifica l'eventuale contesa della serratura

Le transazioni Spanner devono acquisire blocchi per il commit. Le applicazioni in esecuzione a velocità effettiva elevata possono causare la competizione delle transazioni per le stesse risorse, causando un aumento dell'attesa per ottenere i blocchi e con un impatto sulle prestazioni complessive. Questo potrebbe causare il superamento delle scadenze per qualsiasi richiesta 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 leggendo il seguente post del blog. Nella tabella delle statistiche di blocco puoi trovare le chiavi di riga con i tempi di attesa più elevati.

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

Risoluzione

Applica queste best practice per ridurre le contese del 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 prenotato per operazioni di scrittura o flussi di lavoro misti di lettura/scrittura. Segui questi passaggi per migliorare la latenza complessiva del tempo di esecuzione della transazione e ridurre gli errori di superamento della scadenza.

Verifica la presenza di schemi non ottimizzati

Prima di progettare uno schema di database ottimale per il tuo database Spanner, devi tenere conto dei 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 dello schema più ottimale dipende dalle letture e dalle scritture effettuate nel database. Le guide alle best practice per la progettazione degli schemi e alle best practice per SQL devono essere seguite indipendentemente dalle specifiche dello schema. Con queste guide, eviterai i problemi più comuni di progettazione dello schema. Altre cause principali delle scarse prestazioni sono attribuite alla scelta delle chiavi primarie, al layout della tabella (consulta l'articolo sull'utilizzo di tabelle con interfoliazione per un accesso più rapido), alla progettazione dello schema (vedi ottimizzazione dello schema per le prestazioni) e alle prestazioni del nodo configurato nell'istanza di Spanner (vedi limiti a livello di area geografica o limiti multiregionali).

Verifica la presenza di hotspot

Poiché Spanner è un database distribuito, la progettazione dello schema deve tenere conto di evitare gli hotspot. Ad esempio, la creazione di colonne con aumento monotonico limiterà il numero di segmenti con cui Spanner può lavorare per distribuire il carico di lavoro in modo uniforme. Questi colli di bottiglia potrebbero comportare timeout. Inoltre, puoi utilizzare Key Visualizer per risolvere i problemi di prestazioni causati dagli hotspot.

Risoluzione

Fai riferimento alle risoluzioni indicate nella sezione precedente Verificare la presenza di schemi non ottimizzati come primo passaggio per risolvere il problema. Riprogetta lo schema del database e utilizza gli indici con interfoliazione per evitare gli indici che potrebbero causare hotspot. Se seguendo questi passaggi il problema non si risolve, consulta la Guida alle soluzioni per la creazione di hotspot (hotspot). Infine, evita modelli di traffico non ottimali come letture di intervalli estesi che potrebbero impedire la suddivisione basata sul carico.

Verifica la presenza di timeout configurati in modo errato

Le librerie client forniscono valori di timeout ragionevoli per tutte le richieste in Spanner. Tuttavia, potrebbe essere necessario regolare queste configurazioni predefinite per il carico di lavoro specifico. È importante osservare il costo delle query e modificare le scadenze per adattarle al 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 al timeout personalizzato e ai nuovi tentativi), ma sconsigliamo di utilizzare timeout più aggressivi rispetto a quelli predefiniti. Se decidi di modificare il timeout, impostalo sul tempo effettivo in cui l'applicazione è disposta ad attendere il risultato. Puoi sperimentare con timeout configurati più a lungo, ma non impostare mai un timeout inferiore al tempo effettivo che l'applicazione è disposta ad attendere, in modo che l'operazione venga ripetuta più frequentemente.

Problemi dell'API Admin

Le richieste dell'API Admin sono operazioni costose rispetto alle richieste dell'API di dati. Le richieste dell'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 amministrative di istanza e database. Questo garantisce che il server abbia l'opportunità di completare la richiesta prima che il client esegua un nuovo tentativo o non vada a buon fine.

Risoluzione

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

Problemi con la console Google Cloud

Le query inviate dalla pagina di query di Google Cloud Console non possono superare i cinque minuti. Se crei una query costosa che richiede più di cinque minuti, verrà visualizzato il seguente messaggio di errore:

Screenshot della scadenza della console Google Cloud che ha superato il messaggio di errore

Il backend annullerà la query non riuscita e la transazione potrebbe eseguire il 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 è 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 per la scadenza della libreria client autonoma. Tuttavia, è ancora possibile ricevere un errore di timeout e scadenza quando gli elementi di lavoro sono troppo grandi. Attualmente è possibile personalizzare la configurazione del timeout del commit Apache Beam solo se necessario.

Risoluzione

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

Un altro esempio di errore di superamento di una scadenza Dataflow è riportato 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. Nel caso sopra indicato, i due consigli seguenti potrebbero esserti utili. Per prima cosa, puoi provare ad attivare il servizio di shuffle 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. Per un esempio di come eseguire questa operazione, consulta questo modello Dataflow.

La scadenza aggiuntiva ha superato le risorse per la risoluzione dei problemi

Se visualizzi ancora un errore di superamento della scadenza dopo aver seguito i passaggi per la risoluzione dei problemi riportati sopra, utilizza la seguente analisi per determinare se devi aprire una richiesta di assistenza (consulta l'elenco completo delle richieste di assistenza nella tabella dei problemi di latenza). Per riepilogare, apri una richiesta di assistenza se riscontri i seguenti scenari:

  • Un'elevata latenza di Google Front End, ma una bassa latenza delle richieste dell'API Spanner
  • Latenza elevata per le richieste Spanner, ma bassa latenza delle query

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