Je continue à recevoir une erreur sporadique de Cloud Functions for Firebase lors de la conversion d'une image relativement petite (2 Mo). En cas de succès, la fonction ne prend que 2000 ms ou moins pour terminer, et selon la documentation de Image Magick, je ne devrais pas voir aucun problème.
J'ai essayé d'augmenter la taille de la mémoire tampon pour la commande, ce qui n'est pas autorisé depuis Firebase, et j'ai essayé de trouver des alternatives à .spawn()
car cela pourrait être surchargé de déchets et ralentir les choses. Rien ne fonctionne.
[Mise à jour] Comme l'a suggéré un intervenant, cela ne devrait plus être un problème, car les fonctions de Firebase conservent désormais leurs paramètres lors du redéploiement. Merci firebase!
Il s'avère que, et cela n'est ni évident ni documenté, vous pouvez augmenter l'allocation de mémoire pour vos fonctions dans Console de fonctions Google . Vous pouvez également augmenter le délai d'attente pour les fonctions de longue durée. Cela a résolu le problème de surcharge de mémoire et tout fonctionne très 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 cherche toujours un moyen de mettre à jour ces paramètres via l'interface de ligne de commande. Cette mise à jour se fera lorsque je le trouverai.
J'étais perdu dans l'interface utilisateur, je n'ai trouvé aucune option pour changer la mémoire, mais je l'ai finalement trouvée:
Cordialement, Peter
La dernière commande de déploiement de firebase écrase l'allocation de mémoire sur 256 Mo par défaut et expire jusqu'à 60 secondes.
Alternativement, pour spécifier l'allocation de mémoire souhaitée et le délai d'expiration maximal, j'utilise la commande gcloud, telle que:
Les fonctions bêta gcloud déploient YourFunctionName --memory = 2048MB --timeout = 540s
D'autres options, s'il vous plaît se référer à:
https://cloud.google.com/sdk/gcloud/reference/beta/functions/deploy
Vous pouvez définir cela à partir de votre fichier de fonction de cloud sur Firebase.
const runtimeOpts = {
timeoutSeconds: 300,
memory: '1GB'
}
exports.myStorageFunction = functions
.runWith(runtimeOpts)
.storage
.object()
.onFinalize((object) = > {
// do some complicated things that take a lot of memory and time
});
Prenez les documents ici:https://firebase.google.com/docs/functions/manage-functions#set_timeout_and_memory_allocation
N'oubliez pas de lancer ensuite firebase deploy
à partir de votre terminal.
Mise à jour: il semble qu'ils conservent maintenant les paramètres lors du redéploiement afin que vous puissiez modifier en toute sécurité l'allocation de mémoire dans la console cloud!
Il semble que la configuration des ressources ImageMagick par défaut dans Firebase Cloud Functions ne corresponde pas à la mémoire réelle allouée à la fonction.
Exécuter identify -list resource
dans le contexte d'une fonction Cloud Firebase donne:
File Area Memory Map Disk Thread Throttle Time
--------------------------------------------------------------------------------
18750 4.295GB 2GiB 4GiB unlimited 8 0 unlimited
La mémoire allouée par défaut à un FCF est de 256 Mo. L'instance par défaut d'ImageMagick pense qu'elle dispose de 2 Go. Par conséquent, elle n'alloue pas de mémoire tampon à partir du disque et peut facilement essayer de trop allouer de la mémoire, ce qui provoque l'échec de la fonction sur Error: memory limit exceeded. Function killed.
Une solution consiste à augmenter la mémoire requise, comme suggéré ci-dessus - bien que le risque persiste, IM essaiera de surallouer en fonction de votre cas d'utilisation et de vos valeurs aberrantes.
Encore plus sûr serait de définir la limite de mémoire correcte sur IM dans le cadre du processus de manipulation d'image à l'aide de -limit memory [your limit]
. Vous pouvez déterminer votre utilisation approximative de la mémoire en exécutant votre logique de messagerie instantanée avec `-debug Cache '- il vous montrera tous les tampons alloués, leur taille et s'ils étaient en mémoire ou en disque.
Si la messagerie instantanée atteint la limite de mémoire, elle commencera à allouer des mémoires tampon sur le disque (mémoire mappée, puis mémoire tampon normale). Vous devrez tenir compte de votre équilibre spécifique entre les performances d'E/S et le coût de la mémoire. Prix de chaque octet de mémoire supplémentaire alloué. votre FCF est multiplié par 100 ms d’utilisation, ce qui permet une croissance rapide.
Une autre option serait d’éviter d’utiliser .spawn()
.
Il existe un excellent package de traitement d’images pour le nœud appelé Sharp qui utilise la bibliothèque d’empreinte faible mémoire/ libvips . Vous pouvez consulter l’exemple de fonction Cloud sur Github .
Alternativement, il existe un wrapper Node pour ImageMagick (et GraphicsMagick) appelé gm . Il prend même en charge l’option -limit pour signaler vos limitations de ressources à la messagerie instantanée.