Gestion des problèmes de performances Jenkin dans l'environnement K8S
Cet article est une suite de "Gestion des problèmes de performances Jenkin dans l'environnement K8S" . L'article précédent a résolu le problème de performances du nœud maître dans le cluster Jenkins. Les problèmes de performances des pods déterminent la vitesse de la tâche ou même le succès ou l'échec;
Informations environnementales
- Matériel: trois serveurs CentOS 7.7
- gouverneurs: 1,15
- JDK: 1.8.0_141
- maven : 3.6.3
Pour plus de détails sur le déploiement et l'utilisation de Jenkins dans un environnement K8S, veuillez vous référer à "Helm Deployment and Experience Jenkins"
Problèmes de performances du nœud de tâche
Les programmeurs Java utilisent souvent Jenkins pour compiler et générer des projets Maven. Si les paramètres de génération utilisent la configuration par défaut, des problèmes de performances sont susceptibles de se produire. Ensuite, utilisez des projets open source pour reproduire ce problème:
- Lors de la configuration du plug-in Jenkins kubernetes, la mémoire allouée au module de tâches est 1G, comme indiqué ci-dessous:
- Ensuite, téléchargez le code source Flink (version 1.8.3-rc3) depuis GitHub, puis compilez et générez. Le code source du pipeline correspondant à cette tâche est le suivant:
pipeline {
agent {
label 'my-jenkins-jenkins-slave'
}
tools {
maven 'mvn-3.6.3'
}
stages {
stage('Checkout') {
steps {
echo '从GitHub下载flink工程的源码(1.8.3-rc3归档包)'
sh 'wget https://codeload.github.com/apache/flink/tar.gz/release-1.8.3-rc3'
echo '下载结束,解压归档包'
sh 'tar -zxf release-1.8.3-rc3'
}
}
stage('Build') {
steps {
echo '开始编译构建'
sh 'cd flink-release-1.8.3-rc3 && mvn clean package -U -s /home/jenkins/settings/settings.xml'
}
}
}
}
- Dans le processus d'exécution de la tâche de génération, cliquez sur la boule grise dans la zone rouge ci-dessous pour accéder à la page de journal du pod qui a exécuté la tâche:
- La figure suivante est la page du journal du pod. La zone rouge indique que la tâche a une exception (cette fois, un scénario de test unitaire est en cours d'exécution)
- Comme indiqué dans l'encadré rouge ci-dessous, le pod effectuant la tâche s'affiche comme hors ligne:
- À ce stade, connectez-vous à l'environnement kubernetes et vérifiez l'état du pod. Comme indiqué dans l'encadré rouge ci-dessous, le statut du pod de la tâche est OOMKilled. Il semble qu'une mémoire insuffisante a provoqué la destruction du podl:
Le premier ajustement (paramètre K8S)
- Étant donné que la mémoire du pod est trop petite et que la tâche échoue, vous pouvez ajuster la mémoire du pod dans la page des paramètres de Jenkins. Comme le montre la figure suivante, cette fois définie sur 6G. Veillez à ne pas dépasser la configuration matérielle de la machine hôte:
- Répétez la tâche ci-dessus une fois, cette fois la mémoire est suffisante et la construction est réussie;
Observer
Comme cette tâche consiste principalement à effectuer la compilation et la construction de maven, il est nécessaire de comprendre l'utilisation de la mémoire du processus maven:
- Dans le processus d'exécution de la tâche, recherchez le conteneur Docker correspondant au pod (commande kubectl describe pod xxx ), l'ID est 22484d8b1e56
- Exécution docker exec 22484d8b1e56 JPS obtenir Maven ID 87 (le nom du lanceur), comme indiqué ci - dessous:
- L'exécution de docker exec 22484d8b1e56 jmap -heap 87 peut voir la mémoire JVM du processus maven. Comme le montre la figure suivante, on peut voir que la mémoire réelle utilisée par maven n'est que de la 3G:
- À l'heure actuelle, le Pod possède une mémoire 6G, et vous pouvez donner plus de mémoire au processus maven grâce aux réglages des paramètres;
Deuxième ajustement (paramètres JVM)
Ensuite, essayez de définir les paramètres de mémoire du processus maven. Ici, essayez de diviser la majeure partie de la mémoire à l'ancienne génération :
- Comme indiqué ci-dessous, accédez à la page des paramètres:
- Comme indiqué dans la figure ci-dessous, recherchez les modèles de pod , ajoutez la variable d'environnement, la clé est MAVEN_OPTS , la valeur est -Xms5632m -Xmx5632m -Xmn512m -Xss256k , car la mémoire totale du pod est 6G, donc après ce paramètre, la mémoire système du pod n'est que de 512 m , le reste La mémoire de 5632 m est entièrement allouée au processus maven, et la jeune génération du processus maven ne fait que 512 m, laissant toute la mémoire à l'ancienne génération:
- Après avoir enregistré les paramètres, exécutez à nouveau la tâche, recherchez d'abord le conteneur Docker correspondant au pod de tâches, puis utilisez la commande jmap -heap pour afficher la mémoire du processus maven. Comme le montre la figure ci-dessous, 5632 m de mémoire sont tous alloués au processus maven et la jeune génération est également contrôlée à 512 m:
- La figure suivante représente l'exécution de la commande jstat pour afficher la situation GC du processus maven. La boîte rouge est le nombre de YGC et la boîte bleue est le nombre de FGC. En raison de la petite mémoire de la jeune génération, la fréquence de YGC est fréquente, mais le nombre de FGC n'est pas important:
- L' exception StackOverflow s'est également produite pendant le processus de génération . Comme le montre la figure suivante, la solution consiste toujours à ajuster le paramètre MAVEN_OPTS , la valeur est -Xms5632m -Xmx5632m -Xmn512m -Xss512k , ce qui revient à doubler la mémoire de la pile de threads:
- Les réglages ci-dessus ne sont pas optimaux, mais vérifiez que le réglage des paramètres de mémoire MAVEN peut prendre effet;
- Grâce à la page des paramètres Jenkins, les paramètres personnalisés du pod de tâches et le processus maven correspondant ont été effectués. J'espère que cet article pourra vous fournir des références pour vous aider à effectuer des ajustements et une optimisation ciblés en fonction des caractéristiques du projet;