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
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
import cProfile
import pstats
Sie können ein Profil nur mit cProfile erstellen, aber Sie verwenden auch pstats, um die Ergebnisse zu sortieren.
Instanziieren Sie cProfile und aktivieren Sie die Messung
pr = cProfile.Profile()
pr.enable()
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.
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
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.
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.
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