Problème
Vous avez installé l'agent New Relic Node.js et l'utilisation de la mémoire de votre application Node.js a augmenté.
Solution
Il existe plusieurs causes possibles à cette augmentation de la mémoire et des solutions potentielles pour chacune d’elles.
Node.js fournit le module Cluster. Cela permet de gérer requests en parallèle en utilisant tous les cœurs de processeur disponibles sur un hôte. Cependant, chaque cluster worker alloue son propre tampon de dalle pour les transactions SSL et conserve sa propre copie des données de l'agent Node.js. Cela multiplie la surcharge de mémoire par le nombre de travailleurs de cluster utilisés. C'est également vrai si un hôte exécute plusieurs applications Node.js en même temps.
Solution:
Certains fournisseurs de services cloud utilisent des environnements qui indiquent un nombre de cœurs de processeur supérieur à celui qui peut réellement être utilisé à un moment donné. La réduction du nombre de travailleurs cluster ou l'exécution sans prise en charge Cluster peut diminuer l'utilisation de la mémoire sans impacter les performances.
Les messages de log sont enregistrés sur le disque par défaut. En raison de la manière dont les données des messages sont traitées, les objets de message peuvent être déplacés vers Old-pointer-space pour la récupération de place. Cela signifie que les objets restent en mémoire pendant un certain temps, même après que toutes les références à eux aient disparu. Cela conduit à une plus grande quantité de mémoire consommée par un processus à un moment donné. Un temps de traitement supplémentaire est également utilisé pour la collecte des déchets.
Solution:
Selon votre version de Node.js, l' agent peut être défini par défaut sur le niveau de log trace
ou info
. Réduisez la verbosité de logging aux niveaux info
ou warn
pour réduire sensiblement l'utilisation de la mémoire et le temps passé dans le ramassage des déchets.
De nombreux pilotes de base de données utilisent une abstraction appelée a cursor
. Les curseurs offrent la possibilité de parcourir les résultats de la requête. Par exemple, le pilote mongodb fournit des curseurs lors de l'exécution de la requête find
.
Les curseurs vivent à la fois en tant qu'objets dans l'environnement d'exécution Node.js et en tant qu'entité dans le serveur MongoDB. Lorsqu'une application a fini d'utiliser un cursor
, elle doit le fermer pour libérer des ressources à la fois dans le serveur et dans l'application cliente.
Dans Node.js, il est possible qu'un curseur soit récupéré par le garbage collector, libérant ainsi des ressources dans l'application, sans fermer le cursor
dans le serveur. Cela peut passer inaperçu dans l'application. Cependant, l'agent New Relic Node.js garde une trace des curseurs ouverts pour mesurer le temps passé à parcourir les résultats. Si votre application ne ferme pas tous les curseurs qu'elle utilise, l'agent continuera à suivre les curseurs obsolètes et à fuir la mémoire.
Solution:
Assurez-vous que chaque cursor
créé dans votre application est fermé en appelant cursor.close()
une fois que l'application a terminé de traiter les résultats de la requête.
L'agent Node.js enregistre les données pour chaque transaction gérée par votre application. Les données sont généralement regroupées par nom de transaction. La mémoire utilisée par l' agent augmente avec le nombre de transactions différentes enregistrées à chaque cycle de collecte d'une minute.
De plus, une plus grande quantité de données est conservée lors de chaque transaction, mais est finalement supprimée une fois la transaction terminée. La mémoire utilisée par l'agent augmente avec le nombre de transactions simultanées traitées par l'application.
Solution:
Si le stockage des données de l'agent est identifié comme la cause d'une augmentation de l'utilisation de la mémoire, la meilleure solution peut être d'ajouter de la mémoire supplémentaire à votre hôte ou de passer à une instance cloud plus grande.