Lorsque votre application Java s'exécute sur plusieurs instances, il est essentiel d'identifier celle qui provoque une dégradation des performances ou une pression mémoire. Après l'installation de l'agent ARMS, celui-ci collecte automatiquement les métriques d'infrastructure, de garbage collection (GC) et de mémoire JVM pour chaque instance. Utilisez la page Instance Monitoring pour comparer l'état de santé des instances, identifier les goulots d'étranglement et diagnostiquer les problèmes de mémoire sans changer d'outil.
Prérequis
Un agent ARMS est installé pour l'application.
Application Monitoring propose une nouvelle page de détails d'application aux utilisateurs ayant activé le nouveau mode de facturation. Si vous n'avez pas activé ce nouveau mode, cliquez sur Switch to New Version dans la page Application List pour accéder à la nouvelle page de détails.
Accéder à la page Instance Monitoring
Connectez-vous à la console ARMS. Dans le volet de navigation de gauche, sélectionnez Application Monitoring > Application List.
Sélectionnez une région en haut de la page, puis cliquez sur le nom de l'application.
Dans la barre de navigation supérieure, cliquez sur Instance Monitoring.
Les icônes de la colonne Language indiquent la méthode d'intégration :
Application Java intégrée à Application Monitoring
Application Golang intégrée à Application Monitoring
Application Python intégrée à Application Monitoring- Application intégrée à Managed Service for OpenTelemetry
Disposition du tableau de bord
Le tableau de bord Instance Monitoring s'adapte à votre environnement de déploiement (ECS ou conteneurs) et organise les informations en trois zones :
| Zone | Description |
|---|---|
| Filtre rapide (1) | Filtrez les graphiques et la liste des instances par adresse d'hôte (et par cluster dans les environnements de conteneurs avec Managed Service for Prometheus). |
| Graphiques de tendance (2) | Affichez les séries chronologiques des métriques d'infrastructure, de GC et de mémoire JVM. |
| Liste des instances (3) | Consultez les métriques par instance et accédez aux détails de l'instance ou aux traces. |
Métriques par environnement
Les métriques disponibles varient selon que votre application s'exécute sur ECS ou dans des conteneurs, et selon l'intégration ou non de l'environnement de conteneurs avec Managed Service for Prometheus.
Métriques des graphiques de tendance
| Catégorie de métrique | ECS | Conteneur (Prometheus) | Conteneur (collecte automatique ARMS) |
|---|---|---|---|
| Utilisation du CPU | Oui | Oui | Oui |
| Utilisation de la mémoire | Oui | Oui | Oui |
| Utilisation du disque | Oui | Non | Non |
| Full GC et Young GC | Oui | Oui | Oui |
| Mémoire heap et non-heap | Oui | Oui | Oui |
Pour les environnements ECS, utilisez la liste déroulante à côté du titre de chaque graphique d'infrastructure pour basculer entre les valeurs moyennes et maximales.
Pour les graphiques GC, alternez entre le nombre de GC et la durée moyenne de GC. Pour les graphiques de mémoire JVM, basculez entre les vues de mémoire heap et non-heap.
Colonnes de la liste des instances
| Colonne | ECS | Conteneur (Prometheus) | Conteneur (collecte automatique ARMS) |
|---|---|---|---|
| IP de l'instance | Oui | Oui | Oui |
| Utilisation du CPU | Oui | Oui (+ requête, limite) | Oui (utilisation uniquement) |
| Utilisation de la mémoire | Oui | Oui (+ requête, limite) | Oui (utilisation uniquement) |
| Utilisation du disque | Oui | Oui (+ limite) | Non |
| Charge | Oui | Oui | Oui |
| Nombre de Full GC | Oui | Oui | Oui |
| Nombre de Young GC | Oui | Oui | Oui |
| Utilisation de la mémoire heap | Oui | Oui | Oui |
| Utilisation de la mémoire non-heap | Oui | Oui | Oui |
| Métriques RED (requêtes, erreurs, temps de réponse moyen) | Oui | Oui | Oui |
Dans l'environnement Conteneur (Prometheus), l'utilisation du CPU, de la mémoire et du disque affiche - lorsqu'aucune limite n'est définie pour la ressource.
Exigences pour l'environnement de conteneurs
Avec Managed Service for Prometheus : les métriques de conteneur proviennent de Managed Service for Prometheus. Pour configurer l'intégration, consultez la section Container Observability.
Sans Managed Service for Prometheus : mettez à niveau la sonde Application Monitoring vers la version 4.1.0 ou ultérieure. Les versions antérieures de la sonde ne rapportent pas les métriques de base des conteneurs. Pour plus de détails sur les versions de la sonde, consultez le Guide des versions de la sonde (Java Agent).
Interactions avec les graphiques
Chaque graphique de tendance prend en charge deux actions :
Cliquez sur
pour afficher les statistiques des métriques sur une plage de temps ou comparer la même plage de temps sur différentes dates.Cliquez sur
pour basculer entre les graphiques en colonnes et les graphiques de tendance.
Actions dans la liste des instances
Cliquez sur une IP d'instance (ou sur Details dans la colonne Actions pour les environnements de conteneurs) pour ouvrir les détails de l'instance.
Cliquez sur Trace dans la colonne Actions pour afficher les détails de la trace. Pour plus d'informations, consultez la section Analyse des traces.
ARMS collecte les métriques JVM via JMX. Les régions de mémoire non-heap rapportées par ARMS sont moins nombreuses que celles du processus Java réel. Par conséquent, la somme de la mémoire heap et non-heap dans ARMS peut différer de la valeur RES affichée par la commande top. Pour plus de détails, consultez la section Détails de la mémoire de surveillance JVM.
Détails de l'instance
Cliquez sur une IP d'instance pour ouvrir la page de détails, qui contient les onglets suivants.
Vue d'ensemble
L'onglet Overview affiche le nombre de requêtes, le nombre d'erreurs, le temps de réponse moyen et les informations sur les appels lents pour l'interface sélectionnée.
La Host List située à gauche vous permet de basculer entre les hôtes pour consulter les données de surveillance. Les cartes récapitulatives affichent les variations en pourcentage d'un jour sur l'autre. Sous les cartes, des graphiques de tendance chronologiques affichent les métriques Requests/1m, Errors/1m et Response Time/1m avec une granularité à la minute. La page comprend également les onglets JVM Monitoring, Host Monitoring et Trace Analysis.
Surveillance JVM
L'onglet JVM Monitoring affiche les métriques de GC, de mémoire, de threads et de descripteurs de fichiers pour l'instance sélectionnée.
La section GC contient les graphiques Full GC Count/1m, Young GC Count/1m, Full GC Trigger Reason/1m et Young GC Trigger Reason/1m. La section mémoire contient les graphiques Memory Usage Distribution/1m, Heap Memory/1m, Heap Memory (used)/1m et d'autres. Le panneau de gauche vous permet de sélectionner une instance d'application spécifique pour afficher ses données de surveillance.
Surveillance des pools de threads
La surveillance des pools de threads suit la configuration des threads principaux, l'état des threads actifs et les métriques d'exécution des tâches. Filtrez les pools de threads par type et par nom en haut de l'onglet.
Version de la sonde 4.1.x ou ultérieure
Frameworks pris en charge
| Classe de framework | Utilisation typique |
|---|---|
java.util.ThreadPoolExecutor |
Tomcat 8 à 9.1, Dubbo, HSF, Vert.x, pools de threads personnalisés |
org.apache.tomcat.util.threads.ThreadPoolExecutor |
Tomcat 9.1 et versions ultérieures |
org.eclipse.jetty.util.thread.QueuedThreadPool |
Jetty |
org.xnio.XnioWorker |
Undertow |
Métriques collectées
| Métrique | ThreadPoolExecutor (JDK) | ThreadPoolExecutor (Tomcat 9.1+) | QueuedThreadPool | XnioWorker |
|---|---|---|---|---|
arms_thread_pool_core_pool_size |
Oui | Oui | Oui | Oui |
arms_thread_pool_max_pool_size |
Oui | Oui | Oui | Oui |
arms_thread_pool_active_thread_count |
Oui | Oui | Oui | Oui |
arms_thread_pool_current_thread_count |
Oui | Oui | Oui | -- |
arms_thread_pool_max_thread_count |
Oui | Oui | -- | -- |
arms_thread_pool_scheduled_task_count |
Oui | Oui | -- | -- |
arms_thread_pool_completed_task_count |
Oui | Oui | -- | -- |
arms_thread_pool_rejected_task_count |
Oui | Oui | Oui | -- |
arms_thread_pool_queue_size |
Oui | Oui | Oui | Oui |
Version de la sonde antérieure à 4,1.x
Frameworks pris en charge : Tomcat, HSF, Dubbo, Vert.x et Undertow. Les versions d'agent 3.1.x et antérieures prennent en charge uniquement Undertow 1.x à 2.0.x. Les versions d'agent 3.2.x et ultérieures prennent en charge toutes les versions d'Undertow.
| Métrique | Description |
|---|---|
arms_threadpool_core_size |
Nombre de threads principaux |
arms_threadpool_max_size |
Nombre maximal de threads |
arms_threadpool_active_size |
Nombre de threads actifs |
arms_threadpool_queue_size |
Taille de la file d'attente |
arms_threadpool_current_size |
Taille actuelle du pool |
Les pools de threads SchedulerX rapportent uniquement arms_threadpool_active_size.
Surveillance des pools de connexions
La surveillance des pools de connexions suit la configuration d'initialisation et l'état des connexions en cours d'exécution. Filtrez les pools de connexions par type en haut de l'onglet.
Version de la sonde 4.1.x ou ultérieure
Frameworks pris en charge : DBCP (>2,0), Vibur DBCP (>11.0), c3p0 (>0.9.2), Druid, HikariCP (>3,0), Jedis (>3,0), Lettuce (>5,0), Redisson (>3,0), tomcat-dbcp (>8,0), tomcat-jdbc (>8,0).
Métriques collectées
| Métrique | Description | Frameworks pris en charge |
|---|---|---|
arms_connection_pool_connection_count |
Nombre de connexions (actives vs inactives par état) | DBCP, c3p0, Vibur DBCP, Druid, HikariCP, Jedis, Lettuce, Redisson, tomcat-dbcp, tomcat-jdbc |
arms_connection_pool_connection_min_idle_count |
Connexions inactives minimales (configuration statique) | DBCP, Jedis, Druid, HikariCP, Lettuce, tomcat-dbcp, tomcat-jdbc |
arms_connection_pool_connection_max_idle_count |
Connexions inactives maximales (configuration statique) | DBCP, Jedis, Druid, Lettuce, tomcat-dbcp, tomcat-jdbc |
arms_connection_pool_connection_max_count |
Connexions maximales (configuration statique) | DBCP, Druid, Vibur DBCP, HikariCP, tomcat-dbcp, tomcat-jdbc |
arms_connection_pool_pending_request_count |
Requêtes de connexion bloquées | c3p0, HikariCP, Jedis, tomcat-dbcp, tomcat-jdbc |
Version de la sonde antérieure à 4,1.x
| Framework | Métriques collectées |
|---|---|
| okHttp2 / okHttp3 | arms_threadpool_active_size, arms_threadpool_current_size |
| Apache HttpClient | arms_threadpool_current_size, arms_threadpool_max_size, arms_threadpool_queue_size |
| Druid | arms_threadpool_active_size, arms_threadpool_max_size |
| HikariCP | arms_threadpool_active_size, arms_threadpool_max_size |
Surveillance de l'hôte
L'onglet Host Monitoring affiche les métriques de CPU, de mémoire, de disque, de charge, de trafic réseau et de paquets réseau.

Surveillance des conteneurs
L'onglet Container Monitoring affiche les métriques de ressources au niveau du conteneur. Les métriques disponibles dépendent de votre méthode d'intégration :
| Intégration | Métriques | Configuration |
|---|---|---|
| Managed Service for Prometheus | CPU, mémoire, disque, charge, trafic réseau, paquets réseau | Consultez la section Instance Prometheus pour Container Service |
| Collecte automatique ARMS (sonde 4.1.0+) | CPU, mémoire, trafic réseau | Mettez à niveau la sonde vers la version 4.1.0 ou ultérieure. Consultez le Guide des versions de la sonde (Java Agent) |
L'onglet Container Monitoring affiche une zone Overview avec Namespace, Cluster et les métriques récapitulatives CPU (cœurs) et Memory avg/max/last/Limit. En dessous, la zone Resource contient les quatre graphiques linéaires suivants :
Memory/Limit(%)
Memory Usage
CPU Usage(%)
CPU Usage By Cores (avec des courbes user/system/total)
Analyse des traces
L'analyse des traces interroge les données de traces stockées en temps réel. Combinez les filtres et les dimensions d'agrégation pour diagnostiquer les problèmes de performance dans différents scénarios. Pour plus de détails, consultez la section Analyse des traces.
Dans la console Tracing, saisissez des critères de recherche tels que serviceName: "mall-gateway" pour interroger les données de traces. La page contient :
Panneau de filtre rapide à gauche : filtrez par Status, Duration (plage du curseur 0 ns–5 s), Interface Name et Host Address.
Graphiques statistiques supérieurs : histogramme Call Count, histogramme Errors/HTTP Errors, graphique linéaire Average Duration.
Tableau de données Span inférieur : les colonnes incluent TraceId, Interface Name, Application Name, Duration, Status, Start Time, Host Address. Cliquez sur Details ou Logs pour afficher les détails de la trace.
Panneau Slow Trace Analysis à droite : affiche les spanNames les plus contributifs en termes de durée.
Agrégation des métriques au niveau de l'application vs au niveau de l'instance
Lorsqu'ARMS agrège les métriques au niveau de l'instance en valeurs au niveau de l'application, il utilise différentes méthodes selon le type de métrique :
| Type de métrique | Méthode d'agrégation |
|---|---|
| RED : nombre de requêtes, nombre d'appels lents, nombre de codes d'état HTTP | Somme |
| RED : temps de réponse | Moyenne |
| JVM : nombre de GC, durée de GC | Somme |
| JVM : mémoire heap, nombre de threads | Maximum |
| Pool de threads et pool de connexions : toutes les métriques | Moyenne |
| Métriques système : toutes les métriques | Maximum |
| SQL et NoSQL : nombres d'appels | Somme |
| SQL et NoSQL : autres métriques | Moyenne |
| Exceptions : toutes les métriques | Somme |
Références
Pour la liste complète des métriques Application Monitoring, consultez la section Référence des métriques Application Monitoring.
FAQ
Pourquoi le trafic est-il inégal entre les instances ?
Dans la version 3.x de la sonde, l'activation de l'optimisation de la mémoire peut entraîner l'omission de certaines métriques. Mettez à niveau vers la version 4.x de la sonde.
Pourquoi une seule requête Undertow est-elle comptée deux fois ?
Dans les versions de la sonde antérieures à 3,2.x, l'instrumentation DeferredResult entraîne l'enregistrement double d'un appel. Mettez à niveau vers la version 3.2.x ou ultérieure de la sonde.
Pourquoi les quotas de CPU ou de mémoire dans Container Monitoring ne correspondent-ils pas aux paramètres du Pod ?
Vérifiez si le Pod définit plusieurs conteneurs. Cette métrique correspond à la somme des quotas de tous les conteneurs du Pod.
Pourquoi certaines métriques système sont-elles manquantes, imprécises ou affichent-elles une utilisation du CPU à 100 % ?
Les versions de la sonde antérieures à 4.x ne collectent pas les métriques système sous Windows. Mettez à niveau vers la version 4.x ou ultérieure de la sonde.
Pourquoi un Full GC se produit-il juste après le démarrage de l'application ?
La taille par défaut de l'espace metaspace est d'environ 20 Mo. Lors du démarrage, l'expansion de l'espace metaspace déclenche un Full GC. Définissez les tailles initiale et maximale de l'espace metaspace à l'aide des paramètres -XX:MetaspaceSize et -XX:MaxMetaspaceSize.
Comment VM Stack est-il calculé ?
VM Stack est calculé en multipliant le nombre de threads actifs par 1 Mo (la taille de pile de threads par défaut). Si vous définissez une taille de pile différente avec -Xss, cette métrique peut ne pas correspondre à la valeur réelle.
state=live inclut les états suivants : live, blocked, new, runnable, timed-wait et wait.
Comment les métriques JVM sont-elles collectées ?
ARMS récupère les métriques JVM à l'aide des interfaces JDK standard.
Métriques de mémoire :
ManagementFactory.getMemoryPoolMXBeansjava.lang.management.MemoryPoolMXBean#getUsage
Métriques GC (sonde antérieure à 4.4.0) :
ManagementFactory.getGarbageCollectorMXBeansGarbageCollectorMXBean#getCollectionCountGarbageCollectorMXBean#getCollectionTime
Métriques GC (sonde 4.4.0 ou ultérieure) :
Récupérées en s'abonnant à l'événement GarbageCollectionNotificationInfo de GarbageCollectorMXBean.
Pourquoi la valeur maximale de la mémoire heap JVM est-elle -1 ?
Une valeur de -1 signifie que la taille maximale de la heap n'est pas configurée. Définissez-la à l'aide du paramètre -Xmx.
Pourquoi l'utilisation de la mémoire heap JVM n'est-elle pas égale à la taille maximale de la mémoire heap ?
Le paramètre -Xms définit la taille initiale de la heap. La JVM étend la heap selon les besoins, jusqu'au maximum défini par -Xmx. Une différence indique que la heap n'est pas encore entièrement étendue.
Pourquoi la fréquence de GC JVM augmente-t-elle progressivement ?
Cela se produit généralement avec ParallelGC, l'algorithme de GC par défaut dans JDK 8. ParallelGC active -XX:+UseAdaptiveSizePolicy par défaut, ce qui ajuste dynamiquement la taille de la heap. Lorsque Young GC s'exécute fréquemment, l'espace survivant peut diminuer, provoquant une promotion plus rapide des objets vers l'ancienne génération. Cela accélère la croissance de l'ancienne génération et déclenche des Full GC plus fréquents. Pour plus de détails, consultez la documentation Java GC Ergonomics.
Pourquoi n'y a-t-il aucune donnée pour la surveillance des pools de threads ou de connexions ?
Sur la page Custom Configuration , sous Advanced Settings , confirmez que la surveillance des pools de threads et de connexions est activée.
Vérifiez que le framework est pris en charge. Consultez la section Surveillance des pools de threads et de connexions.
Pourquoi le nombre maximal de connexions HikariCP ne correspond-il pas aux attentes ?
Les versions de la sonde antérieures à 3,2.x récupèrent incorrectement le nombre maximal de connexions. Mettez à niveau vers la version 3.2.x ou ultérieure de la sonde.
Pourquoi les métriques de surveillance des pools s'affichent-elles sous forme de valeurs décimales ?
La sonde collecte les données toutes les 15 secondes. La console affiche la moyenne sur la plage de temps sélectionnée. Par exemple, si quatre points de données en une minute sont 0, 0, 1 et 0, la valeur affichée est 0,25.
Pourquoi les pools de threads ou de connexions sont-ils pleins, mais la surveillance n'indique-t-elle aucun changement ?
ARMS collecte les métriques des pools de threads et de connexions toutes les 15 secondes. Les pics de courte durée dans cet intervalle peuvent ne pas être capturés.
Pourquoi le nombre maximal de threads du pool de threads est-il inattendu ou affiche-t-il 2,1 milliards ?
ARMS lit directement le nombre maximal de threads depuis l'objet du pool de threads. Une valeur de 2,1 milliards indique généralement un pool de threads planifié, qui utilise par défaut Integer.MAX_VALUE.
/**
* Creates a new ScheduledThreadPoolExecutor with the given core pool size.
* @param corePoolSize the number of threads to keep in the pool, even if they are idle,
* unless allowCoreThreadTimeOut is set
* @throws IllegalArgumentException if corePoolSize < 0
*/
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
/**
* Creates a new ScheduledThreadPoolExecutor with the given initial parameters.
* @param corePoolSize the number of threads to keep in the pool, even if they are idle,
* unless allowCoreThreadTimeOut is set
* @param threadFactory the factory to use when the executor creates a new thread
* @throws IllegalArgumentException if corePoolSize < 0
* @throws NullPointerException if threadFactory is null
*/
public ScheduledThreadPoolExecutor(int corePoolSize,
ThreadFactory threadFactory) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue(), threadFactory);
}
Pourquoi les métriques du pool de threads Tomcat ne correspondent-elles pas aux attentes ?
Si plusieurs métriques (nombre maximal de threads, nombre de threads actifs, nombre de threads principaux) diffèrent toutes des valeurs attendues, vérifiez si l'application expose les services Tomcat sur plusieurs ports. Par exemple, Spring Actuator ouvre un port supplémentaire pour les métriques. Dans ce cas, ARMS peut fusionner les métriques de plusieurs pools de threads en raison de la convergence des dimensions.
Pour résoudre ce problème, mettez à niveau vers la version 4.1.10 ou ultérieure de la sonde. Ensuite, accédez à Application Configuration > Custom Configuration > Pooling Monitoring Configuration , et définissez Thread Pool Thread Name Pattern Extraction Strategy sur Replace trailing digits with *.
Pourquoi n'y a-t-il aucune donnée pour un pool de threads ou de connexions avant une certaine heure ?
Cela se produit lorsqu'une tâche planifiée crée le pool. Les données n'apparaissent qu'après l'initialisation du pool par la tâche. Les métriques basées sur le trafic, telles que le nombre de requêtes API, se comportent de manière similaire.
Pourquoi n'y a-t-il aucune donnée pour les pools de connexions HttpClient ?
À partir de la version 4.x de la sonde ARMS, la surveillance des pools de connexions pour OkHttp3 et Apache HttpClient n'est plus prise en charge. Ces frameworks créent un pool de connexions distinct pour chaque domaine externe. Lorsqu'un grand nombre de domaines sont impliqués, cela entraîne une surcharge excessive et des risques de stabilité.
Pourquoi n'y a-t-il aucune donnée de surveillance des conteneurs après l'intégration d'une application ACK ?
ARMS affiche les données de surveillance des conteneurs uniquement pour les ressources appartenant au même compte Alibaba Cloud. Vérifiez que le compte utilisé pour créer le cluster ACK correspond au compte utilisé pour l'intégration ARMS.
Pourquoi le taux d'ouverture des handles de fichiers est-il non nul, mais le nombre de handles de fichiers est-il nul ?
Cela se produit sur JDK 9 ou ultérieur lors de l'utilisation de la version 3.x de la sonde ARMS. Mettez à niveau vers la version 4.2.2 ou ultérieure de la sonde. Consultez la section Mettre à niveau l'agent ARMS.
Pourquoi l'utilisation de la mémoire physique du processus JVM diffère-t-elle considérablement de l'utilisation de la mémoire heap de surveillance JVM ?
Le processus JVM utilise probablement une quantité importante de mémoire hors heap, qu'ARMS ne surveille pas entièrement. Pour plus de détails sur les zones de mémoire JVM couvertes par ARMS, consultez la section Détails de la mémoire de surveillance JVM.
Pourquoi Druid affiche-t-il plus de connexions inactives que le paramètre maximal de connexions inactives ?
Le paramètre MaxIdle dans Druid existe uniquement pour la compatibilité de migration avec DBCP. Il n'a aucun effet fonctionnel.
Pourquoi n'y a-t-il aucune donnée après la mise à niveau de certaines instances vers la dernière version de la sonde ?
Lors de la mise à niveau depuis une version de la sonde antérieure à 4,1.x, toutes les instances doivent être mises à niveau. La page s'adapte automatiquement une fois que toutes les instances exécutent la même version.