Fonctions de nuage pour Firebase tué en raison de la limite de mémoire dépassée

je reçois régulièrement une erreur sporadique des fonctions Cloud pour Firebase lors de la conversion d'une image relativement petite (2mb). Une fois réussie, la fonction ne prend qu'environ 2000ms ou moins pour finir, et selon la documentation image Magick Je ne devrais pas voir de problèmes.

j'ai essayé d'augmenter la taille du tampon pour la commande, qui ne permet pas à partir de Firebase, et j'ai essayé de trouver des alternatives à .spawn() comme cela pourrait être surchargé de déchets et ralentir les choses. Rien ne fonctionne.

22
demandé sur AL. 2017-04-10 03:09:10

6 réponses

[mise à jour] comme l'a suggéré un commentateur, cela ne devrait plus être un problème, car les fonctions firebase maintiennent maintenant leurs paramètres lors du redéploiement. Merci firebase!

S'avère, et ce n'est ni évident ni documenté, vous pouvez augmenter l'allocation de mémoire à vos fonctions dans le Google Fonctions De La Console. Vous pouvez également augmenter le temps d'arrêt pour les fonctions de longue durée. Il a résolu le problème avec la surcharge de la mémoire et tout fonctionne bien maintenant.

Edit: notez que Firebase réinitialisera vos valeurs par défaut lors du déploiement, vous devez donc vous rappeler de vous connecter à la console et de les mettre à jour immédiatement. Je suis toujours à la recherche d'un moyen de mettre à jour ces paramètres via CLI, mis à jour lorsque je le trouve.

21
répondu Kirill 2017-05-20 05:16:27

j'étais perdu dans L'interface utilisateur, je n'ai trouvé aucune option pour changer la mémoire, mais je l'ai finalement trouvé:

  1. Aller à la Google Cloud Platform Console (pas le Firebase console)
  2. Sélectionner Fonctions Du Nuage dans le menu
  3. Maintenant vous voyez votre fonction firebase ici si elle est correcte. Sinon, vérifiez si vous avez choisi le bon projet.
  4. ignorez toutes les cases à cocher, les boutons et les éléments de menu, cliquez simplement sur le nom de l' la fonction.
  5. cliquez sur Modifier (menu du haut) et ne modifiez que la mémoire allouée et cliquez sur Enregistrer.

Cordialement, Peter

19
répondu p3sn 2017-06-13 07:42:02

la dernière commande Firebase deploy réécrit l'allocation de mémoire en 256Mo par défaut et jusqu'à 60s.

alternativement, pour spécifier l'allocation de mémoire désirée et le délai maximum, j'utilise la commande gcloud telle que:

fonctions bêta de gcloud déployer your Functionname --mémoire=2048 --timeout=années 540

Autres options, veuillez vous référer à:

https://cloud.google.com/sdk/gcloud/reference/beta/functions/deploy

8
répondu Fan Kam Thong 2017-11-19 03:22:04

mise à jour: il semble qu'ils préservent maintenant les paramètres lors du re-déploiement afin que vous puissiez changer en toute sécurité l'allocation de mémoire dans la console cloud!

3
répondu ovaris 2017-05-16 10:45:40

il semble que la configuration par défaut de la ressource ImageMagick dans les fonctions Cloud de Firebase ne corresponde pas à la mémoire réelle affectée à la fonction.

Exécution identify -list resource dans le contexte D'une fonction de nuage de base de feu:

File       Area         Memory        Map       Disk   Thread  Throttle       Time
--------------------------------------------------------------------------------
 18750    4.295GB       2GiB       4GiB  unlimited        8         0   unlimited  

la mémoire par défaut attribuée à un FCF est de 256MB - L'instance ImageMagick par défaut pense qu'elle a 2Go et donc n'alloue pas de tampon à partir du disque et peut facilement essayer de sur-allouer de la mémoire provoquant la défaillance de la fonction Error: memory limit exceeded. Function killed.

une façon est d'augmenter la mémoire nécessaire comme suggéré ci-dessus-bien qu'il y ait toujours le risque que la GI essayera de sur allouer en fonction de votre cas d'utilisation et des valeurs aberrantes.

plus sûr encore serait de définir la limite de mémoire correcte à IM dans le cadre du processus de manipulation d'image en utilisant -limit memory [your limit]. Vous pouvez calculer votre utilisation de mémoire approx en exécutant votre logique IM avec '- debug Cache ' - il vous montrera tous les tampons alloués, leurs tailles et s'ils étaient mémoire ou disque.

si IM atteint la limite de mémoire, il va commencer à allouer des tampons sur le disque (mémoire mappée puis des tampons de disque réguliers.Vous devrez tenir compte de votre équilibre entre la performance des E/S et le coût de la mémoire. Le prix de chaque octet de mémoire supplémentaire que vous allouez à votre FCF est multiplié par 100ms d'utilisation - de sorte que peut croître rapidement.

1
répondu Shai Ben-Tovim 2017-09-12 07:46:26

une Autre option serait ici d'éviter d'utiliser .spawn() tout à fait.

Il y a un grand paquet de traitement d'image pour le noeud appelé Sharp qui utilise la faible empreinte mémoire de la bibliothèque libvips. Vous pouvez consulter l'exemple de la fonction Cloud sur Github.

alternativement, il y a un enveloppeur de noeuds pour ImageMagick (et GraphicsMagick) appelé gm. Il prend même en charge l' - limit option de déclaration vos ressources limitées pour la GI.

0
répondu Kiana 2017-09-28 17:58:39