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
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ù
import cProfile
import pstats
Vous pouvez obtenir un profil uniquement avec cProfile, mais vous utilisez également pstats pour trier les résultats.
Instancier cProfile et activer la mesure
pr = cProfile.Profile()
pr.enable()
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.
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
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é.
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.
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