Configurazione della concorrenza fornita per una funzione - AWS Lambda

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Configurazione della concorrenza fornita per una funzione

In Lambda, la simultaneità è il numero di richieste in transito che la funzione sta gestendo attualmente. Sono disponibili due tipi di controlli di simultaneità:

  • Simultaneità riservata: rappresenta il numero massimo di istanze simultanee allocate alla funzione. Quando una funzione ha la simultaneità riservata, nessun'altra funzione può utilizzare tale simultaneità. La concorrenza riservata è utile per garantire che le funzioni più critiche abbiano sempre una concorrenza sufficiente per gestire le richieste in arrivo. La configurazione della simultaneità riservata per una funzione non comporta alcun addebito ulteriore.

  • Simultaneità fornita: il numero di ambienti di esecuzione pre-inizializzati che desideri allocare alla funzione. Questi ambienti di esecuzione sono pronti a rispondere immediatamente alle richieste di funzioni in arrivo. La concorrenza fornita è utile per ridurre le latenze di avvio a freddo delle funzioni. La configurazione della concorrenza fornita comporta costi aggiuntivi per l'utente. Account AWS

In questo argomento viene descritta in dettaglio la modalità gestire e configurare la simultaneità fornita. Per una panoramica concettuale di questi due tipi di controlli della simultaneità, consulta la sezione Simultaneità riservata e simultaneità fornita. Per ulteriori informazioni sulla configurazione della simultaneità riservata, consulta la sezione Configurazione della concorrenza riservata per una funzione.

Nota

Le funzioni Lambda collegate a uno strumento di mappatura dell'origine degli eventi Amazon MQ hanno una simultaneità massima predefinita. Per Apache Active MQ, il numero massimo di istanze simultanee è 5. Per Rabbit MQ, il numero massimo di istanze simultanee è 1. L'impostazione della simultaneità sottoposta a provisioning o riservata per la funzione non modifica questi limiti. Per richiedere un aumento della simultaneità massima predefinita quando si utilizza Amazon MQ, contatta AWS Support.

Configurazione della simultaneità fornita

È possibile configurare le impostazioni di concorrenza assegnate per una funzione utilizzando la console Lambda o Lambda. API

Allocazione della simultaneità fornita per una funzione (console)
  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegli la funzione per la quale desideri allocare la simultaneità fornita.

  3. Scegliere Configuration (Configurazione) e quindi scegliere Concurrency (Simultaneità).

  4. In Provisioned concurrency configurations (Configurazioni di simultaneità fornita), scegliere Add configuration (Aggiungi configurazione).

  5. Scegli il tipo di qualificatore e l'alias o la versione.

    Nota

    Non è possibile utilizzare la concorrenza fornita con la versione $ di alcuna funzione. LATEST

    Se la funzione dispone di un'origine eventi, assicurati che tale origine punti all'alias corretto o alla versione corretta della funzione. In caso contrario, la funzione non utilizzerà gli ambienti di simultaneità fornita.

  6. Inserisci un numero in Simultaneità fornita. Lambda fornisce una stima dei costi mensili.

  7. Seleziona Salva.

Puoi configurare fino al valore massimo di Simultaneità dell'account non riservata meno 100. Le restanti 100 unità di simultaneità sono destinate a funzioni che non utilizzano la simultaneità riservata. Ad esempio, se il tuo account ha un limite di simultaneità di 1.000 e non hai assegnato simultaneità riservata o fornita ad alcuna delle tue altre funzioni, puoi configurare un massimo di 900 unità di simultaneità fornita per una singola funzione.

Se si tenta di allocare un valore eccessivo di simultaneità fornita, si verifica un errore.

La configurazione della simultaneità fornita per una funzione influisce sul pool di simultaneità disponibile per altre funzioni. Ad esempio, se configuri 100 unità di simultaneità fornita per function-a, le altre funzioni nell'account devono condividere le 900 unità di simultaneità rimanenti. Ciò vale anche se function-a non utilizza tutte le 100 unità.

Per la stessa funzione è possibile allocare sia la simultaneità riservata che la simultaneità fornita. In questi casi, la concorrenza fornita non può superare la concorrenza riservata.

Questa limitazione si estende alle versioni della funzione. La simultaneità fornita massima che si può assegnare a una versione specifica della funzione corrisponde alla simultaneità riservata della funzione meno la simultaneità fornita su altre versioni della funzione.

Per configurare la concorrenza fornita con LambdaAPI, utilizza le seguenti operazioni. API

Ad esempio, per configurare la concorrenza fornita con AWS Command Line Interface (CLI), utilizzate il comando. put-provisioned-concurrency-config Il comando seguente alloca 100 unità di simultaneità fornita per l'alias BLUE di una funzione denominata my-function:

aws lambda put-provisioned-concurrency-config --function-name my-function \ --qualifier BLUE \ --provisioned-concurrent-executions 100

L'output restituito dovrebbe essere simile al seguente:

{ "Requested ProvisionedConcurrentExecutions": 100, "Allocated ProvisionedConcurrentExecutions": 0, "Status": "IN_PROGRESS", "LastModified": "2023-01-21T11:30:00+0000" }

Stima accurata della concorrenza fornita richiesta per una funzione

È possibile visualizzare le metriche di concorrenza di qualsiasi funzione attiva utilizzando le metriche. CloudWatch Nello specifico, il parametro ConcurrentExecutions mostra il numero di invocazioni simultanee per le funzioni nell'account.

Grafico che mostra la simultaneità di una funzione nel tempo.

Il grafico precedente mostra che questa funzione gestisce in media da 5 a 10 richieste simultanee in qualsiasi momento dato, e ha un picco di 20 richieste. Supponiamo che nel tuo account siano presenti molte altre funzioni. Se questa funzione è fondamentale per la tua applicazione e necessiti di una risposta a bassa latenza per ogni invocazione, configura almeno 20 unità di simultaneità fornita.

Ricorda che puoi anche calcolare la simultaneità utilizzando la seguente formula:

Concurrency = (average requests per second) * (average request duration in seconds)

Per stimare la quantità di simultaneità necessaria, moltiplica le richieste medie al secondo per la durata media delle richieste in secondi. Puoi stimare le richieste medie al secondo utilizzando il parametro Invocation e la durata media delle richieste in secondi utilizzando il parametro Duration.

Quando si configura la simultaneità fornita, Lambda suggerisce di aggiungere un buffer del 10% oltre alla quantità di simultaneità che generalmente occorre alla funzione. Ad esempio, se la funzione di solito raggiunge il picco di 200 richieste simultanee, imposta la simultaneità fornita su 220 (200 richieste simultanee + 10% = 220 unità di simultaneità fornita).

Ottimizzazione del codice della funzione quando si utilizza la concorrenza fornita

Se utilizzi la concorrenza fornita, prendi in considerazione la possibilità di ristrutturare il codice della funzione per ottimizzarlo per una bassa latenza. Per le funzioni che utilizzano la concorrenza fornita, Lambda esegue qualsiasi codice di inizializzazione, come il caricamento di librerie e l'istanziazione dei client, durante il tempo di allocazione. Pertanto, è consigliabile trasferire quanti più processi di inizializzazione di istanze all'esterno del gestore della funzione principale per evitare di influire sulla latenza durante le invocazioni effettive della funzione. Al contrario, l'inizializzazione delle librerie o l'istanziazione di client all'interno del codice del gestore principale significa che la funzione deve essere eseguita ogni volta che viene richiamata (ciò avviene indipendentemente dal fatto che si stia utilizzando la concorrenza fornita).

Per le invocazioni on demand, Lambda potrebbe dover eseguire nuovamente il codice di inizializzazione ogni volta che la funzione subisce un avvio a freddo. Per tali funzioni, puoi scegliere di rinviare l'inizializzazione di una funzionalità specifica fino a quando la funzione non ne ha necessità. Ad esempio, considera il seguente flusso di controllo per un gestore Lambda:

def handler(event, context): ... if ( some_condition ): // Initialize CLIENT_A to perform a task else: // Do nothing

Nell'esempio precedente, invece di inizializzare CLIENT_A all'esterno del gestore principale, lo sviluppatore lo ha inizializzato all'interno dell'istruzione if. In tal modo, Lambda esegue il codice solo se la condizione some_condition è soddisfatta. Se esegui l'inizializzazione di CLIENT_A all'esterno del gestore principale, Lambda esegue quel codice a ogni avvio a freddo. Ciò può aumentare la latenza complessiva.

Utilizzo di variabili di ambiente per visualizzare e controllare il comportamento di concorrenza assegnato

È possibile che la funzione utilizzi tutta la simultaneità fornita. Per gestire il traffico in eccesso, Lambda utilizza istanze on demand. Per determinare il tipo di inizializzazione che Lambda ha utilizzato per un ambiente specifico, controlla il valore della variabile di ambiente AWS_LAMBDA_INITIALIZATION_TYPE. Questa variabile ammette due valori possibili: provisioned-concurrency o on-demand. Il valore di AWS_LAMBDA_INITIALIZATION_TYPE è immutabile e rimane costante per tutta la durata dell'ambiente. Per verificare il valore di una variabile di ambiente nel codice della funzione, vedere. Recupero delle variabili di ambiente Lambda

Se stai usando il. NET6 o. NET7 runtime, è possibile configurare la variabile di AWS_LAMBDA_DOTNET_PREJIT ambiente per migliorare la latenza delle funzioni, anche se non utilizzano la concorrenza fornita. Il. NETruntime utilizza la compilazione e l'inizializzazione lente per ogni libreria che il codice chiama per la prima volta. Di conseguenza, la prima invocazione di una funzione Lambda può richiedere più tempo delle successive. Per ovviare a questo problema, puoi scegliere tra tre valori per AWS_LAMBDA_DOTNET_PREJIT:

  • ProvisionedConcurrency: Lambda esegue la ahead-of-time JIT compilazione per tutti gli ambienti utilizzando la concorrenza fornita. Si tratta del valore di default.

  • Always: Lambda esegue ahead-of-time JIT la compilazione per ogni ambiente, anche se la funzione non utilizza la concorrenza fornita.

  • Never: Lambda disabilita la ahead-of-time JIT compilazione per tutti gli ambienti.

Comprensione del comportamento di registrazione e fatturazione con la concorrenza fornita

Per gli ambienti con simultaneità fornita, il codice di inizializzazione della funzione viene eseguito durante l'allocazione e periodicamente mentre Lambda ricicla le istanze attive dell'ambiente. Puoi vedere il tempo di inizializzazione nei log e nelle tracce dopo che un'istanza dell'ambiente elabora una richiesta. È importante tenere presente che Lambda addebita i costi di inizializzazione anche se l'istanza non elabora mai richieste. La simultaneità fornita viene eseguita continuamente e prevede una fatturazione separata rispetto ai costi di inizializzazione e invocazione. Per maggiori dettagli, consulta Prezzi di AWS Lambda.

Inoltre, quando configuri una funzione Lambda con la concorrenza fornita, Lambda preinizializza l'ambiente di esecuzione in modo che sia disponibile prima delle richieste di invocazione della funzione. Tuttavia, la funzione pubblica i log delle chiamate solo quando la funzione viene effettivamente richiamata. CloudWatch Pertanto, il campo Init Duration viene visualizzato nella riga di REPORT registro della prima chiamata della funzione, anche se l'inizializzazione è avvenuta in anticipo. Ciò non significa che la funzione abbia subito un avvio a freddo.

Utilizzo di Application Auto Scaling per automatizzare la gestione simultanea fornita

Puoi utilizzare Application Auto Scaling per gestire la simultaneità fornita in base a una pianificazione o all'utilizzo. Se la funzione riceve modelli di traffico prevedibili, utilizza il dimensionamento pianificato. Se desideri che la funzione mantenga una percentuale di utilizzo specifica, utilizza una policy di dimensionamento con monitoraggio degli obiettivi.

Dimensionamento programmato

Con Application Auto Scaling, puoi creare una pianificazione personalizzata in base alle variazioni di carico prevedibili. Per ulteriori informazioni ed esempi, consulta Scheduled scaling for Application Auto Scaling nella Application Auto Scaling User Guide AWS Lambda e Scheduling Provisioned Concurrency per i picchi di utilizzo ricorrenti sul blog di Compute. AWS

Monitoraggio degli obiettivi

Con il tracciamento degli obiettivi, Application Auto Scaling crea e gestisce una serie di CloudWatch allarmi in base alla definizione della politica di scalabilità. Quando questi allarmi si attivano, Application Auto Scaling regola automaticamente la quantità di ambienti allocati utilizzando la simultaneità fornita. Utilizza il monitoraggio degli obiettivi per le applicazioni che non presentano modelli di traffico prevedibili.

Per scalare la concorrenza assegnata utilizzando il tracciamento delle destinazioni, utilizzate le operazioni RegisterScalableTarget e PutScalingPolicy Application Auto API Scaling. Ad esempio, se utilizzi il AWS Command Line Interface (CLI), segui questi passaggi:

  1. Registrare l'alias di una funzione come target di dimensionamento. L'esempio seguente registra l'BLUEalias di una funzione denominata: my-function

    aws application-autoscaling register-scalable-target --service-namespace lambda \ --resource-id function:my-function:BLUE --min-capacity 1 --max-capacity 100 \ --scalable-dimension lambda:function:ProvisionedConcurrency
  2. Applicare una policy di dimensionamento alla destinazione. L'esempio seguente configura Application Auto Scaling per modificare la configurazione di concorrenza fornita per un alias in modo da mantenere l'utilizzo vicino al 70 percento, ma è possibile applicare qualsiasi valore compreso tra il 10% e il 90%.

    aws application-autoscaling put-scaling-policy \ --service-namespace lambda \ --scalable-dimension lambda:function:ProvisionedConcurrency \ --resource-id function:my-function:BLUE \ --policy-name my-policy \ --policy-type TargetTrackingScaling \ --target-tracking-scaling-policy-configuration '{ "TargetValue": 0.7, "PredefinedMetricSpecification": { "PredefinedMetricType": "LambdaProvisionedConcurrencyUtilization" }}'

L'output visualizzato dovrebbe essere di questo tipo:

{ "PolicyARN": "arn:aws:autoscaling:us-east-2:123456789012:scalingPolicy:12266dbb-1524-xmpl-a64e-9a0a34b996fa:resource/lambda/function:my-function:BLUE:policyName/my-policy", "Alarms": [ { "AlarmName": "TargetTracking-function:my-function:BLUE-AlarmHigh-aed0e274-xmpl-40fe-8cba-2e78f000c0a7", "AlarmARN": "arn:aws:cloudwatch:us-east-2:123456789012:alarm:TargetTracking-function:my-function:BLUE-AlarmHigh-aed0e274-xmpl-40fe-8cba-2e78f000c0a7" }, { "AlarmName": "TargetTracking-function:my-function:BLUE-AlarmLow-7e1a928e-xmpl-4d2b-8c01-782321bc6f66", "AlarmARN": "arn:aws:cloudwatch:us-east-2:123456789012:alarm:TargetTracking-function:my-function:BLUE-AlarmLow-7e1a928e-xmpl-4d2b-8c01-782321bc6f66" } ] }

Application Auto Scaling crea due allarmi. CloudWatch Il primo allarme si attiva quando l'utilizzo della simultaneità fornita supera costantemente il 70%. In questo caso, Application Auto Scaling alloca più simultaneità con provisioning per ridurre l'utilizzo. Il secondo allarme si attiva quando l'utilizzo è costantemente inferiore al 63% (90% dell'obiettivo del 70%). In questo caso, Application Auto Scaling riduce la simultaneità di provisioning dell'alias.

Nell'esempio seguente, una funzione si dimensiona tra una quantità minima e massima di concorrenza di cui è stato eseguito il provisioning in base all'utilizzo.

Scalabilità automatica con il provisioning della concorrenza con il monitoraggio della destinazione Application Auto Scaling.
Legenda
  • Orange line = function instances Istanze di funzione

  • Gray line = function instances Richieste aperte

  • Diagonal orange stripes = provisioned concurrency. Simultaneità fornita

  • Vertical orange stripes = standard concurrency. Simultaneità standard

Quando il numero di richieste aperte aumenta, Application Auto Scaling aumenta la simultaneità fornita a grandi scaglioni fino a raggiungere il massimo configurato. Successivamente, la funzione può continuare a dimensionarsi in base alla simultaneità non riservata standard se non hai raggiunto il limiti di simultaneità dell'account. Quando l'utilizzo scende e rimane basso, Application Auto Scaling riduce la simultaneità fornita a piccoli scaglioni periodici.

Entrambi gli allarmi di Application Auto Scaling utilizzano per impostazione predefinita la statistica media. Le funzioni che rilevano picchi di traffico rapidi potrebbero non attivare questi allarmi. Ad esempio, supponiamo che la funzione Lambda venga eseguita velocemente (ovvero in 20-100 ms) e che il traffico presenti picchi rapidi. In tal caso, il numero di richieste supera la simultaneità fornita allocata durante il picco. Tuttavia, Application Auto Scaling richiede che il carico di picco duri almeno 3 minuti allo scopo di fornire ambienti aggiuntivi. Inoltre, entrambi gli CloudWatch allarmi richiedono 3 punti dati che raggiungano la media target per attivare la politica di auto scaling. Se la tua funzione registra rapidi picchi di traffico, l'utilizzo della statistica Maximum anziché della statistica Average può essere più efficace nel ridimensionare la concorrenza fornita per ridurre al minimo gli avviamenti a freddo.

Per ulteriori informazioni sulle policy di dimensionamento con monitoraggio degli obiettivi, consulta la sezione Policy di dimensionamento con monitoraggio degli obiettivi per Application Auto Scaling.