Risolvere gli errori di scadenza di Cloud Spanner superati

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 della scadenza di Cloud Spanner: cosa sono, perché si verificano e come risolverli e 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 Spanner sovraccaricate, schemi non ottimizzati o query non ottimizzate. In questa pagina vengono descritti gli scenari comuni in cui si verifica un errore di superamento della 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 e i tentativi cambiano da molti altri sistemi. In Spanner, devi specificare una scadenza per il timeout come il periodo di tempo massimo durante il quale una risposta è utile. Non è consigliabile impostare una scadenza artificialmente breve solo per riprovare immediatamente la stessa operazione, perché si tradurrà in situazioni in cui le operazioni non verranno mai completate. In questo contesto, le strategie e le operazioni seguenti sono sconsigliate; sono controproducenti e sconfiggono il comportamento di ripetizione interno di Spanner:

  • Impostare una scadenza troppo breve. Ciò significa che l'operazione non è resiliente ai continui aumenti della latenza di coda e non può essere completata prima del timeout. ma devi impostare una scadenza, che è il periodo di tempo massimo in cui una risposta è utile.

  • Impostare una scadenza troppo lunga e annullare l'operazione prima della scadenza. Questo comporta nuovi tentativi e sprechi di lavoro per ogni tentativo. In totale, questo può creare un carico aggiuntivo significativo sull'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'annullamento del marshalling 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 la richiesta venga terminata con l'errore di superamento della scadenza.

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

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

Come analizzare e risolvere gli errori di superamento della scadenza comuni

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 di accesso ai dati. Le seguenti sezioni descrivono come esaminare e risolvere diversi problemi dell'API Data Access.

Controlla il carico CPU dell'istanza di Spanner

La latenza delle richieste può aumentare notevolmente in quanto 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 basati sull'utilizzo della CPU dell'istanza.

Risoluzione

Per la procedura di riduzione dell'utilizzo della CPU dell'istanza, vedi Ridurre l'utilizzo della CPU.

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

Quando la richiesta passa dal client ai server Spanner e viceversa, sono necessari diversi hop di rete: dalla libreria client al GFE di Google, 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 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 diagnostica, scopri come diagnosticare i problemi di latenza.

Risoluzione

Una volta ottenuta l'analisi della latenza e diagnosticata il problema di latenza, puoi utilizzare questa guida per la 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 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.

Verificare la presenza di query costose

Il tentativo di eseguire query costose che non vengono eseguite entro la scadenza del 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-unione 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 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 sulle transazioni con esecuzione lenta, 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 le tue query vengono eseguite.

Risoluzione

Per ottimizzare le query, consulta la guida alle best practice per le query SQL. Puoi anche utilizzare i dati ottenuti tramite le tabelle statistiche e i piani di esecuzione menzionati sopra per ottimizzare le query e apportare modifiche allo schema dei tuoi database. Queste best practice possono aiutare a ridurre i tempi di esecuzione degli estratti conto, riducendo potenzialmente la possibilità di errori di superamento della scadenza.

Verifica la presenza di contese della serratura

Le transazioni Spanner devono acquisire blocchi per il commit. Le applicazioni in esecuzione a velocità effettiva elevata possono far sì che le transazioni competano per le stesse risorse, comportando un aumento dell'attesa per ottenere i blocchi e influire sulle prestazioni complessive. Questo potrebbe comportare scadenze superate per le richieste di lettura o scrittura.

Per scoprire la causa principale delle transazioni di lettura-scrittura ad alta latenza, utilizza la tabella delle statistiche di blocco e consulta 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 relativi ai conflitti di blocco spiega come trovare le transazioni che accedono alle colonne coinvolte nei conflitti di blocco. Puoi anche individuare le transazioni interessate da un conflitto di blocco nella guida per la risoluzione dei problemi con i tag delle transazioni.

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 normale per evitare conflitti di blocco con le scritture. Le transazioni di lettura/scrittura devono essere riservate alle operazioni di scrittura o ai flussi di lavoro di lettura/scrittura misti. Segui questi passaggi per migliorare la latenza complessiva dell'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 tuo database Spanner, valuta 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 più ottimale dipende dalle letture e scritture effettuate nel database. Le guide alle best practice per la progettazione degli schemi e le best practice SQL devono essere seguite a prescindere dalle specifiche dello schema. Seguendo 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'utilizzo delle tabelle con interfoliazione per un accesso più rapido), alla progettazione dello schema (consulta l'ottimizzazione dello schema per le prestazioni) e alle prestazioni del nodo configurato all'interno dell'istanza di Spanner (consulta i limiti regionali o i limiti per più aree geografiche).

Verifica hotspot

Poiché Spanner è un database distribuito, il design dello schema deve tenere conto per evitare hotspot. Ad esempio, la creazione monocromatica di colonne 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 questo problema. Riprogetta lo schema del database e utilizza gli indici con interfoliazione per evitare indici che potrebbero causare hotspot. Se i passaggi riportati di seguito non risolvono il problema, consulta la sezione Scegliere una chiave primaria per evitare hotspot. Infine, evita pattern di traffico non ottimali, come letture ad ampio intervallo, che potrebbero impedire la suddivisione basata sul carico.

Verifica la presenza di timeout configurati in modo errato

Le librerie client forniscono valori predefiniti di timeout ragionevoli per tutte le richieste in Spark. Tuttavia, queste configurazioni predefinite potrebbero dover essere regolate 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 eseguire l'override di queste configurazioni (consulta la guida al timeout personalizzato e ai nuovi tentativi), ma è sconsigliato utilizzare timeout più aggressivi di quelli predefiniti. Se decidi di modificare il timeout, impostalo sul tempo effettivo di attesa dell'applicazione in attesa del risultato. Puoi sperimentare con timeout configurati più lunghi, ma non impostare mai un timeout più breve del tempo effettivo in cui l'applicazione è disposta ad attendere, perché l'operazione verrà ripetuta più spesso.

Problemi relativi all'API Admin

Le richieste API amministrative sono operazioni costose rispetto alle richieste API 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 lunghe 60 minuti sia per le richieste di amministrazione di istanza che di database. Questo serve a garantire che il server abbia l'opportunità di completare la richiesta prima che il client ritenta o non vada a buon fine.

Risoluzione

Se utilizzi la libreria client di Panpann 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 rispetto alle impostazioni predefinite (60 minuti) per le richieste di amministrazione di istanza e database.

Problemi con Google Cloud Console

Le query eseguite 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, viene visualizzato il seguente messaggio di errore:

Screenshot del messaggio di errore che ha superato la 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 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 un funzionamento più lungo rispetto ai timeout per la scadenza della libreria client autonoma. Tuttavia, è ancora possibile ricevere un errore di timeout e scadenza scaduto quando gli elementi di lavoro sono troppo grandi. Attualmente è possibile personalizzare la configurazione del timeout della funzionalità 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, consulta la tabella delle statistiche sulle query per scoprire quale query ha analizzato un numero elevato di righe. Modifica queste query per tentare di ridurre i tempi 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 riportato, i due consigli seguenti potrebbero essere utili. Per prima cosa, 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 la sezione PartitionOptions per provare a ridurre le dimensioni dell'elemento di lavoro. Un esempio di come eseguire questa operazione è disponibile in 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 suddivisione per determinare se devi aprire una richiesta di assistenza (consulta l'elenco completo delle richieste di assistenza nella tabella per la risoluzione dei problemi di latenza). Per riassumere, apri una richiesta di assistenza se riscontri i seguenti scenari:

  • Alta latenza di Google Front End, ma bassa latenza di richiesta dell'API Spanner
  • Una latenza di richiesta API Spanner elevata, ma una latenza di query bassa

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