Guide de Performance Gatling
Guide de Performance Gatling
Installation
| Plateforme | Commande |
|---|---|
| Ubuntu/Debian | wget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.10.3/gatling-charts-highcharts-bundle-3.10.3-bundle.zip && unzip gatling-charts-highcharts-bundle-3.10.3-bundle.zip && sudo mv gatling-charts-highcharts-bundle-3.10.3 /opt/gatling |
| macOS (Homebrew) | brew install gatling |
| Windows (Manual) | Download from Maven Central, extract to C:\gatling, add bin directory to PATH |
| SDKMAN (Linux/Mac) | sdk install gatling |
| Docker | docker pull denvazh/gatling:latest |
| Maven Plugin | Add io.gatling:gatling-maven-plugin:4.6.0 to pom.xml |
| Gradle Plugin | Add id 'io.gatling.gradle' version '3.10.3' to build.gradle |
# Install Java 11+ (required)
sudo apt install openjdk-11-jdk -y # Ubuntu/Debian
brew install openjdk@11 # macOS
# Verify Java installation
java -version
Commandes de Base
| Commande | Description |
|---|---|
gatling.sh | Lancer le mode interactif pour sélectionner et exécuter des simulations |
gatling.sh -s com.example.MySimulation | Exécuter une classe de simulation spécifique |
gatling.bat -s com.example.MySimulation | Exécuter la simulation sur Windows |
gatling.sh --help | Afficher l’aide et les options disponibles |
gatling.sh --version | Afficher la version de Gatling |
recorder.sh | Lancez l’interface graphique de Gatling Recorder pour enregistrer des sessions de navigateur |
recorder.bat | Lancer Recorder sur Windows |
gatling.sh -ro simulation-folder-name | Générer des rapports à partir des journaux de simulation existants |
gatling.sh -s MySimulation -nr | Exécuter la simulation sans générer de rapports |
gatling.sh -s MySimulation -rd "Test description" | Exécuter avec une description personnalisée pour les rapports |
mvn gatling:test | Exécuter tous les tests Gatling à l’aide de Maven |
mvn gatling:test -Dgatling.simulationClass=MySimulation | Exécuter une simulation spécifique avec Maven |
gradle gatlingRun | Exécuter tous les tests Gatling à l’aide de Gradle |
gradle gatlingRun-com.example.MySimulation | Exécuter une simulation spécifique avec Gradle |
ls user-files/simulations/ | Lister les fichiers de simulation disponibles |
Utilisation Avancée
| Commande | Description |
|---|---|
gatling.sh -s MySimulation -rf /custom/results | Exécuter avec un dossier de résultats personnalisé |
gatling.sh -s MySimulation -bf /custom/binaries | Exécuter avec un répertoire de binaires personnalisé |
gatling.sh -s MySimulation -rsf /custom/resources | Exécuter avec un répertoire de ressources personnalisé |
gatling.sh -s MySimulation -df /custom/data | Exécuter avec un répertoire de données personnalisé |
gatling.sh -s MySimulation -cf /path/to/gatling.conf | Exécuter avec un fichier de configuration personnalisé |
JAVA_OPTS="-Xms2G -Xmx4G" gatling.sh -s MySimulation | Exécuter avec des paramètres de mémoire JVM personnalisés |
gatling.sh -s MySimulation -D baseUrl=https://api.example.com | Transmettre les propriétés système à la simulation |
gatling.sh -s MySimulation -D users=100 -D duration=300 | Passer plusieurs propriétés système |
mvn gatling:test -Dgatling.jvmArgs="-Xms2G -Xmx4G" | Maven exécuté avec des arguments JVM personnalisés |
docker run -v $(pwd)/user-files:/opt/gatling/user-files denvazh/gatling | Exécuter Gatling dans un conteneur Docker |
gatling.sh -s Sim1 && gatling.sh -s Sim2 | Exécuter plusieurs simulations séquentiellement |
for sim in Sim1 Sim2; do gatling.sh -s $sim -nr; done | Exécuter des simulations par lots sans rapports |
mvn clean gatling:test -DbaseUrl=https://prod.example.com | Maven run avec URL spécifique à l’environnement |
gradle gatlingRun -Dusers=500 -Dduration=600 | Gradle run avec des paramètres dynamiques |
| `gatling.sh -s MySimulation 2>&1 | tee test.log` |
Configuration
Fichier de Configuration Principal (gatling.conf)
gatling {
core {
# Output directory for results
outputDirectoryBaseName = "simulation"
# Encoding for files
encoding = "utf-8"
# Timeout for requests
timeOut = 60000
# Directory for simulation classes
simulationClass = ""
}
http {
# Enable/disable SSL/TLS
enableGA = false
# Connection timeout
connectTimeout = 10000
# Request timeout
requestTimeout = 60000
# Max connections per host
maxConnectionsPerHost = 6
}
data {
# Directory for feeder files
file {
bufferSize = 256
}
}
charting {
# Indicators percentiles
indicators {
lowerBound = 800
higherBound = 1200
percentile1 = 50
percentile2 = 75
percentile3 = 95
percentile4 = 99
}
}
}
Configuration des Propriétés Système
# Set via command line
gatling.sh -s MySimulation \
-Dgatling.core.outputDirectoryBaseName=custom-output \
-Dgatling.http.requestTimeout=30000 \
-Dgatling.charting.indicators.percentile1=90
Configuration Maven (pom.xml)
<plugin>
<groupId>io.gatling</groupId>
<artifactId>gatling-maven-plugin</artifactId>
<version>4.6.0</version>
<configuration>
<simulationClass>com.example.MySimulation</simulationClass>
<jvmArgs>
<jvmArg>-Xms2G</jvmArg>
<jvmArg>-Xmx4G</jvmArg>
<jvmArg>-XX:+UseG1GC</jvmArg>
</jvmArgs>
<systemProperties>
<baseUrl>https://api.example.com</baseUrl>
<users>100</users>
</systemProperties>
</configuration>
</plugin>
Configuration Gradle (build.gradle)
gatling {
simulations = {
include 'com/example/**/*Simulation.scala'
}
jvmArgs = ['-Xms2G', '-Xmx4G', '-XX:+UseG1GC']
systemProperties = [
'baseUrl': 'https://api.example.com',
'users': '100'
]
}
Cas d’Utilisation Courants
Cas d’Utilisation 1 : Test de Charge API de Base
# Create simulation file
cat > user-files/simulations/BasicApiTest.scala << 'EOF'
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BasicApiTest extends Simulation {
val httpProtocol = http
.baseUrl("https://api.example.com")
.acceptHeader("application/json")
.contentTypeHeader("application/json")
val scn = scenario("Basic API Test")
.exec(http("Get Users")
.get("/users")
.check(status.is(200)))
.pause(1)
setUp(
scn.inject(
rampUsers(100) during (60 seconds)
)
).protocols(httpProtocol)
}
EOF
# Run the test
gatling.sh -s BasicApiTest
# View results
open results/basicapitest-*/index.html # macOS
xdg-open results/basicapitest-*/index.html # Linux
Cas d’Utilisation 2 : Test de Stress avec Charge Progressive
# Create stress test simulation
cat > user-files/simulations/StressTest.scala << 'EOF'
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class StressTest extends Simulation {
val httpProtocol = http.baseUrl("https://api.example.com")
val scn = scenario("Stress Test")
.exec(http("Heavy Endpoint")
.post("/api/process")
.body(StringBody("""{"data": "test"}"""))
.check(status.is(200)))
setUp(
scn.inject(
nothingFor(5 seconds),
atOnceUsers(10),
rampUsers(50) during (30 seconds),
constantUsersPerSec(20) during (60 seconds),
rampUsersPerSec(20) to 50 during (60 seconds)
)
).protocols(httpProtocol)
.maxDuration(5 minutes)
.assertions(
global.responseTime.max.lt(5000),
global.successfulRequests.percent.gt(95)
)
}
EOF
# Run with custom memory settings
JAVA_OPTS="-Xms4G -Xmx8G" gatling.sh -s StressTest
Cas d’Utilisation 3 : Intégration CI/CD avec Maven
# Add to Jenkins/GitLab CI pipeline
mvn clean gatling:test \
-Dgatling.simulationClass=com.example.PerformanceTest \
-DbaseUrl=${TEST_URL} \
-Dusers=${CONCURRENT_USERS} \
-Dduration=${TEST_DURATION}
# Check exit code for pass/fail
if [ $? -eq 0 ]; then
echo "Performance test passed"
else
echo "Performance test failed"
exit 1
fi
# Archive results
tar -czf gatling-results.tar.gz target/gatling/
Cas d’Utilisation 4 : Enregistrement de Session de Navigateur
# Start recorder
recorder.sh
# Configure in GUI:
# - Listening Port: 8000
# - Output folder: user-files/simulations
# - Class name: RecordedSimulation
# Configure browser proxy to localhost:8000
# Perform actions in browser
# Stop recording
# Run recorded simulation
gatling.sh -s RecordedSimulation
Cas d’Utilisation 5 : Test Piloté par les Données avec Feeders
# Create CSV data file
cat > user-files/resources/users.csv << 'EOF'
username,password
user1,pass1
user2,pass2
user3,pass3
EOF
# Create simulation with feeder
cat > user-files/simulations/DataDrivenTest.scala << 'EOF'
import io.gatling.core.Predef._
import io.gatling.http.Predef._
class DataDrivenTest extends Simulation {
val httpProtocol = http.baseUrl("https://api.example.com")
val feeder = csv("users.csv").circular
val scn = scenario("Login Test")
.feed(feeder)
.exec(http("Login")
.post("/login")
.body(StringBody("""{"username":"${username}","password":"${password}"}"""))
.check(status.is(200)))
setUp(scn.inject(atOnceUsers(10))).protocols(httpProtocol)
}
EOF
# Run test
gatling.sh -s DataDrivenTest
Meilleures Pratiques
-
Utiliser des Profils de Charge Appropriés : Commencez par une montée en charge progressive (
rampUsers) plutôt queatOnceUserspour simuler des modèles de trafic réalistes et éviter de surcharger immédiatement le système -
Définir des Délais d’Attente Réalistes : Configurez les délais de connexion et de requête en fonction de vos SLA (par exemple,
requestTimeout = 30000pendant 30 secondes) pour détecter précocement les problèmes de performance -
Implémenter des Assertions Appropriées : Ajouter des assertions pour faire échouer automatiquement les tests lorsque les performances se dégradent (
global.responseTime.percentile3.lt(2000)garantit le 95e percentile sous 2 secondes) -
Utiliser des Feeders pour des Données Dynamiques : Exploiter CSV, JSON, ou des feeders personnalisés au lieu de coder en dur les données de test pour simuler le comportement réel des utilisateurs et éviter les hits de cache
-
Allouer Suffisamment de Mémoire : Pour les tests à grande échelle, augmenter la taille du tas JVM (
-Xms4G -Xmx8G) pour éviter les erreurs OutOfMemory et assurer une exécution fluide -
Surveiller les Ressources Système : Suivre l’utilisation du CPU, de la mémoire et du réseau sur le générateur de charge et le système cible pendant les tests pour identifier précisément les goulots d’étranglement
-
Exécuter les Tests depuis un Environnement Similaire à la Production : Effectuer des tests de charge depuis une infrastructure similaire à la production (latence réseau, bande passante) pour des résultats précis
-
Contrôler les Versions de vos Simulations : Stocker le code de simulation dans Git à côté du code d’application pour suivre les modifications et permettre la collaboration
-
Séparer les Préoccupations avec des Scénarios : Décomposer les tests complexes en plusieurs scénarios et chaînes pour une meilleure maintenabilité et réutilisabilité
-
Analyser Minutieusement les Rapports : Ne pas se contenter de vérifier les temps de réponse — examiner la distribution des requêtes, les taux d’erreur et les percentiles de temps de réponse pour comprendre l’image complète des performances
Dépannage
| Problème | Solution |
|---|---|
| OutOfMemoryError during test execution | Increase JVM heap size: JAVA_OPTS="-Xms4G -Xmx8G" gatling.sh -s MySimulation or reduce concurrent users |
| ”Simulation class not found” error | Ensure simulation is in user-files/simulations/ and class name matches file name. Recompile if needed: mvn clean compile |
| Connection timeout errors | Increase timeout in gatling.conf: gatling.http.connectTimeout = 30000 or check network connectivity to target system |
| SSL/TLS certificate errors | Disable certificate validation in simulation: .disableCaching.disableWarmUp.shareConnections.silentResources or add certificate to Java keystore |
| Recorder proxy not working | Vérifiez les paramètres de proxy du navigateur (localhost:8000), assurez-vous que l’enregistreur est en cours d’exécution, vérifiez qu’aucun autre proxy/VPN n’interfère |
| Reports not generating | Vérifier l’espace disque, vérifier les permissions d’écriture sur le répertoire des résultats, s’assurer que le test s’est terminé avec succès sans plantages |
| High response times on load generator | Le load generator est surchargé—réduire les utilisateurs concurrents, augmenter les ressources, ou utiliser des tests distribués avec plusieurs générateurs |
| ”Too many open files” error (Linux) | Increase file descriptor limit: ulimit -n 65536 before running Gatling, or add to /etc/security/limits.conf |
| Simulations compile but don’t run | Vérifier les erreurs de syntaxe dans le code Scala, vérifier que tous les imports sont corrects, s’assurer de la compatibilité de la version de Gatling |
| Maven/Gradle plugin not found | Update plugin version in pom.xml/build.gradle, run mvn clean install or gradle clean build, check Maven Central connectivity |
| Inconsistent results between runs | Préchauffer le système cible en premier, assurer un environnement de test cohérent, vérifier les facteurs externes (autre trafic, tâches programmées) |
| WebSocket connection failures | Verify WebSocket protocol in simulation: .ws("Connect").connect("/socket"), check target server WebSocket support |
| Feeder file not found | Place CSV/JSON files in user-files/resources/, use relative path: csv("data.csv") not absolute path |
| Docker container exits immediately | Mount volumes correctly: -v $(pwd)/user-files:/opt/gatling/user-files, ensure simulation files exist in mounted directory |
Référence Rapide : Profils d’Injection de Charge
// Immediate load
atOnceUsers(100)
// Gradual ramp-up
rampUsers(100) during (60 seconds)
// Constant rate
constantUsersPerSec(20) during (5 minutes)
// Gradual rate increase
rampUsersPerSec(10) to 50 during (2 minutes)
// Staircase pattern
incrementUsersPerSec(5)
.times(5)
.eachLevelLasting(30 seconds)
.separatedByRampsLasting(10 seconds)
.startingFrom(10)
// Complex scenario
nothingFor(5 seconds),
atOnceUsers(10),
rampUsers(50) during (30 seconds),
constantUsersPerSec(20) during (60 seconds)
Emplacements de Fichiers Utiles
| Chemin | Description |
|---|---|
user-files/simulations/ | Fichiers Scala de simulation |
user-files/resources/ | Fichiers de données Feeder (CSV, JSON) |
user-files/bodies/ | Modèles de corps de requête |
results/ | Rapports HTML générés |
conf/gatling.conf | Fichier de configuration principal |
conf/logback.xml | Configuration de logging |
target/gatling/ | Sortie de build Maven et rapports |