Ce que j'ai fait quand je suis resté coincé dans le délai avec lambda python

introduction

Dans l'ancien temps, Lambda avait un délai de 5 minutes, et dans le traitement par lots, le délai était dépassé et il se terminait anormalement. En outre, Lambda démarré à partir d'API Gateway est dit "ne peut pas être plus rapide". Je présenterai le contenu de la correspondance à ce moment-là

Puisque je suis ingénieur, je devrais parler de valeurs numériques, mais je vais l'omettre car c'est le contenu du travail précédent, il n'y a pas d'environnement à portée de main, et créer un environnement juste pour cet article est déroutant pour diverses raisons. Faire

Un petit détour

S'il y a un problème avec la réponse, je prendrai d'abord un profil, mais je noterai également comment je le fais toujours au cas où

Bibliothèque cible

import cProfile
import pstats

Vous pouvez obtenir un profil uniquement avec cProfile, mais vous utilisez également pstats pour trier les résultats.

Commencer la mesure

Instancier cProfile et activer la mesure

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

Fin de la mesure et confirmation des résultats

Désactiver le profil et générer un objet pour le tri Trier et sortir

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

Veuillez vous référer au Manuel pour savoir quel type d'éléments peuvent être triés.

Vous ne trouverez peut-être pas de goulot d'étranglement notable dans votre profil Dans ce cas, il y avait des cas où l'amélioration des domaines où les E / S était susceptible de conduire à de bons résultats.

Sujet principal

DictCur de psycopg2

Il est très pratique de pouvoir se référer aux résultats de la recherche avec dict au lieu de list, mais c'était un gros goulot d'étranglement car le coût de mappage à dict était élevé. Il semble que le fait que la table cible ait un nombre considérable de colonnes a également un effet. J'ai abandonné DictCur et j'ai plutôt résumé l'indice de la liste avec une constante pour l'éviter

URL de référence: Obtenir les résultats au format dict avec Python psycopg2

logger Si vous imprimez Lambda, vous pouvez voir le journal dans CloudWatch Logs, mais le journal problématique Lambda utilisé paramètres de l'enregistreur [obscurité](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-logging) semble être profond, donc le but ici est juste de voir le journal.

Le simple fait de changer l'enregistreur pour imprimer a amélioré la vitesse de traitement Je voulais aussi contrôler le niveau de sortie comme un enregistreur, j'ai donc créé une fonction simple pour envelopper la sortie du journal afin de ne pas altérer les fonctions requises pour l'enregistreur.

Dans certains cas, la vitesse de traitement s'est améliorée simplement en réduisant le nombre d'impressions. Le journal sera nécessaire dans l'opération de production, mais je pense qu'il y a des cas où le journal qui n'est nécessaire que dans le développement est laissé de côté. Je souhaite afficher uniquement les journaux dont j'ai vraiment besoin

Cache 1

boto3 s'est démarqué quand j'ai pris le profil Cela ne signifie pas que vous ne pouvez pas utiliser le SDK

Donc, j'ai mis en cache l'objet boto3 qui a été généré une fois et utilisé le cache à partir de la deuxième fois. C'était un Lambda assez volumineux, composé de plusieurs fichiers et de 10 classes ou plus. Modifié pour conserver l'objet boto3 généré dans la propriété de la classe

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

En outre, le résultat de la référence principale est mis en cache dans la propriété.

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

De plus, comme ce n'est pas une application à laquelle on accède fréquemment, un nouveau maître peut être acquis lorsque le conteneur Lambda est régénéré.

Cache 2

Je pense qu'il y a des moments où vous ne pouvez pas atteindre votre temps cible, quoi que vous fassiez. Le système en question était un système dans lequel les données étaient mises à jour par lots à intervalles réguliers. Par conséquent, le même contenu doit être renvoyé pendant que les données ne sont pas mises à jour.

Par conséquent, le résultat du traitement (Json) est enregistré dans DynamoDB et son contenu est renvoyé. La clé est le nom de l'API + le paramètre Le système API était simple, donc il n'y avait pas de problème.

Lorsque les données sont mises à jour, vous serez informé sur SNS, alors réenregistrez le contenu de DynamoDB.

Une erreur de calcul était la valeur maximale (400 Ko) qui peut être stockée dans DynamoDB. Il y avait un Json sur Comme il s'agissait d'un JSON avec de nombreux éléments répétitifs, je n'ai rien obtenu en le compressant et en l'enregistrant en tant que binaire.

À la fin

Je suis désolé pour toutes les petites histoires, mais j'espère que cet article aidera ceux qui s'inquiètent de la vitesse de traitement de Python Lambda.

Recommended Posts

Ce que j'ai fait quand je suis resté coincé dans le délai avec lambda python
Un rappel de ce que je suis resté coincé lors du démarrage d'Atcoder avec python
Ce que je suis entré dans Python pour la première fois
Ce que je suis resté coincé autour de l'interface graphique dans l'environnement python WSL
Ce que j'ai fait pour accueillir le Python2 EOL en toute confiance
Je suis resté bloqué en essayant de spécifier un chemin relatif avec relative_to () en python
Ce que j'ai fait quand j'étais en colère de le mettre avec l'option enable-shared
J'ai eu un AttributeError en me moquant de la méthode ouverte en python
Ce que j'ai fait avec les tableaux Python
Téléchargez ce que vous avez dans la demande vers S3 avec AWS Lambda Python
[Chez Coder] Ce que j'ai fait pour atteindre le rang vert en Python
Ce que j'ai fait lors de la mise à jour de Python 2.6 vers 2.7
[Question] Que se passe-t-il si vous utilisez% en python?
J'ai eu une erreur lorsque j'ai mis opencv dans python3 avec Raspeye [Remedy]
django geodjango auquel j'ai fait référence quand je suis resté coincé dans le tutoriel (édition)
Quand j'ai coupé le répertoire pour UNIX Socket sous / var / run avec systemd, je suis resté coincé dans un piège et que faire
Que faire lorsque l'imitation est intégrée à Python
Quand j'ai essayé d'introduire python3 dans atom, je suis resté coincé
Ce que j'ai appris en Python
Mémo que je suis resté coincé dans l'introduction de Mezzanine
Je me suis perdu dans le labyrinthe
J'ai aimé le tweet avec python. ..
J'ai écrit la file d'attente en Python
J'ai écrit la pile en Python
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai comparé le temps de calcul de la moyenne mobile écrite en Python
Ce à quoi j'étais accro avec json.dumps dans l'encodage base64 de Python
Ce que j'ai fait quand je voulais rendre Python plus rapide -Édition Numba-
Que faire lorsque le type de valeur est ambigu en Python?
Que dois-je faire avec la structure de répertoires Python après tout?
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Ce que j'ai appris en écrivant une Pull Request Python pour la première fois de ma vie
Comportement lors du retour dans le bloc with
Ce que je suis entré lors de l'utilisation de Tensorflow-gpu
Comment obtenir la différence de date et d'heure en secondes avec Python
Afficher Python 3 dans le navigateur avec MAMP
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
Qu'est-ce que "mahjong" dans la bibliothèque Python? ??
Ce que j'ai obtenu de Python Boot Camp
MongoDB avec Python pour la première fois
Obtenez et convertissez l'heure actuelle dans le fuseau horaire local du système avec python
Ce que j'ai fait quand je ne pouvais pas trouver le point caractéristique avec le flux optique d'opencv et quand je l'ai perdu
Je suis resté coincé dans la redirection d'une application flask avec un proxy inverse entre les deux
Une note utile lors de l'utilisation de Python après une longue période
Je viens de faire FizzBuzz avec AWS Lambda
Ce que j'ai fait pour économiser la mémoire Python
L'histoire qui n'avait rien à voir avec la partition lorsque j'ai fait une sauvegarde de disque avec dd pour la première fois
Quand j'ai essayé d'utiliser Python sur WSL (sous-système Windows pour Linux), il est resté bloqué dans Jupyter (résolu)
J'ai installé Pygame avec Python 3.5.1 dans l'environnement de pyenv sur OS X
Visualisez les informations du capteur d'accélération de la carte micro-ordinateur en temps réel avec mbed + Python
Je suis tombé sur un code de caractère lors de la conversion de CSV en JSON avec Python
J'ai mesuré le temps pendant lequel j'ai installé le module dépendant du langage C avec alpin
Transformez plusieurs listes avec l'instruction for en même temps en Python
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai eu une erreur lors de l'enregistrement avec OpenCV
[Python3] Une histoire bloquée avec la conversion du fuseau horaire
Python: j'ai pu récurer en lambda
Qu'est-ce que wheezy dans l'image Docker Python?