Dans ce blog, nous allons examiner la résolution de l’erreur de saturation de la mémoire signalée par Dynatrace sur une machine qui héberge plusieurs JVM.
L’erreur de saturation de la mémoire est émise par Dynatrace lorsque l’utilisation de la mémoire dépasse 80 % et que les défauts de page dépassent 20 défauts de page/seconde sur une machine Linux.
Pour ce blog, supposons que nous utilisons une machine Linux avec 128 Go de mémoire et 6 JVM d’application en cours d’exécution avec 16 Go définis comme taille de tas minimale et maximale. L’erreur de saturation de la mémoire peut être générée si les JVM commencent à consommer plus de mémoire. Lorsque la valeur de tas minimale (-Xms) et maximale (-Xmx) est définie sur 16 Go, le système engagera 16 Go d’espace RAM dans le tas pour chaque JVM. La JVM utilisera ces 16 Go pour le tas, et en plus de cela, il faudra un peu plus de mémoire pour effectuer son traitement. Dans l’ensemble, chaque JVM peut prendre environ 20 Go de mémoire pour effectuer le traitement en fonction des demandes qui arrivent à chaque JVM. À un certain point, il est possible que les 6 JVM utilisent environ 120 Go de mémoire, ce qui entraînerait des erreurs de saturation de la mémoire et des défauts de page sur cette machine.
Il existe trois façons de résoudre ce problème. La première approche, la plus simple, consiste à ajouter plus de mémoire à la machine existante. Si nous doublons la mémoire en ajoutant 128 Go supplémentaires à cette machine, cela donnera à la machine 256 Go de mémoire au total. Maintenant, dans notre situation, si le processus consomme 120 Go sur 256 Go, ce qui représente moins de 50 % de l’utilisation globale de la mémoire, et n’atteindra pas le seuil d’utilisation de la mémoire de 80 %. De plus, les défauts de page ne se produiront pas car il a de l’espace pour contenir toutes les pages dans la mémoire. L’erreur de saturation de la mémoire disparaîtra de Dynatrace. L’inconvénient de cette approche est qu’elle entraînera des coûts d’achat de matériel s’il s’agit d’une machine dans le centre de données. S’il s’agit d’une instance cloud, cela entraînera l’utilisation d’une instance avec plus de mémoire, ce qui entraînera des coûts supplémentaires.
La deuxième approche consiste à déterminer si la JVM nécessite ou non autant de mémoire et à l’optimiser. Cette approche nécessite une analyse détaillée pour identifier les zones qui prennent plus de mémoire, optimiser et réduire l’utilisation de la mémoire. Cela aidera à réduire l’empreinte mémoire prise pour les 6 JVM et à exécuter l’application sans aucune erreur de saturation de la mémoire sur le même matériel sans aucune mise à niveau. Cette approche prendra du temps, en fonction de la complexité impliquée dans l’optimisation de l’utilisation de la mémoire de l’application.
La troisième approche consiste à ne pas définir des valeurs égales pour les paramètres de taille de tas minimum et maximum. Au lieu de cela, définissez une valeur minimale pour l’argument de taille de segment de mémoire minimale requis par l’application. Par exemple, définissez la taille de segment minimale (-Xms) sur 4 Go et la taille de segment maximale (-Xmx) sur 16 Go. Ainsi, le système n’engagera initialement que 4 Go pour la taille du tas par JVM, réduisant ainsi l’utilisation globale de la mémoire JVM à moins de 8 Go par JVM. Les 6 JVM prendront environ 58 Go, ce qui réduira l’utilisation globale de la mémoire à moins de 50 % et évitera l’erreur de saturation de la mémoire. Cela fonctionnera si l’application consomme vraiment moins de mémoire de tas. Cela peut devenir un problème si la taille du tas atteint la taille maximale du tas, ce qui obligera le système à valider 16 Go, ce qui entraînera une erreur de saturation de la mémoire si toutes les JVM atteignent ce point.
Cette approche peut être adoptée après avoir compris le modèle d’utilisation du tas, et cela aidera si l’utilisation du tas de l’application est moindre. La définition de valeurs différentes pour la taille de tas minimale et maximale peut avoir peu d’impact sur la réduction et l’expansion du tas. Cet impact sera moindre par rapport aux défauts de page se produisant dans le système.
En fonction du scénario dans lequel l’erreur de saturation de la mémoire se produit, une ou toutes les approches recommandées ci-dessus peuvent être appliquées pour résoudre l’erreur de saturation de la mémoire dans Dynatrace.