Risolvere i problemi di superamento della scadenza di Cloud Spanner

Questa pagina fornisce una panoramica degli errori di superamento delle scadenze di Cloud Spanner: quali sono, perché si verificano e come risolverli.

Quando si accedono 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 un numero eccessivo di istanze Spanner, schemi non ottimizzati o query non ottimizzate. In questa pagina vengono descritti gli scenari comuni in cui si verifica un errore di scadenza e viene fornita una guida su come analizzare e risolvere questi problemi.

Scadenza di Cloud Spanner e nuova filosofia

La filosofia di Spanner e la scadenza dei tentativi di Spanner è diversa da molti altri sistemi. In Spanner, devi specificare una scadenza per il timeout come il periodo di tempo massimo in cui una risposta è utile. Non è consigliabile impostare una scadenza artificiosamente breve solo per riprovare immediatamente con la stessa operazione, perché altrimenti verrebbero effettuate situazioni in cui le operazioni non vengono mai completate. In questo contesto, le seguenti strategie e operazioni non sono consigliate perché sono controproducenti e riducono il comportamento dei nuovi tentativi interni di Spanner:

  • Impostare una scadenza troppo breve. Ciò significa che l'operazione non è resistente agli aumenti occasionali della latenza della coda e non è possibile completarla prima del timeout. Imposta invece una scadenza per l'intervallo di tempo massimo in cui una risposta è utile.

  • Scadenza troppo lunga e annullamento dell'operazione prima della scadenza. Questo porta a tentativi e a sprecare lavoro a ogni tentativo. In modalità aggregata, questo può creare un carico supplementare significativo sull'istanza.

Che cos'è un errore nella scadenza superato?

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

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

Per ulteriori informazioni sulle scadenze gRPC, vedi gRPC e scadenza.

Come esaminare e risolvere gli errori comuni relativi alla scadenza

Problemi con l'API Data Access

Per evitare problemi di accesso ai dati dell'API, è necessario che l'istanza Spanner sia configurata correttamente per i carichi di lavoro specifici. Le seguenti sezioni descrivono come esaminare e risolvere diversi problemi relativi all'API di accesso ai dati.

Verifica il carico CPU dell'istanza Spanner

La latenza delle richieste può aumentare notevolmente quando l'utilizzo della CPU supera la soglia di integrità consigliata. Puoi verificare 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 la procedura di riduzione dell'utilizzo della CPU da parte dell'istanza, vedi Ridurre l'utilizzo della CPU.

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

Quando una richiesta passa dal client ai server Spanner, è necessario eseguire diversi hop di rete: dalla libreria client al Google Front End (GFE), dal GFE al front-end dell'API Spanner e, infine, dal frontend dell'API Spanner al database di Spanner. In caso di problemi di rete in una di queste fasi, potresti visualizzare 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, scopri come diagnosticare i problemi di latenza.

Risoluzione

Una volta ottenuta l'analisi della latenza e una volta diagnosticato il problema, puoi utilizzare questa guida per la risoluzione dei problemi di latenza per identificare l'origine della latenza e comprenderne il motivo.

Problemi relativi all'API di dati

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

Verifica la presenza di query costose

Il tentativo di eseguire query costose che non vengono eseguite entro il tempo di timeout configurato nelle librerie client potrebbe causare un errore di superamento della scadenza. Alcuni esempi di query costose includono, a titolo esemplificativo, scansioni complete di una tabella di grandi dimensioni, cross-join su diverse tabelle di grandi dimensioni o l'esecuzione di una 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 sulle query e la tabella delle statistiche sulle transazioni. Queste tabelle mostrano le informazioni su query e transazioni a esecuzione lenta, ad esempio il numero medio di righe lette, la media 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 query, consulta la guida alle best practice per le query SQL. Puoi anche utilizzare i dati ottenuti tramite le tabelle di statistiche e i piani di esecuzione menzionati sopra, per ottimizzare le tue query e apportare modifiche allo schema dei tuoi database. Queste best practice possono contribuire a ridurre il tempo di esecuzione degli estratti conto, aiutando potenzialmente a eliminare la scadenza degli errori.

Verifica la presenza di un blocco dei contenuti

Le transazioni Spanner devono acquisire blocchi per commit. Le applicazioni in esecuzione ad alta velocità effettiva possono causare la competizione delle transazioni per le stesse risorse, causando un aumento dell'attesa per ottenere i blocchi e influire sulle prestazioni complessive. Questo potrebbe comportare 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ù alti.

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 individuare le transazioni coinvolte in un conflitto di blocco usando la guida alla risoluzione dei problemi con i tag transazione.

Risoluzione

Applica queste best practice per ridurre le contese di blocco. Inoltre, usa le transazioni di sola lettura per i casi d'uso in lettura normale per evitare conflitti di blocco con le scritture. L'utilizzo di transazioni di lettura/scrittura deve essere riservato alle scritture o ai flussi di lavoro di lettura/scrittura misti. Segui questi passaggi per migliorare la latenza complessiva dei tempi di esecuzione delle transazioni 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 database Spanner, devi considerare i tipi di query che verranno eseguite nel 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 ottimale dipende dalle operazioni di lettura e scrittura effettuate nel database. Le guide alle best practice di progettazione dello schema e alle best practice di SQL devono essere seguite indipendentemente dalle specifiche degli schemi. Seguendo queste guide, eviti 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 (vedi utilizzo delle 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 all'interno dell'istanza di Spanner (consulta i limiti a livello di area geografica o i limiti a più aree geografiche).

Cercare hotspot

Poiché Spanner è un database distribuito, la progettazione dello schema deve tenere conto per prevenire gli hotspot. Ad esempio, la creazione monoonica di colonne limiterà il numero di suddivisioni con cui Spanner può 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

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 gli indici con interfoliazione per evitare gli indici che potrebbero causare hotspot. Se i passaggi riportati di seguito non risolvono il problema, consulta la guida per scegliere una chiave primaria per evitare gli hotspot. Infine, evita schemi di traffico non ottimali come letture ad ampio raggio 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 tuo 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 e ai nuovi tentativi personalizzati), ma sconsigliamo di utilizzare timeout più aggressivi rispetto a quelli predefiniti. Se decidi di modificare il timeout, impostalo sul periodo di tempo effettivo in cui l'applicazione è pronta ad attendere il risultato. Puoi sperimentare con timeout più lunghi configurati, ma non impostare mai un timeout inferiore al tempo effettivo in cui l'applicazione è disposta ad attendere, in quanto ciò causerebbe un nuovo tentativo dell'operazione più frequente.

Problemi relativi all'API Admin

Le richieste API amministrative sono costose rispetto alle richieste API 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 lunghe 60 minuti sia per le richieste amministratore instance che per database. Questo serve a garantire che il server abbia l'opportunità di completare la richiesta prima che il client esegua un nuovo tentativo o non funzioni.

Risoluzione

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

Problemi con Google Cloud Console

Le query eseguite dalla pagina delle 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 del messaggio di errore di superamento della scadenza di Cloud Console

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 relativi a Dataflow

In Apache Beam, la configurazione predefinita di 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 di scadenza della libreria client autonoma. È tuttavia possibile ricevere un timeout e un superamento della 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 della scadenza nei passaggi ReadFromSpanner / Execute query / Read from Cloud Spanner / Read from Partitions, controlla la tabella delle statistiche delle query per scoprire quale query ha scansionato un numero elevato di righe. Successivamente, modifica tali query per tentare 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 è dovuto al fatto che gli elementi di lavoro sono troppo grandi. Nel caso sopra indicato, i due consigli che seguono potrebbero aiutarti. Innanzitutto, 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, come maxPartitions e partitionSizeBytes. Per ulteriori informazioni, consulta la sezione PartitionOptions per provare a ridurre le dimensioni dell'elemento di lavoro. Per un esempio di come procedere, consulta questo modello di Dataflow.

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

Se continui a visualizzare un errore di superamento della scadenza una volta eseguiti i passaggi di risoluzione dei problemi riportati sopra, utilizza la seguente suddivisione per determinare se devi aprire una richiesta di assistenza (consulta l'elenco completo delle richieste di assistenza nella tabella dei problemi di latenza). Per riassumere, apri un ticket di assistenza se riscontri i seguenti scenari:

  • Latenza elevata per Google Front End, ma bassa latenza di richiesta API Spanner
  • Latenza dell'API Spanner elevata, ma latenza di query bassa

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