Konfiguration der bereitgestellten Parallelität für eine Funktion - AWS Lambda

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Konfiguration der bereitgestellten Parallelität für eine Funktion

In Lambda beschreibt die Gleichzeitigkeit die Anzahl der In-Flight-Anfragen, die Ihre Funktion gleichzeitig bearbeitet. Es gibt zwei Arten von Gleichzeitigkeitskontrollen:

  • Reservierte Gleichzeitigkeit ist die maximale Anzahl der gleichzeitigen Instances, die Ihrer Funktion zugewiesen sind. Wenn für eine Funktion Gleichzeitigkeit reserviert ist, kann keine andere Funktion diese Gleichzeitigkeit nutzen. Reservierte Parallelität ist nützlich, um sicherzustellen, dass Ihre wichtigsten Funktionen immer über genügend Parallelität verfügen, um eingehende Anfragen zu bearbeiten. Für die Konfiguration reservierter Gleichzeitigkeit für eine Funktion wird keine zusätzliche Gebühr erhoben.

  • Die bereitgestellte Gleichzeitigkeit beschreibt die Anzahl der vorinitialisierten Ausführungsumgebungen, die Ihrer Funktion zugewiesen sind. Diese Ausführungsumgebungen sind bereit, sofort auf eingehende Funktionsanforderungen zu reagieren. Bereitgestellte Parallelität ist nützlich, um die Latenzen beim Kaltstart von Funktionen zu reduzieren. Für die Konfiguration der bereitgestellten Parallelität fallen zusätzliche Gebühren für Sie an. AWS-Konto

In diesem Thema wird beschrieben, wie Sie bereitgestellte Gleichzeitigkeit verwalten und konfigurieren. Eine konzeptionelle Übersicht über diese beiden Arten von Gleichzeitigkeitssteuerungen finden Sie unter Reservierte Gleichzeitigkeit und bereitgestellte Gleichzeitigkeit. Weitere Informationen zur Konfiguration der reservierten Gleichzeitigkeit finden Sie unter Reservierte Parallelität für eine Funktion konfigurieren.

Anmerkung

Lambda-Funktionen, die mit einer Amazon-MQ-Ereignisquellenzuordnung verknüpft sind, haben standardmäßig die maximale Gleichzeitigkeit. Für Apache Active MQ ist die maximale Anzahl der gleichzeitigen Instances 5. Für Rabbit MQ ist die maximale Anzahl der gleichzeitigen Instances 1. Wenn Sie für Ihre Funktion eine reservierte oder bereitgestellte Parallelität festlegen, werden diese Grenzwerte nicht geändert. Um eine Erhöhung der standardmäßigen maximalen Parallelität bei der Verwendung von Amazon MQ zu beantragen, wenden Sie sich an. AWS Support

Konfigurieren von Provisioned Concurrency

Sie können die Einstellungen der bereitgestellten Gleichzeitigkeit für eine Funktion mit der Lambda-Konsole oder mit der Lambda-API konfigurieren.

So weisen Sie einer Funktion bereitgestellte Gleichzeitigkeit zu (Konsole)
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie die Funktion aus, der Sie bereitgestellte Gleichzeitigkeit zuweisen möchten.

  3. Wählen Sie Konfiguration und anschließend Gleichzeitigkeit aus.

  4. Wählen Sie unter Provisioned concurrency configurations (Bereitgestellte Gleichzeitigkeitskonfigurationen) die Option Add (Hinzufügen) aus.

  5. Wählen Sie den Qualifizierungstyp und den Alias oder die Version aus.

    Anmerkung

    Sie können die bereitgestellte Gleichzeitigkeit nicht mit der $LATEST-Version einer Funktion verwenden.

    Wenn Ihre Funktion eine Ereignisquelle hat, müssen Sie sicherstellen, dass die Ereignisquelle auf den richtigen Funktionsalias bzw. die richtige Funktionsversion verweist. Anderenfalls verwendet Ihre Funktion keine bereitgestellten Gleichzeitigkeitsumgebungen.

  6. Geben Sie unter Bereitgestellte Gleichzeitigkeit eine Zahl ein. Lambda bietet eine Schätzung der monatlichen Kosten.

  7. Wählen Sie Speichern.

Sie können in Ihrem Konto Gleichzeitigkeit bis zur nicht reservierten Konto-Gleichzeitigkeit minus 100 konfigurieren. Die verbleibenden 100 Gleichzeitigkeitseinheiten sind für Funktionen bestimmt, die keine reservierte Gleichzeitigkeit verwenden. Wenn Ihr Konto beispielsweise einen Gleichzeitigkeitsgrenzwert von 1 000 aufweist und Sie keiner anderen Funktion reservierte oder bereitgestellte Gleichzeitigkeit zugewiesen haben, können Sie maximal 900 bereitgestellte Gleichzeitigkeitseinheiten für eine einzelne Funktion konfigurieren.

Wenn Sie versuchen, zu viel bereitgestellte Gleichzeitigkeit zuzuweisen, tritt ein Fehler auf.

Die Konfiguration der bereitgestellten Gleichzeitigkeit für eine Funktion wirkt sich auf den Pool für die Gleichzeitigkeit aus, der für andere Funktionen verfügbar ist. Wenn Sie beispielsweise 100 bereitgestellte Gleichzeitigkeitseinheiten für function-a konfigurieren, müssen sich andere Funktionen in Ihrem Konto die verbleibenden 900 Gleichzeitigkeitseinheiten teilen. Das gilt auch, wenn function-a nicht alle 100 Einheiten verwendet.

Sie können für eine Funktion sowohl reservierte als auch bereitgestellte Gleichzeitigkeit festlegen. In solchen Fällen darf die bereitgestellte Gleichzeitigkeit die reservierte Gleichzeitigkeit nicht überschreiten.

Dieser Grenzwert gilt auch für Funktionsversionen. Die maximale Menge an bereitgestellter Gleichzeitigkeit, die Sie einer bestimmten Funktionsversion zuweisen können, entspricht der reservierten Gleichzeitigkeit der Funktion abzüglich der in anderen Funktionsversionen bereitgestellten Gleichzeitigkeit.

Verwenden Sie für die Konfiguration der bereitgestellten Gleichzeitigkeit mithilfe der Lambda-API die folgenden API-Operationen:

Verwenden Sie beispielsweise den Befehl, um die bereitgestellte Parallelität mit der AWS Command Line Interface (CLI) zu konfigurieren. put-provisioned-concurrency-config Der folgende Befehl weist 100 Einheiten bereitgestellter Gleichzeitigkeit für den Alias BLUE einer Funktion namens my-function zu:

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

Die Ausgabe sollte ungefähr wie folgt aussehen:

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

Genaue Schätzung der erforderlichen bereitgestellten Parallelität für eine Funktion

Sie können die Parallelitätsmetriken jeder aktiven Funktion mithilfe von Metriken anzeigen. CloudWatch Insbesondere zeigt Ihnen die ConcurrentExecutions-Metrik die Anzahl der gleichzeitigen Aufrufe für Funktionen in Ihrem Konto.

Diagramm, das die Gleichzeitigkeit einer Funktion im Laufe der Zeit zeigt.

Aus dem vorstehenden Diagramm geht hervor, dass diese Funktion jederzeit im Durchschnitt 5 bis 10 gleichzeitige Anforderungen verarbeitet und Spitzenwerte von 20 Anforderungen erreicht. Angenommen, Ihr Konto enthält viele andere Funktionen. Wenn diese Funktion für Ihre Anwendung von entscheidender Bedeutung ist und Sie bei jedem Aufruf eine Reaktion mit geringer Latenz wünschen, legen Sie für die bereitgestellte Gleichzeitigkeit eine Zahl fest, die größer oder gleich 20 ist.

Denken Sie daran, dass Sie die Gleichzeitigkeit auch mit der folgenden Formel berechnen können:

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

Um abzuschätzen, wie viel Gleichzeitigkeit Sie benötigen, multiplizieren Sie die durchschnittlichen Anfragen pro Sekunde mit der durchschnittlichen Anfragedauer in Sekunden. Sie können die durchschnittlichen Anfragen pro Sekunde anhand der Invocation-Metrik und die durchschnittliche Anfragedauer in Sekunden anhand der Duration-Metrik schätzen.

Beim Konfigurieren der bereitgestellten Gleichzeitigkeit schlägt Lambda vor, einen Puffer von 10 % zusätzlich zu der Menge an Gleichzeitigkeit einzuplanen, die Ihre Funktion normalerweise benötigt. Wenn die Funktion normalerweise bei 200 gleichzeitigen Anforderungen Spitzenwerte erreicht, sollten Sie die bereitgestellte Gleichzeitigkeit auf 220 festlegen (200 gleichzeitige Anforderungen + 10 % = 220 bereitgestellte Gleichzeitigkeit).

Optimierung des Funktionscodes bei Verwendung der bereitgestellten Parallelität

Wenn Sie bereitgestellte Parallelität verwenden, sollten Sie erwägen, Ihren Funktionscode umzustrukturieren, um ihn für eine geringe Latenz zu optimieren. Für Funktionen, die bereitgestellte Parallelität verwenden, führt Lambda während der Zuweisungszeit jeden Initialisierungscode aus, z. B. das Laden von Bibliotheken und das Instanziieren von Clients. Daher bietet es sich an, möglichst viele Initialisierungen außerhalb des Hauptfunktionshandlers zu verschieben, um bei tatsächlichen Funktionsaufrufen Latenzprobleme zu vermeiden. Im Gegensatz dazu bedeutet das Initialisieren von Bibliotheken oder das Instanziieren von Clients innerhalb Ihres Haupthandlercodes, dass Ihre Funktion dies bei jedem Aufruf ausführen muss (dies geschieht unabhängig davon, ob Sie die bereitgestellte Parallelität verwenden).

Bei On-Demand-Aufrufen muss Lambda den Initialisierungscode möglicherweise jedes Mal neu ausführen, wenn die Funktion einen Kaltstart durchführt. In diesem Fall können Sie die Initialisierung einzelner Fähigkeiten verschieben, bis Ihre Funktion sie benötigt. Sehen Sie sich zum Beispiel den folgenden Steuerungsablauf für einen Lambda-Handler an:

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

Im vorherigen Beispiel entschied sich der Entwickler dagegen, CLIENT_A außerhalb des Haupthandlers zu initialisieren, und initialisierte ihn stattdessen innerhalb der if-Anweisung. Auf diese Weise führt Lambda diesen Code nur aus, wenn die Bedingung some_condition erfüllt wird. Wenn CLIENT_A außerhalb des Haupthandlers initialisiert wird, führt Lambda diesen Code bei jedem Kaltstart aus. Das kann die Gesamtlatenz erhöhen.

Verwendung von Umgebungsvariablen zur Anzeige und Steuerung des Parallelitätsverhaltens bei der Bereitstellung

Es ist möglich, dass Ihre Funktion die gesamte bereitgestellte Gleichzeitigkeit verbraucht. Lambda verwendet On-Demand-Instances, um zusätzlichen Datenverkehr zu verarbeiten. Um festzustellen, welche Art von Initialisierung Lambda für eine bestimmte Umgebung verwendet hat, überprüfen Sie den Wert der Umgebungsvariable AWS_LAMBDA_INITIALIZATION_TYPE. Diese Variable hat zwei mögliche Werte: provisioned-concurrency oder on-demand. Der Wert von AWS_LAMBDA_INITIALIZATION_TYPE ist unveränderlich und bleibt während der gesamten Lebensdauer der Umgebung konstant. Informationen zum Überprüfen des Werts einer Umgebungsvariablen in Ihrem Funktionscode finden Sie unter. Lambda-Umgebungsvariablen abrufen

Bei Verwendung der .NET 6- oder .NET 7-Laufzeit können Sie die Umgebungsvariable AWS_LAMBDA_DOTNET_PREJIT konfigurieren, um die Latenz für Funktionen zu verbessern, auch wenn diese keine bereitgestellte Gleichzeitigkeit verwenden. Die .NET-Laufzeitumgebung führt für jede Bibliothek, die der Code zum ersten Mal aufruft, eine verzögerte Kompilierung und Initialisierung durch. Daher kann der erste Aufruf einer Lambda-Funktion länger dauern als nachfolgende Aufrufe. Um dies zu verhindern, können Sie einen von drei Werten für AWS_LAMBDA_DOTNET_PREJIT wählen:

  • ProvisionedConcurrency: Lambda führt die ahead-of-time JIT-Kompilierung für alle Umgebungen mithilfe der bereitgestellten Parallelität durch. Dies ist der Standardwert.

  • Always: Lambda führt die ahead-of-time JIT-Kompilierung für jede Umgebung durch, auch wenn die Funktion keine bereitgestellte Parallelität verwendet.

  • Never: Lambda deaktiviert die ahead-of-time JIT-Kompilierung für alle Umgebungen.

Grundlegendes zum Protokollierungs- und Abrechnungsverhalten bei bereitgestellter Parallelität

Für bereitgestellte Gleichzeitigkeitsumgebungen wird der Initialisierungscode Ihrer Funktion während der Zuordnung und alle paar Stunden ausgeführt, da Lambda aktive Instances Ihrer Umgebung recycelt. Sie können die Initialisierungszeit in Protokollen und Ablaufverfolgungsdaten anzeigen, nachdem eine Umgebungs-Instance eine Anforderung verarbeitet hat. Beachten Sie jedoch, dass Lambda die Initialisierung auch dann abrechnet, wenn die Umgebungs-Instance niemals eine Anforderung verarbeitet. Die bereitgestellte Gleichzeitigkeit wird laufend ausgeführt und getrennt von den Initialisierungs- und Aufrufkosten in Rechnung gestellt. Weitere Einzelheiten finden Sie unter AWS Lambda -Preise.

Wenn Sie eine Lambda-Funktion mit bereitgestellter Parallelität konfigurieren, initialisiert Lambda außerdem diese Ausführungsumgebung vor, sodass sie vor Funktionsaufrufanforderungen verfügbar ist. Ihre Funktion veröffentlicht Aufrufprotokolle jedoch nur dann, wenn die Funktion tatsächlich aufgerufen wird. CloudWatch Daher erscheint das Feld Init Duration in der REPORT Protokollzeile des ersten Funktionsaufrufs, obwohl die Initialisierung im Voraus erfolgte. Dies bedeutet nicht, dass die Funktion einen Kaltstart erlitten hat.

Verwenden von Application Auto Scaling zur Automatisierung des bereitgestellten Parallelitätsmanagements

Application Auto Scaling ermöglicht es Ihnen, die bereitgestellte Gleichzeitigkeit nach einem Zeitplan oder basierend auf der Auslastung zu verwalten. Wenn Sie vorhersehbare Auslastungsmuster für Ihre Funktion beobachten, verwenden Sie die geplante Skalierung. Wenn Sie möchten, dass Ihre Funktion einen bestimmten Auslastungsprozentsatz beibehält, verwenden Sie eine Richtlinie für die Zielverfolgungsskalierung.

Geplante Skalierung

Application Auto Scaling ermöglicht es Ihnen, Ihren eigenen Skalierungsplan entsprechend vorhersehbarer Laständerungen festzulegen. Weitere Informationen und Beispiele finden Sie unter Geplante Skalierung für Application Auto Scaling im Application Auto Scaling Scaling-Benutzerhandbuch und Scheduling AWS Lambda Provisioned Concurrency für wiederkehrende Spitzennutzung im AWS Compute-Blog.

Zielverfolgung

Mit der Zielverfolgung erstellt und verwaltet Application Auto Scaling eine Reihe von CloudWatch Alarmen, die darauf basieren, wie Sie Ihre Skalierungsrichtlinie definieren. Wenn diese Alarme aktiviert werden, passt Application Auto Scaling mithilfe der bereitgestellten Gleichzeitigkeit automatisch die Anzahl der zugewiesenen Umgebungen an. Verwenden Sie die Zielverfolgung für Anwendungen, die keine vorhersehbaren Auslastungsmuster aufweisen.

Verwenden Sie die API-Operationen RegisterScalableTarget und PutScalingPolicy Application Auto Scaling, um die bereitgestellte Gleichzeitigkeit mithilfe der Zielverfolgung zu skalieren. Wenn Sie beispielsweise die AWS Command Line Interface (CLI) verwenden, gehen Sie wie folgt vor:

  1. Registrieren Sie den Alias einer Funktion als Skalierungsziel. Im folgenden Beispiel wird der BLUE-Alias einer Funktion mit dem Namen my-function registriert:

    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. Wenden Sie eine Skalierungsrichtlinie auf das Ziel an. Im folgenden Beispiel wird Application Auto Scaling so konfiguriert, dass die bereitgestellte Parallelitätskonfiguration für einen Alias so angepasst wird, dass die Auslastung nahezu 70 Prozent beträgt. Sie können jedoch jeden Wert zwischen 10 und 90% anwenden.

    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" }}'

Die Ausgabe sollte in etwa wie folgt aussehen:

{ "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 erstellt zwei Alarme in CloudWatch. Der erste Alarm wird ausgelöst, wenn die Auslastung der bereitgestellten Gleichzeitigkeit konstant 70 % überschreitet. In diesem Fall weist Application Auto Scaling mehr bereitgestellte Gleichzeitigkeit zu, um die Auslastung zu reduzieren. Der zweite Alarm wird ausgelöst, wenn die Auslastung konstant unter 63 % (90 % des 70-%-Ziels) liegt. In diesem Fall reduziert Application Auto Scaling wird die bereitgestellte Gleichzeitigkeit des Alias.

Im folgenden Beispiel skaliert eine Funktion basierend auf der Auslastung zwischen einem minimalen und einem maximalen Umfang bereitgestellter Gleichzeitigkeit.

Automatische Skalierung bereitgestellter Gleichzeitigkeit mit der Zielverfolgung von Application Auto Scaling
Legende
  • Funktions-Instances

  • Offene Anforderungen

  • Bereitgestellte Concurrency

  • Standard-Gleichzeitigkeit

Wenn die Anzahl der offenen Anforderungen zunimmt, erhöht Application Auto Scaling die bereitgestellte Gleichzeitigkeit in großen Schritten, bis sie das konfigurierte Maximum erreicht. Danach kann die Funktion weiter die standardmäßige, nicht reservierte Gleichzeitigkeit skalieren, falls das Kontogleichzeitigkeitslimit nicht erreicht ist. Wenn die Auslastung sinkt und niedrig bleibt, verringert Application Auto Scaling die bereitgestellte Gleichzeitigkeit in kleineren periodischen Schritten.

Beide Alarme für Application Auto Scaling verwenden standardmäßig die Durchschnittsstatistik. Funktionen, die in kurzen Abständen auftretende Auslastungsmuster aufweisen, lösen diese Alarme möglicherweise nicht aus. Nehmen wir zum Beispiel an, Ihre Lambda-Funktion wird schnell ausgeführt (d. h. 20–100 ms) und der Datenverkehr kommt in kurzen Schüben (Bursts). In diesem Fall übersteigt die Anzahl der Anfragen die zugewiesene, bereitgestellte Gleichzeitigkeit während eines Bursts. Beim Application Auto Scaling muss die Burst-Last jedoch mindestens 3 Minuten lang aufrechterhalten werden, um zusätzliche Umgebungen bereitzustellen. Darüber hinaus benötigen beide CloudWatch Alarme 3 Datenpunkte, die den Zieldurchschnitt erreichen, um die Auto Scaling-Richtlinie zu aktivieren. Wenn Ihre Funktion schnell stark ausgelastet ist, kann die Verwendung der Maximum-Statistik anstelle der Durchschnittsstatistik effektiver sein, um die bereitgestellte Parallelität zu skalieren und so Kaltstarts zu minimieren.

Weitere Informationen zu Zielverfolgungs-Skalierungsrichtlinien finden Sie unter Zielverfolgungs-Skalierungsrichtlinien für das Application Auto Scaling.