Per i servizi Cloud Run, ogni revisione viene scalata automaticamente in base al numero di istanze necessarie per gestire tutte le richieste in entrata.
Quando più istanze elaborano le richieste, vengono utilizzate più CPU e memoria, con un conseguente aumento dei costi.
Per offrirti un maggiore controllo, Cloud Run fornisce un'impostazione Numero massimo di richieste in parallelo per istanza che specifica il numero massimo di richieste che possono essere elaborate contemporaneamente da una determinata istanza.
Numero massimo di richieste in parallelo per istanza
Puoi configurare il numero massimo di richieste in parallelo per istanza. Per impostazione predefinita, ogni istanza Cloud Run può ricevere fino a 80 richieste contemporaneamente. Puoi aumentare questo valore fino a un massimo di 1000.
Sebbene sia consigliabile utilizzare il valore predefinito, se necessario puoi
ridurre la concorrenza massima. Ad esempio, se il codice non può elaborare richieste parallele, imposta la concorrenza su 1
.
Il valore di concorrenza specificato è un limite massimo. Se la CPU dell'istanza è già molto utilizzata, Cloud Run potrebbe non inviare così tante richieste a una determinata istanza. In questi casi, l'istanza Cloud Run potrebbe indicare che la concorrenza massima non viene utilizzata. Ad esempio, se l'utilizzo elevato della CPU è prolungato, il numero di istanze potrebbe aumentare.
Il seguente diagramma mostra in che modo l'impostazione del numero massimo di richieste in parallelo per istanza influisce sul numero di istanze necessarie per gestire le richieste in parallelo in arrivo:
Ottimizzazione della concorrenza per la scalabilità automatica e l'utilizzo delle risorse
La modifica della concorrenza massima per istanza influisce in modo significativo sul modo in cui il servizio scala e utilizza le risorse.
- Contemporaneità inferiore: forza Cloud Run a utilizzare più istanze per lo stesso volume di richieste, perché ogni istanza gestisce meno richieste. In questo modo puoi migliorare la reattività delle applicazioni non ottimizzate per un parallelismo interno elevato o per le applicazioni di cui vuoi aumentare la scalabilità più rapidamente in base al carico delle richieste.
- Contemporaneità più elevata: consente a ogni istanza di gestire più richieste, con un potenziale calo del numero di istanze attive e una riduzione dei costi. Questa opzione è adatta per le applicazioni efficienti per le attività I/O parallele o per le applicazioni che possono utilizzare più vCPU per l'elaborazione richiesta in parallelo.
Inizia con la concorrenza predefinita (80), monitora attentamente il rendimento e l'utilizzo dell'applicazione e apporta le modifiche necessarie.
Concorrenza con istanze con più vCPU
L'ottimizzazione della concorrenza è particolarmente importante se il servizio utilizza più vCPU, ma l'applicazione è a thread singolo o effettivamente a thread singolo (in base alla CPU).
- Hotspot vCPU: un'applicazione a thread singolo su un'istanza con più vCPU potrebbe utilizzare al massimo una vCPU mentre le altre rimangono inattive. Il gestore della scalabilità automatica della CPU di Cloud Run misura l'utilizzo medio della CPU in tutte le vCPU. In questo scenario, l'utilizzo medio della CPU può rimanere ingannevolmente basso, impedendo una scalabilità efficace basata sulla CPU.
- Utilizzo della concorrenza per migliorare la scalabilità: se la scalabilità automatica basata sulla CPU non è efficace a causa di hotspot vCPU, la riduzione della concorrenza massima diventa uno strumento importante. Gli hotspot vCPU si verificano spesso quando viene scelta una configurazione multi-vCPU per un'applicazione a thread singolo a causa di elevate esigenze di memoria. L'utilizzo della concorrenza per gestire la scalabilità forza la scalabilità in base al throughput delle richieste. In questo modo vengono avviate più istanze per gestire il carico, riducendo la latenza e le code per istanza.
Quando limitare la concorrenza massima a una richiesta alla volta.
Puoi limitare la concorrenza in modo che venga inviata una sola richiesta alla volta a ogni istanza in esecuzione. Ti consigliamo di farlo nei casi in cui:
- Ogni richiesta utilizza la maggior parte della CPU o della memoria disponibile.
- L'immagine del contenitore non è progettata per gestire più richieste contemporaneamente, ad esempio se il contenitore si basa su uno stato globale che due richieste non possono condividere.
Tieni presente che una concorrenza di 1
potrebbe influire negativamente sul rendimento del scaling, perché molte istanze dovranno essere avviate per gestire un picco di richieste in entrata. Per ulteriori considerazioni, consulta
Compromissi tra throughput, latenza e altro ancora.
Case study
Le seguenti metriche mostrano un caso d'uso in cui 400 client inviano 3 richieste al secondo a un servizio Cloud Run impostato su un numero massimo di richieste in parallelo per istanza di 1. La linea verde superiore mostra le richieste nel tempo, mentre la linea blu inferiore mostra il numero di istanze avviate per gestire le richieste.
Le seguenti metriche mostrano 400 client che inviano 3 richieste al secondo a un servizio Cloud Run impostato su un numero massimo di richieste in parallelo per istanza pari a 80. La riga superiore verde mostra le richieste nel tempo, mentre la riga blu inferiore mostra il numero di istanze avviate per gestire le richieste. Tieni presente che sono necessarie molte meno istanze per gestire lo stesso volume di richieste.
Concorrenza per i deployment del codice sorgente
Quando la concorrenza è attivata, Cloud Run non fornisce isolamento tra le richieste concorrenti elaborate dalla stessa istanza. In questi casi, devi assicurarti che il codice sia sicuro da eseguire contemporaneamente. Puoi modificare questa opzione impostando un valore di concorrenza diverso. Ti consigliamo di iniziare con una concorrenza inferiore, ad esempio 8, per poi aumentarla. Iniziare con una concorrenza troppo elevata potrebbe comportare comportamenti indesiderati a causa di limitazioni delle risorse (ad esempio memoria o CPU).
Anche i runtime della lingua possono influire sulla concorrenza. Alcuni di questi effetti specifici per lingua sono riportati nell'elenco seguente:
Node.js è intrinsecamente a un solo thread. Per sfruttare la concorrenza, utilizza lo stile di codice asincrono di JavaScript, che è idiomatico in Node.js. Per maggiori dettagli, consulta la sezione Controllo flusso asincrono nella documentazione ufficiale di Node.js.
Per Python 3.8 e versioni successive, il supporto di una concorrenza elevata per istanza richiede thread sufficienti per gestire la concorrenza. Ti consigliamo di impostare una variabile di ambiente runtime in modo che il valore di thread sia uguale al valore di concorrenza, ad esempio:
THREADS=8
.
Passaggi successivi
Per gestire il numero massimo di richieste in parallelo per istanza dei tuoi servizi Cloud Run, consulta Impostare il numero massimo di richieste in parallelo per istanza.
Per ottimizzare l'impostazione del numero massimo di richieste in parallelo per istanza, consulta i suggerimenti per lo sviluppo per la regolazione della concorrenza.