Aws-lambda-dotnet: Probleme mit dem Lambda-Speicherverbrauch

Erstellt am 15. Okt. 2018  ·  7Kommentare  ·  Quelle: aws/aws-lambda-dotnet

Vor kurzem haben wir eine Zunahme der ständig wachsenden Speichernutzung bestimmter Funktionen festgestellt, was zu Process exited before completing request und einer neuen Lambda-Instanz führte.

Wir haben dies zum ersten Mal am 11.09.2018 um 12:43:06 Uhr bemerkt. Kurz zuvor hatten wir eine Bereitstellung durchgeführt, bei der die Laufzeit von dotnetcore2.0 auf 2.1 geändert wurde. Es wurden keine weiteren wesentlichen Änderungen am Code vorgenommen, die einen Speicherverlust verursachen könnten, und er wurde vor dieser Bereitstellung fehlerfrei ausgeführt.

Ich habe den Fehler mit folgendem Code reproduziert:

public class DynamoDBTrigger
{
    private IAmazonDynamoDB _ddbClient;

    public DynamoDBTrigger()
    {
        _ddbClient = new AmazonDynamoDBClient();
    }

    [LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
    public void Process(DynamoDBEvent ev, ILambdaContext context)
    {
        foreach (var record in ev.Records)
        {
            var item = Convert(record.Dynamodb.NewImage);
            context.Logger.Log(JsonConvert.SerializeObject(item));                
        }
    }

    private Item Convert(Dictionary<string, AttributeValue> attributeMap)
    {
        using (var context = new DynamoDBContext(_ddbClient))
        {
            var doc = Document.FromAttributeMap(attributeMap);
            return context.FromDocument<Item>(doc, new DynamoDBOperationConfig { OverrideTableName = Environment.GetEnvironmentVariable("Table") });
        }
    }
}

Ich schreibe eine Zeile pro Sekunde in das auslösende Tablean und sehe eine Speichererhöhung von etwa 1 MB pro 3 Aufrufe, die dazu führt, dass es eine Weile bei 128 MB liegt, bevor ich dies protokolliere:

START RequestId: 3e5acba1-36fd-4a3a-bf84-659c5488437b Version: $LATEST
END RequestId: 3e5acba1-36fd-4a3a-bf84-659c5488437b
REPORT RequestId: 3e5acba1-36fd-4a3a-bf84-659c5488437b  Duration: 2293.32 ms    Billed Duration: 2300 ms Memory Size: 128 MB    Max Memory Used: 128 MB 
RequestId: 3e5acba1-36fd-4a3a-bf84-659c5488437b Process exited before completing request

Ich habe versucht, und das gleiche passiert mit einer 256-MB-Konfiguration, und der Anstieg scheint linear zu sein.

Ähnliches habe ich bei einem API-Gateway-Lambda-Proxy beobachtet, der den Einstiegspunkt ApiGatewayProxyFunction verwendet. In diesem Fall steigt der Speicher linear an, bis er die Grenze erreicht, an der er eine Weile verbleibt, bevor ASP.NET anscheinend Speicher löschen möchte:
image
Hervorheben von drei Beobachtungen:
1) hohe Dauer beim Aufruf vor und nach der Speicherbereinigung
2) Maximal verwendeter Speicher von 128 MB auf 68 MB gesunken
3) Derselbe verwendete Protokolldatenstrom, sodass die Lambda-Instanz nicht verworfen wird

Ich habe das Gefühl, dass wir nichts geändert oder neue Pakete hineingezogen haben. Könnte es möglich sein, dass die Veröffentlichung von .NET Core 2.1.4 ungefähr zur gleichen Zeit in der letzten Woche diese Verhaltensänderung verursacht hat?

bug closed-for-staleness modullambda-client-lib response-requested

Hilfreichster Kommentar

Ich habe auch ein wiederholbares Muster bemerkt. Wenn ich eine Veröffentlichung für ein C # -Lambda durchführe und es dann ausführe und den Speicherverbrauch betrachte, hat es einen Wert, z. B. 74 MB. Wenn ich es einfach erneut veröffentliche, keine Änderung, keine Neukompilierung, wird es mit einem geringeren Speicherverbrauch ausgeführt, z. B. 66 MB

Ich sehe auch, dass Projekte, die in Ordnung waren, jetzt das 128-MB-Limit überschreiten und der Prozess vorzeitig beendet wird.

Alle 7 Kommentare

Ich habe auch ein wiederholbares Muster bemerkt. Wenn ich eine Veröffentlichung für ein C # -Lambda durchführe und es dann ausführe und den Speicherverbrauch betrachte, hat es einen Wert, z. B. 74 MB. Wenn ich es einfach erneut veröffentliche, keine Änderung, keine Neukompilierung, wird es mit einem geringeren Speicherverbrauch ausgeführt, z. B. 66 MB

Ich sehe auch, dass Projekte, die in Ordnung waren, jetzt das 128-MB-Limit überschreiten und der Prozess vorzeitig beendet wird.

128 MB können den Prozess kaum starten, geschweige denn effektiv ausführen. Nachdem ich kürzlich die Kaltstartleistung für eine relativ einfache ASP.NET Core Lambda Proxy-Implementierung unter Verwendung aller verfügbaren Speicherbeschränkungen getestet habe, kann ich mit großer Sicherheit sagen, dass die Kommentatoren vor mir den GC während des gesamten Anforderungslebenszyklus verprügeln und ihre eigenen Speicherprobleme verursachen.

Sie werden niedrige Kaltstarts im einstelligen Sekundenbereich und Reaktionszeiten von weniger als einer Millisekunde beobachten, wenn sie ihr Speicherlimit auf ein Niveau erhöhen, das für die Speicheranforderungen ihrer Anwendung geeignet ist und die Start- und Ausführungszeiten minimiert, ohne die Kosten pro Jahr zu erhöhen starten / ausführen.

Ich habe ein Lambda mit 3 GB Speicher. Aber ich sehe auch das gleiche Problem. Am Anfang dauert mein Prozess ungefähr 1,5 G, nimmt aber allmählich zu. Manchmal verbraucht dieselbe Eingabe sehr unterschiedliche Speichermengen (was zu Abbrüchen führt). Mein Code enthält nichts Zufälliges, was dazu führen würde, dass der Speicherverbrauch variiert.

@twopointzero 128 MB waren in meinem Beispiel ausreichend für das Lambda, bevor es auf .NET Core 2.0 aktualisiert wurde.

Ich bin damit einverstanden, dass 128 MB für ASP.NET Lambda Proxies nicht ausreichen, Microsoft.AspNetCore.App jedoch nicht verwendet wird

Dies hat etwas damit zu tun, dass der Behälter auch nach Abschluss der Funktion warm ist. Anstatt "" zurückzugeben, null. Nur Panik und es würde das Problem lösen. Ich weiß, es ist ein Hack, aber so ist es atm.

Tritt dieses Problem bei aktuellen Lambda-Versionen immer noch auf?

Dieses Problem hat innerhalb von 2 Wochen keine Antwort erhalten. Wenn Sie dieses Problem offen halten möchten, hinterlassen Sie bitte unten einen Kommentar und das automatische Schließen wird abgebrochen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen