Ce projet Spring Boot permet de simuler différents problèmes de performance et de les analyser à l'aide de JProfiler.
- Identifier et diagnostiquer des problèmes de performance courants.
- Utiliser JProfiler pour analyser les métriques de performance comme l'utilisation CPU, mémoire et les threads.
Le projet inclut les scénarios suivants :
- Problèmes de requêtes lentes (N+1 Problem) : Mauvaise gestion des requêtes dans la base de données.
- Fuite mémoire : Objets non libérés, provoquant une utilisation mémoire croissante.
- Synchronisation excessive : Verrous inutiles ralentissant les threads.
- Calculs intensifs : Traitement lourd consommant beaucoup de CPU.
- Appels réseau lents : Requêtes HTTP bloquantes.
- Cache mal configuré : Mauvaise gestion des données en cache.
- Thread pool sous-dimensionné : Surcharge des threads avec un pool trop petit.
- JDK 17+
- Maven
- JProfiler (dernière version)
- Un environnement Spring Boot configuré.
-
Clonez ce dépôt :
git clone https://github.com/votre-utilisateur/spring-performance-simulator.git cd spring-performance-simulator -
Compilez le projet avec Maven :
mvn clean install
-
Lancez l'application :
java -agentpath:/chemin/vers/jprofiler/bin/linux-x64/libjprofilerti.so=port=8849 -jar target/performance-simulator-0.0.1-SNAPSHOT.jar
(Adaptez le chemin de
libjprofilerti.soselon votre environnement)
- Attachez JProfiler à l'application via l'agent en ligne de commande ou à partir de votre IDE (IntelliJ/Visual Studio Code).
- Activez les analyses suivantes dans JProfiler :
- CPU Profiling : Pour mesurer l'utilisation du CPU.
- Heap Dump Analysis : Pour surveiller l'utilisation mémoire.
- Thread States : Pour analyser les threads et les verrous.
Chaque endpoint simule un problème de performance spécifique. Utilisez des outils comme curl ou Postman pour tester chaque scénario :
| Problème | Endpoint |
|---|---|
| Requêtes lentes | GET /performance/database |
| Fuite mémoire | GET /performance/memory-leak |
| Synchronisation excessive | GET /performance/synchronized |
| Calculs intensifs | GET /performance/computation |
| Appels réseau lents | GET /performance/http |
| Cache mal configuré | GET /performance/cache |
| Thread pool sous-dimensionné | GET /performance/thread-pool |
Exemple de commande curl :
curl http://localhost:8080/performance/database- Charge CPU : Analysez les calculs intensifs dans JProfiler avec Hot Spots.
- Temps d’exécution : Vérifiez les threads bloqués dans les sections Thread States et Monitor Usage.
- Allocation mémoire : Surveillez les fuites ou mauvaises allocations via un Heap Dump.
L'AB Test avec Apache Bench (ab) peut être utile pour évaluer les performances de certains des problèmes simulés, mais il a des limitations dans ce contexte spécifique. Voici une analyse de son utilité :
-
Problème de requêtes lentes (N+1 Problem)
- Pourquoi utile :
Apache Bench permet de générer des charges simulées sur l'endpoint/performance/database. Cela permet de vérifier l'impact de requêtes non optimisées sous une charge élevée. - Comment tester :
ab -n 1000 -c 10 http://localhost:8080/performance/database
- -n 1000 : 1000 requêtes totales.
- -c 10 : 10 requêtes simultanées.
- Pourquoi utile :
-
Problème de cache mal configuré
- Pourquoi utile :
Vous pouvez simuler un nombre important d'appels sur/performance/cachepour évaluer comment le cache se dégrade sous une charge. - Comment tester :
ab -n 500 -c 5 http://localhost:8080/performance/cache
- Pourquoi utile :
-
Problème d'appels HTTP lents
- Pourquoi utile :
Apache Bench peut reproduire un grand nombre d'appels pour voir comment les temps de réponse s'accumulent à cause des latences réseaux simulées. - Comment tester :
ab -n 200 -c 5 http://localhost:8080/performance/http
- Pourquoi utile :
-
Problème de fuite mémoire
- Pourquoi moins utile :
Les fuites mémoire ne sont pas directement visibles dans les résultats d'Apache Bench (temps de réponse ou taux d'erreur). Il est préférable d'utiliser un outil comme JProfiler ou VisualVM pour surveiller l'utilisation de la mémoire.
- Pourquoi moins utile :
-
Problème de synchronisation excessive
- Pourquoi moins utile :
abne montre pas les problèmes de contention des threads ou des verrous. Ces problèmes sont mieux analysés avec des outils comme JProfiler (section Thread Locking).
- Pourquoi moins utile :
-
Problème de calculs intensifs
- Pourquoi moins utile :
Les calculs CPU intensifs peuvent augmenter le temps de réponse, maisabne fournit pas de détails sur la charge CPU. JProfiler (ou une commande commetop/htop) est mieux adapté ici.
- Pourquoi moins utile :
-
Problème de thread pool sous-dimensionné
- Pourquoi moins utile :
abpeut mettre en évidence des temps de réponse plus longs en raison de la saturation du pool de threads, mais il ne fournit pas de détails sur le comportement interne du thread pool. JProfiler est nécessaire pour visualiser la saturation dans la gestion des tâches.
- Pourquoi moins utile :
-
abest complémentaire à JProfiler :- Il est utile pour générer une charge simulée et mesurer les temps de réponse, les erreurs et le débit.
- Les résultats de
abpeuvent déclencher une analyse plus approfondie dans JProfiler.
-
Utilisation recommandée :
- Lancez un test de charge avec
ab. - Surveillez simultanément avec JProfiler (CPU, mémoire, threads, I/O).
- Corrélez les résultats pour identifier et comprendre les problèmes de performance.
- Lancez un test de charge avec
Par exemple, pour /performance/cache, vous pourriez observer une augmentation de l’utilisation mémoire dans JProfiler pendant le test ab.
).