Was ich getan habe, als ich mit Lambda Python im Zeitlimit steckte

Einführung

Im alten Lambda betrug das Zeitlimit 5 Minuten, und in der Stapelverarbeitung wurde das Zeitlimit überschritten und es wurde abnormal beendet. Außerdem soll Lambda, das vom API-Gateway gestartet wurde, "nicht schneller sein können". Ich werde den Inhalt der Korrespondenz zu diesem Zeitpunkt vorstellen

Da ich Ingenieur bin, sollte ich mit numerischen Werten sprechen, aber ich werde es weglassen, da es aus verschiedenen Gründen verwirrend ist, z. B. was im vorherigen Job getan wurde, keine Umgebung zur Verfügung steht und nur für diesen Artikel eine Umgebung erstellt wird. Machen

Ein kleiner Umweg

Wenn es ein Problem mit der Antwort gibt, werde ich zuerst ein Profil erstellen, aber ich werde auch notieren, wie ich es immer mache, nur für den Fall

Zielbibliothek

import cProfile
import pstats

Sie können ein Profil nur mit cProfile erstellen, aber Sie verwenden auch pstats, um die Ergebnisse zu sortieren.

Starten Sie den Test

Instanziieren Sie cProfile und aktivieren Sie die Messung

pr = cProfile.Profile()
pr.enable()

Messende und Bestätigung der Ergebnisse

Deaktivieren Sie das Profil und generieren Sie ein Objekt zum Sortieren Sortieren und ausgeben

pr.disable()
stats = pstats.Stats(pr)
stats.sort_stats('tottime')
stats.print_stats()

Informationen darüber, welche Art von Elementen sortiert werden kann, finden Sie im Handbuch.

Möglicherweise finden Sie in Ihrem Profil keinen erkennbaren Engpass In diesem Fall gab es Fälle, in denen die Verbesserung der Bereiche, in denen E / A wahrscheinlich zu guten Ergebnissen führte.

Hauptthema

DictCur von psycopg2

Es ist sehr praktisch, auf die Suchergebnisse mit "Dikt" anstatt auf "Liste" verweisen zu können, aber es war ein großer Engpass, da die zu diktierenden Mapping-Kosten hoch waren. Es scheint, dass die Tatsache, dass die Zieltabelle eine beträchtliche Anzahl von Spalten hatte, ebenfalls Auswirkungen hat. Ich gab DictCur auf und abstrahierte stattdessen den Index der Liste mit einer Konstante, um dies zu vermeiden

Referenz-URL: Mit Python psycopg2 Ergebnisse im Diktatformat abrufen

logger Wenn Sie Lambda drucken, wird das Protokoll in CloudWatch-Protokollen angezeigt, der problematische Lambda-Protokollierer wurde jedoch verwendet Logger-Einstellungen [Dunkelheit](https://qiita.com/amedama/items/b856b2f30c2f38665701#%E4%BD%95%E6%95%85%E3%83%80%E3%83%A1%E3% 81% AA% E3% 81% AE% E3% 81% 8B-Protokollierung) scheint tief zu sein, daher besteht der Zweck hier nur darin, das Protokoll zu sehen.

Durch einfaches Ändern des Loggers zum Drucken wurde die Verarbeitungsgeschwindigkeit verbessert Ich wollte auch den Ausgabepegel wie einen Logger steuern, deshalb habe ich eine einfache Funktion erstellt, um die Log-Ausgabe zu verpacken, um die für den Logger erforderlichen Funktionen nicht zu beeinträchtigen.

In einigen Fällen verbesserte sich die Verarbeitungsgeschwindigkeit einfach durch Verringern der Anzahl der Ausdrucke. Das Protokoll wird im Produktionsbetrieb benötigt, aber ich denke, es gibt Fälle, in denen das Protokoll, das nur in der Entwicklung benötigt wird, weggelassen wird. Ich möchte nur die Protokolle ausgeben, die ich wirklich brauche

Cache 1

boto3 stach heraus, als ich das Profil nahm Das bedeutet nicht, dass Sie das SDK nicht verwenden können

Also habe ich das einmal generierte boto3-Objekt zwischengespeichert und den Cache ab dem zweiten Mal verwendet. Es war ein ziemlich großer Lambda, bestehend aus mehreren Dateien und 10 oder mehr Klassen. Geändert, um das generierte boto3-Objekt in der Eigenschaft der Klasse zu belassen

if self.__XXXX_table_obj is None:
    self.__XXXX_table_obj = boto3.resource("dynamodb").Table(self.get_XXXX_table())`

Außerdem wird das Master-Referenzergebnis in der Eigenschaft zwischengespeichert.

if XXXX_id in self.__XXXX_cache:
    return self.__client_cache[XXXX_id]

Da es sich nicht um eine Anwendung handelt, auf die häufig zugegriffen wird, kann außerdem ein neuer Master erworben werden, wenn der Lambda-Container neu generiert wird.

Cache 2

Ich denke, es gibt Zeiten, in denen Sie Ihre Zielzeit nicht erreichen können, egal was Sie tun. Bei dem fraglichen System wurden die Daten in regelmäßigen Abständen stapelweise aktualisiert. Daher sollte derselbe Inhalt zurückgegeben werden, während die Daten nicht aktualisiert werden.

Daher wird das Verarbeitungsergebnis (Json) in DynamoDB registriert und sein Inhalt zurückgegeben. Der Schlüssel ist API-Name + Parameter Das API-System war einfach, daher gab es kein Problem.

Wenn die Daten aktualisiert werden, werden Sie über SNS benachrichtigt. Registrieren Sie daher den Inhalt von DynamoDB erneut.

Eine Fehleinschätzung war der Maximalwert (400 KB), der in DynamoDB gespeichert werden kann. Da war ein Json vorbei Da es sich um einen JSON mit vielen sich wiederholenden Elementen handelte, habe ich nichts erhalten, indem ich ihn komprimiert und als Binärdatei registriert habe.

Am Ende

Es tut mir leid für all die kleinen Geschichten, aber ich hoffe, dieser Artikel hilft denen, die sich Sorgen über die Verarbeitungsgeschwindigkeit von Python Lambda machen.

Recommended Posts

Was ich getan habe, als ich mit Lambda Python im Zeitlimit steckte
Eine Erinnerung an das, was ich beim Starten von Atcoder mit Python feststeckte
Was ich zum ersten Mal in Python bekommen habe
Was ich an der GUI in der WSL-Python-Umgebung hängen geblieben bin
Was ich getan habe, um die Python2 EOL mit Zuversicht zu begrüßen
Ich blieb stecken, als ich versuchte, einen relativen Pfad mit relative_to () in Python anzugeben
Was ich getan habe, als ich wütend war, es mit der Option enable-shared einzufügen
Ich habe einen AttributeError erhalten, als ich die offene Methode in Python verspottet habe
Was ich mit Python-Arrays gemacht habe
Laden Sie das, was Sie angefordert haben, mit AWS Lambda Python in S3 hoch
[Bei Coder] Was ich getan habe, um den grünen Rang in Python zu erreichen
Was ich beim Update von Python 2.6 auf 2.7 gemacht habe
[Frage] Was passiert, wenn Sie% in Python verwenden?
Ich habe eine Fehlermeldung erhalten, als ich opencv mit Raspeye in Python3 eingefügt habe [Remedy]
django geodjango Ich habe mich darauf bezogen, als ich im Tutorial feststeckte (Bearbeitung)
Als ich das Verzeichnis für UNIX Socket unter / var / run mit systemd geschnitten habe, steckte ich in einer Falle und was zu tun ist
Was beim Nachahmen zu tun ist, wird in Python eingebettet
Als ich versuchte, Python3 in Atom einzuführen, blieb ich stecken
Was ich in Python gelernt habe
Mezzanine-Einführungsnotiz, dass ich im Fluss stecken geblieben bin
Ich habe mich im Labyrinth verlaufen
Ich mochte den Tweet mit Python. ..
Ich habe die Warteschlange in Python geschrieben
Ich habe den Stack in Python geschrieben
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich habe die Berechnungszeit des in Python geschriebenen gleitenden Durchschnitts verglichen
Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe
Was ich getan habe, als ich Python schneller machen wollte - Numba Edition -
Was tun, wenn der Werttyp in Python nicht eindeutig ist?
Was soll ich denn mit der Python-Verzeichnisstruktur machen?
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Was ich durch das Schreiben einer Python Pull-Anfrage zum ersten Mal in meinem Leben gelernt habe
Verhalten bei der Rückkehr in den with-Block
Worauf ich mich bei der Verwendung von Tensorflow-gpu eingelassen habe
So ermitteln Sie mit Python den Unterschied zwischen Datum und Uhrzeit in Sekunden
Zeigen Sie Python 3 im Browser mit MAMP an
Ich habe Umgebungsvariablen in Docker festgelegt und in Python angezeigt.
Was ist "Mahjong" in der Python-Bibliothek? ??
Was ich von Python Boot Camp bekommen habe
MongoDB mit Python zum ersten Mal
Abrufen und Konvertieren der aktuellen Zeit in der lokalen Systemzeitzone mit Python
Was ich getan habe, als ich den Feature-Punkt mit dem optischen Fluss von opencv nicht finden konnte und als ich ihn verloren habe
Ich war festgefahren, eine Kolbenanwendung mit einem Reverse-Proxy dazwischen umzuleiten
Ein nützlicher Hinweis, wenn Sie Python nach langer Zeit verwenden
Ich habe gerade FizzBuzz mit AWS Lambda gemacht
Was ich getan habe, um Python-Speicher zu speichern
Die Geschichte, die nichts mit der Partition zu tun hatte, als ich zum ersten Mal eine Festplatten-Sicherung mit dd durchführte
Als ich versuchte, Python unter WSL (Windows-Subsystem für Linux) zu verwenden, blieb es in Jupyter stecken (gelöst)
Ich habe Pygame mit Python 3.5.1 in der Umgebung von pyenv unter OS X installiert
Visualisieren Sie Informationen zum Beschleunigungssensor von der Mikrocomputerplatine in Echtzeit mit mbed + Python
Bei der Konvertierung von CSV in JSON mit Python bin ich auf einen Zeichencode gestoßen
Ich habe die Zeit gemessen, als ich das C-sprachabhängige Modul mit alpine installiert habe
Drehen Sie in Python mehrere Listen mit for-Anweisung gleichzeitig
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Beim Speichern mit OpenCV ist ein Fehler aufgetreten
[Python3] Eine Geschichte, die bei der Zeitzonenkonvertierung steckt
Python: Ich konnte in Lambda rekursieren
Was ist im Docker Python-Image pfeifend?